Vielleicht kennen Sie das Spiel Set (ein wundervolles Spiel für Kinder übrigens), ein Kartenspiel mit 81 Karten, auf dem jede Karte eine Figur mit 4 verschiedenen Attributen (Form, Nummer, Farbe und Füllung) hat. Jedes Attribut hat 3 verschiedene Werte:
form: wave, oval, diamond
colour: red, purple, and green
number: 1, 2, 3
fill: none, dashed, opaque.
12 Karten werden offen auf den Tisch gelegt und nun besteht die Herausforderung darin, Sätze anzuzeigen. Ein Set besteht aus drei Karten, bei denen jeder Attributwert 0, 1 oder 3 Mal vorkommt. 2 Karten mit roten Zahlen oder undurchsichtig oder 1 Zahl zu haben, ist nicht gut. Siehe den mitgelieferten Link für eine visuellere Erklärung.
Ich stelle mir einen Code für eine Karte vor, auf der alle Attribute so kodiert sind
"WP2N"
steht für
2 Purple Waves with No fill
Zusammen mit zum Beispiel OR1N
undDG3N
und
es ist ein Set (3 verschiedene Formen, 3 verschiedene Farben, 3 verschiedene Zahlen, 1 Füllung).
Die Eingabe ist eine durch Leerzeichen getrennte Zeichenfolge eindeutiger Codes (zufällig aus 81 möglichen Codes ausgewählt), die Karten darstellen.
"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D"
Die Lösung muss alle möglichen Mengen innerhalb der gegebenen Sammlung angeben. So
OR1N, WP2N, DG3N
muss zusammen mit allen anderen Sets Teil der Lösung sein.
Antworten:
Ruby,
104988180 ZeichenProbelauf (anhand Ihrer Beispieldaten):
Es wird
WP2N,DR1D,OG3O
zweimal ausgegeben, weil Sie zweiDR1D
s in Ihren Beispieldaten haben.Erläuterung:
$*.combination(3).map{|c|
- Jede Kombination von 3 Kartenputs c*?,if
- Ausgabe des Satzes, wenn ...(0..3).all?{|i|
- Wenn alle Zahlen von 0 bis 3 (die Indices der Eigenschaften in der Zeichenfolge) ausgewertet werden,true
wenn sie in diesen Block übergeben werdenc.map{|x|x[i]}
- Nimm deni
th-Index jeder Zeichenfolge.uniq.size!=2}
- wenn die Menge der einzigartigen Eigenschaften (Form, Farbe usw.) nicht 2 ist (also 1 oder 3)quelle
end
mehrere Zeilenumbrüche entfernen: Umwandlungif ... puts ... end
inputs ... if ...
b) Alle können einen Block nehmen, ist alsox.map{}.all?
gleichx.all?{}
if
.Mathematica
93 92 93 82 7673Die Logik
StringSplit@#~Subsets~{3}
Erzeugt eine Liste von 3-Karten-Teilmengen. Jedes Triple wie:{{"D", "G", "3", "N"}, {"W", "G", "3", "S"}, {"O", "G", "3", "Ö"}}
oder
wird dann transponiert,
und
Tally/@(Characters@#^T)
berechnet die Anzahl der unterschiedlichen Elemente in jeder Zeile.3 entspricht "alle verschieden"; 1 entspricht "alle gleich".
FreeQ[...,2]
Bestimmt, ob 2 Karten des gleichen Typs oder im Triple. Wenn 2 nicht zu den Tallies gehört, sind die drei Karten gemäß den Regeln des Spiels ein "Set".Verwendung
quelle
f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&
Die Ausgabe wird{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
Mathematica 73
Verwendung
quelle
Brachylog , 12 Bytes
Probieren Sie es online!
Übernimmt die Eingabe über die Eingabevariable und generiert die Ausgabe über die Ausgabevariable.
Zweiter Testfall aus einem kürzlich abgeschlossenen Duplikat in seiner Codierung, da es dieser Lösung eigentlich egal ist, was überhaupt etwas bedeutet.
quelle
GolfScript, 53 Zeichen
Die Eingabe muss auf STDIN erfolgen, Beispiel online :
Kommentierter Code:
quelle
0\zip{.&,2=|}/!
kann verkürzt werden aufzip{.&,}%2&!
Javascript
323313Es ist eine Funktion, die ein Array von Objekten nimmt und ein Array von Objekten zurückgibt.
DEMO Geige (mit Aufräumen).
quelle
APL (IBM), 76
Ich habe keine IBM APL, aber ich glaube, dass dies funktionieren wird.
Probelauf (Emulieren von IBM APL in Dyalog APL)
quelle
Salbei, 71
Wenn
C
es sich um eine Zeichenfolge handelt, sagen wir"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"
, führen Sie ausbekommen
[{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]
Und hier ist ein ganz anderer Ansatz, der die Interpretation verwendet, dass ein Set eine projektive Linie ist in
GF(3)^4
:Ich war ein bisschen genervt, dass
D
ich es zweimal benutzt habe ... bis ich herausgefunden habe, wie ich das missbrauchen soll. Aber noch besser, ich missbrauche diefind
Methode auch.str.find
Gibt -1 zurück, wenn kein Buchstabe gefunden wird. Da-1 = 2 mod 3
der BriefS
nicht in vorkommt, wird er entsprechend behandelt'WODRPG123N'
.quelle
Python 2 , 99 Bytes
Probieren Sie es online!
quelle