Einzeiler, um zu bestimmen, wer in Stein, Papier, Schere gewinnt

Lesezeit: 3 Minuten

Benutzer-Avatar
asmeurer

Also schreibe ich ein einfaches Stein, Papier, Schere-Spiel in C (es ist übrigens für eine Aufgabe, obwohl die Hauptsache darin besteht, Steckdosen zu lernen. Außerdem vermute ich, dass es fällig sein wird, bevor ich eine gute Antwort bekomme). Ich habe es als Stein = 0, Papier = 1 und Schere = 2 eingerichtet. Gibt es einen einfachen Einzeiler, um festzustellen, wer gewinnt? Ich habe versucht, damit auf Papier herumzuspielen, aber ich konnte keine Muster herausfinden.

  • Wenn diese Frage nicht den Sockets-Teil der Zuweisung betrifft, könnte sie leicht in eine umgewandelt werden [code-golf].

    – Knallt

    8. Mai 2010 um 20:00 Uhr

  • 6 Minuten bis zu einer guten Antwort, wann ist Ihre Aufgabe fällig?

    – Georg Scholly

    8. Mai 2010 um 20:04 Uhr

  • Nur als Hinweis, ich würde diese Werte (Stein, Papier, Schere, Dynamit) im Allgemeinen Zeichenfolgen oder Zeichen zuweisen. Im Allgemeinen ist es eine schlechte Praxis, sie zu einer Nummer zu machen, da Sie sie logischerweise nie hinzufügen möchten. Dies ist nicht wichtig für Aufgabenprobleme, aber gut, um sich daran zu gewöhnen, damit Sie bei größeren Problemen nicht in den Hintern treten.

    – Sixtyfooter Typ

    8. Mai 2010 um 20:31 Uhr

  • @sixtyfootersdude: Aufzählungskonstanten sind sehr nützlich, auch wenn Sie keine Arithmetik damit machen. Zeichenfolgen können problematisch sein, da Tippfehler in ihnen bei der Kompilierung nicht abgefangen werden.

    – jamesdlin

    8. Mai 2010 um 20:46 Uhr


  • @sixtyfootersdude: Der beste (sprachunabhängige) Weg wäre wahrscheinlich, ROCK = 0, PAPER = 1 und SCISSORS = 2 zu definieren und dann immer diese Konstanten zu verwenden.

    – Andreas Rejbrand

    8. Mai 2010 um 20:53 Uhr

Benutzer-Avatar
zwischenjay

winner = (3 + player1 - player2) % 3;

Dies ergibt 1, wenn Spieler 1 gewinnt, 2, wenn Spieler 2 gewinnt, 0 für ein Unentschieden.

Erläuterung: In der Reihenfolge Rock=0, Paper=1, Scissors=2, besiegt jeder Gegenstand den vorhergehenden. Dies gilt auch dann, wenn wir die Sequenz als Umbruch behandeln (das heißt, das letzte Element geht dem ersten voraus).

Um dies mathematischer auszudrücken, gilt für jedes Element X:

  • X wird besiegt von (X+1) % 3.
  • X besiegt (X+2) % 3.

Daraus lässt sich das zeigen (3+X-Y) % 3 ist 1, wenn X Y besiegt, oder 2, wenn Y X besiegt.

Das Hinzufügen von 3 ist erforderlich, um zu erzwingen, dass das Ergebnis nicht negativ ist: Der Modulus einer negativen Zahl ist in C99 negativ oder null und in C89 implementierungsabhängig.

  • Das ist genial, aber so ein Einzeiler braucht mindestens 3 Zeilen Dokumentation.

    – Georg Scholly

    8. Mai 2010 um 20:08 Uhr


  • +1 Setzen Sie mich für alle Ewigkeit in einen Raum mit zwei Affen und drei Schreibmaschinen und wir würden niemals darauf kommen !!!

    – Robben_Ford_Fan_boy

    8. Mai 2010 um 20:16 Uhr

  • Verdammt! Ich dachte, es könnte ein Modul sein, aber ich machte einen Fehler, als ich die Tabelle aufschrieb, wer gewinnt, und es sah nicht so aus. Wie auch immer, +1 für den Tipp, 3 hinzuzufügen, von dem ich nichts gewusst hätte.

    – asmeurer

    8. Mai 2010 um 20:55 Uhr

  • @akf: Laut der Frage ist dies nur ein kleiner Teil der Hausaufgaben, also ist es nicht so, als hätte ich jemandes Aufgabe für sie gelöst. Außerdem bezweifle ich, dass die Aufgabe es tatsächlich erforderte, dies in einem Einzeiler zu tun.

    – zwischenjay

    10. Mai 2010 um 17:37 Uhr

  • @afk, wir dürfen Snippets aus anderen Quellen verwenden, solange wir sie beziehen. Und ja, es war bei weitem nicht der schwierigste Teil der Aufgabe! Außerdem habe ich gerade festgestellt, dass rand() % 3 gleichwertig gewesen wäre (dh es spielt keine Rolle, ob der Computer Stein, Papier oder Schere wählt oder ob er nur zufällig Gewinn, Niederlage oder Unentschieden auswählt :).

    – asmeurer

    11. Mai 2010 um 3:19 Uhr


1344730cookie-checkEinzeiler, um zu bestimmen, wer in Stein, Papier, Schere gewinnt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy