Es ist ein Drei-Spieler-Spiel, mit einer Hand zu spielen.
Gleichzeitig zeigt jeder Spieler seine Hand mit 0 bis 5 ausgestreckten Fingern.
Wenn alle Spieler dieselbe Art von (gerader oder ungerader) Zahl zeigen, gibt es keinen Gewinner. Ansonsten gewinnt der Spieler, der eine andere Art zeigt, die beiden anderen.
P l a y e r s
A B C Winner
Even Even Even No winner
Odd Odd Odd No winner
Even Odd Odd Player A
Odd Even Even Player A
Even Odd Even Player B
Odd Even Odd Player B
Odd Odd Even Player C
Even Even Odd Player C
Das angeforderte Tool kann Argumente (3 numerische Argumente zwischen 0 und 5) oder STDIN (3 Werte durch Zeile, durch Leerzeichen getrennt) verwenden.
Die Eingabe muss nicht überprüft werden: Eine unregelmäßige Eingabe kann zu einer unerwarteten Ausgabe führen.
Argumente oder Werte in der Zeile werden von links nach rechts von Spieler A bis Spieler C angegeben .
Ausgang muss nur enthalten A
, B
oder C
(aktiviert) oder die Zeichenfolgeno one
(in Kleinbuchstaben, mit einem normalen Raum).
Das Tool kann nur einmal oder als Filter für alle Eingabezeilen verwendet werden.
Kürzester Code-Gewinn.
Antworten:
APL (
3430)Erläuterung:
2|⎕
: eine Eingabezeile lesen, den Mod-2 jeder Zahl nehmen (dh eine Liste angeben1 0 1
)∘.=⍨
: Vergleiche jedes Element im Vektor mit jedem Element im Vektor, um eine Matrix zu erhalten+/
: summiere die Zeilen der Matrix und gebe für jedes Element an, wie viele Elemente es enthält. Wenn es zwei gleiche und eine unterschiedliche gab, haben wir jetzt einen Vektor wie2 1 2
den, der1
angibt, wer unterschiedlich war. Wenn sie alle gleich wären, bekommen wir3 3 3
.1⍳⍨
: Finden Sie die Position des1
. Wenn1
dies nicht der Fall ist , gibt dies in diesem Fall einen Wert mehr als die Länge des Vektors zurück4
.⊃'ABC',⊂'no one'
: zeigt den String am angegebenen Index an.quelle
Mathematica,
45 43 4241 ZeichenBeispiel:
Eine andere Lösung mit
4342 Zeichen:quelle
Powershell, 65
quelle
Befunge-98,
61 5045 ZeichenVerwendet Fors 'geschickten Ausdruck, um noch ein paar weitere Charaktere abzuschaben. Jetzt einzeilig (dh Unefunge-kompatibel)! Liest, bis ein Spiel gewonnen ist;
@
am Ende für ein One-Shot-Programm hinzufügen .Behandelt Eingabemod 2 wie bei meiner JS-Antwort als Binärzahl, verlässt sich dann auf die Suche nach AC und fällt bei Überschreitung auf 'no one' zurück (indem geprüft wird, ob das Zeichen ≥'A ist, was mir erlaubt) um Code in der Nähe als Daten zu verwenden: D).Eine Variation, die eine Eingabezeile liest, eine Ausgabe erzeugt, eine neue Eingabezeile liest usw., bis ein Spiel entschieden ist (dh nicht "niemand"):
quelle
APL, 30
Wenn ich Systemvariablen durch Konfiguration ändern darf, können 2 Zeichen abgeschnitten werden. (Insbesondere Ändern des Indexursprungs
⎕IO
auf 0)Das Entscheidende
Wenn wir alle Gewinnchancen auf die gleiche Weise darstellen und alle Gewinnchancen auf die gleiche Weise, kann eine paarweise Gleichheitsoperation alle 4 Fälle unterscheiden:
0 0
für B Siege,0 1
für A Siege usw.Erläuterung
2|⎕
Nimmt Eingang und Mod 22=/
paarweise Gleichheit1+
Addiere 1 für die Indizierung (APL-Arrays basieren standardmäßig auf 1).'BA'('C',⊂'no one')
Verschachteltes Array⊃
Wählt das richtige Element aus dem verschachtelten Array ausquelle
C: 88 Zeichen
Leider erfordert C, wie immer, ziemlich viel unnötigen Müll. Aber dennoch, in welcher anderen Sprache kann man schreiben
=**++b+**(++
und es bedeutet tatsächlich etwas? Ganz einfach großartig.Übergeben Sie einfach drei Zahlen als Argumente und voilà!
quelle
*b[1]
ohne Größenunterschied durch usw. ersetzen könnten (obwohl ein gewisser Verlust an Eleganz .. :()s = "=**++b+**(++"
:: P im Ernst, wow, wie geht das ... wie geht das überhaupt? : Ob
stattdessen die Dereferenzierung und Vorinkrementierung durch Indizierung ersetzen und die Bedingung mit einigen hübschen Ausdrucken versehen, sollten Sie in der Lage sein, dies herauszufinden. : D (Stift und Papier hilft auch, für die resultierende Wahrheitstabelle)GolfScript (31 Zeichen)
Sehr einfache Logik: Reduzieren Sie das Eingangsmodul 2 und sortieren Sie dann eine Kopie. Das mittlere Element des sortierten Arrays befindet sich in der Mehrheit. Suchen Sie daher nach einem anderen Index (und damit in der Minderheit).
quelle
Ruby (Funktionskörper), 42 Zeichen
Unter der Annahme , 3 numerische Argumente
a
,b
undc
:Ruby (Kommandozeilen-Tool), 61 Zeichen
Version 1 hat 62 Zeichen:
Indem die Antwort von Darren Stone huckepack genommen wird, reduziert sich Version 2 auf 61 Zeichen:
quelle
Rubin, 61 Zeichen
quelle
['no one',?C,?B,?A]
==%w(no\ one C B A)
(2 Zeichen gespeichert).JavaScript (Knoten), 87 Zeichen
Um den Ball ins Rollen zu bringen, werden drei zusätzliche Argumente erwartet. Verwendet das folgende Muster für die Eingabe / Ausgabe (steht
/
für "Niemand"):quelle
GolfScript,
363533 ZeichenÜbernimmt die Eingabe wie von STDIN beschrieben. Sie können den Code auch online testen .
quelle
Perl, 84 Zeichen.
<>=~/(\d)/g
Parst die Eingabezeile in verschiedene Ziffernmap{$_%2
Nimmt diese Liste und berechnet den Wert mod 2 (gerade oder ungerade)oct"0b".join"",
Nimmt diese Liste von Mod-Werten, fügt sie zu einem String zusammen, hängt einen Oktal-Bezeichner an und konvertiert den String in eine Zahl.Grundsätzlich habe ich eine Wahrheitstabelle erstellt und diese dann sorgfältig neu angeordnet, sodass eine Inversionsoperation durchgeführt wurde
$x == 4
. Wenn ja$x >=4
, haben wir die Inversion gemacht[$x>=4?7-$x:$x]
der wir das Array indiziert haben('no one','C','B','A')
Es ist nicht der kürzest mögliche Code, aber es ist eigentlich kein Zeilenrauschen ... was an und für sich bemerkenswert ist.
Perl: 74 Zeichen + 3 Flags = 77, laufen mit
perl -anE '(code)'
Dies ist eine Verbesserung, indem Sie Autosplit (das -a), sagen wir (das -E), verwenden und schließlich herausfinden, was mit dem Vergleich nicht stimmte.
quelle
>=4
statt einfach>3
? +1 für die Tipps, die'0b'.
ich vorher nicht kannteCommon Lisp,
114 10670 ZeichenErstellen Sie aus den drei Werten ein Paar, das den Unterschied in der Parität zwischen benachbarten Elementen darstellt. Behandle das als eine binäre Zahl, die in die Ergebnisliste aufgenommen wird.
Älterer Algorithmus:
quelle
Python 2, 54
quelle
Mathematica
100 9489Testen
quelle
Haskell, 97
quelle
R 67
quelle
/usr/bin/R
) und dann den obigen Code eingeben.scan()
wird Sie zur Eingabe auffordern: Ein Beispiel wäre die Eingabe,1[space]3[space]5[space][enter][enter]
und Sie werden die entsprechende Ausgabe (hier,no one
) auf dem Bildschirm sehen. Sie können R hier herunterladen: cran.r-project.org/mirrors.htmlC 85 Zeichen
Nicht so kurz wie meine Ruby-Antwort, aber ich bin zufrieden damit, wenn man die
main
Cruft bedenkt.quelle
Fisch - 41
Hat die Antwort von FireFly gestohlen und auf Fisch portiert, da wir durch die Verwendung von Registern in Fischen einige Zeichen abschneiden können. Verlor ein paar Zeichen, weil der Operator if nicht horizontal war.
Dadurch werden Parameter durch Argumente übernommen.
quelle
#@...<
am Ende verwenden, um ein Zeichen zu speichern. Oh, und Ihr aktueller Code sieht für mich aus wie 42 Zeichen. Verringern Sie also Ihre Zeichenanzahl. :)Smalltalk, 128 Zeichen
sende
value:
mit einer sammlungquelle
JavaScript (ES6) / CoffeeScript, 50 Byte
Verwendet die Wahrheitstabelle gemäß der Antwort von Firefly, geht aber beim Zugriff auf Charaktere direkter vor:
Demo
quelle
Python 3, 115
quelle
Python 3, 114
quelle
Zwei verschiedene Methoden in zwei verschiedenen Sprachen + Variationen -> 6 Antworten
Für diese Operation gibt es im Wesentlichen zwei Möglichkeiten:
array
based: Erstellt eine dreistellige Binärzahl als Antwort aus einem Arraycount
based: Zähle gerade und ungerade und schau, ob es eine gibtcount == 1
Perl 71 (Array-basiert + Variation)
Eines meiner kürzesten perl:
s/(.)\s*/$1&1/eg;
transformiere einen String wie1 2 3
in101
$==oct"0b".$_;
transformiere binär in okt (wie dez, unter 8)$==$=>3?7-$=:$=;
wenn> 3
oper7-
. (Von dortno one
== 0)say$=?chr 68-$=:"no one"
wenn nicht0
, drucke char von value, sonst druckeno one
.Perl 71 (Array-basiert)
etwas anders im Druckschritt: Die Ausgabe basiert auf einem 'Array' .
Perl 81 (zählbasiert)
Andere Bedeutung:
$c=A
Initialisieren Sie einen Zähler c mitA
.map{$a[$_%2]=$c++;$b[$_%2]++}split
Zähler b zählen gerade und ungerade, ein einziger Speicher, welchersay$b[0]==1?$a[0]:
wenn sogar counter == 1? drucken Sie auch sogar Spieler.$b[0]==2?$a[1]:
wenn auch Zähler == 2? auch ungerade Spieler drucken .:"no one"
sonst druckenno one
.Bash 85 (Array-basiert)
Dies basiert auf meiner zweiten Perl-Version:
c=$((($1%2)<<2|($2&1)*2+($3%2)))
mache den Index pos.mod
and
*4
<<1
.((c>3))&&c=$((7-c))
wenn c> = 4, dann ist c = 7-c.o=()
Deklarieren Sie ein Arrayecho ${o[c]}
basierend auf ArrayBash 133 (zählbasiert)
a[$1&1]=A;a[$2&1]=B;a[$3&1]=C
Spieler in Variable a [gerade] und a [ungerade] speichern((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))
zählen gerade / ungerade zu b.case $b in 1) echo ${a[0]}
falls gerade Zähler == 1 gerade Spieler drucken2)echo ${a[1]};;
case even counter == 2 drucke ungeraden Player*)echo no one;esac
sonst druckenno one
.Bash 133 (zählbasiert)
Gleiche Version, mit der Bedingung und Befehlsgruppe von bash anstelle von
case ... esac
quelle
Game Maker Language, 116
Meine neue Antwort basiert stark auf der Formel von FireFly:
Der alte Code wurde mit nicht initialisierten Variablen mit 0 bis 183 Zeichen kompiliert :
Edit # 1 - Ganz anderer Code
quelle
Clojure, 116
quelle
vba, 116
Rufen Sie mit auf
?z(1,2,3)
oder weisen Sie einer Variablen mit zuq=z(1,2,3)
, oder verwenden Sie sie sogar als UDF in Excel und verwenden Sie sie=z(1,2,3)
in Ihrer Excel-Formelquelle
Python 3, 80 Zeichen
Hinweis: Die Eingabe muss "1" [ungerade] oder "0" [gerade] sein. Beispielsweise:
quelle
split
undjoin
so können Sie Ihre (sehr kluge)int(...input...)
Idee immer noch nutzen . ?'0b'+
ich denke, zumindest sieht es für mich überflüssig aus undint(input(),2)
scheint nur in einer REPL zu funktionieren.Java, 226 Zeichen
quelle
C
10196C, wahrscheinlich das trivialste Beispiel (einige ternäre Operationen):
quelle