Spiel des Satz-Puzzlespiels

13

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 OR1NundDG3N

und Bildbeschreibung hier eingeben

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.

Dr. Jerry
quelle
5
Klingt vielversprechend, geben Sie jedoch genauer an, welche Art von Eingabedaten verarbeitet werden müssen (stdin, file, parameter) und wie die Eingabe- und Ausgabedaten aussehen werden. Stellen Sie auch eine visuelle Darstellung (Screenshot oder ähnliches) eines Probelaufs bereit.
Manatwork
1
Ich habe meine enge Abstimmung zurückgezogen und dies befürwortet. es ist sehr interessant! :)
Türklinke
4
Zum Teufel meinst du mit "Spiel für Kinder"?
Stand
2
Waitaminute ... es gibt 4 verschiedene 4. Buchstaben: N, D, S und O.
Stand vom
1
@boothby: Ich hätte das Gegenteil gesagt. Wenn sich die Buchstaben nicht überlappen, können Sie für jeden Kandidatensatz nur zählen, wie oft jeder Buchstabe oder jede Zahl auftaucht: Der Satz ist nur dann gültig, wenn keine Zahl oder kein Buchstabe zweimal vorkommt.
Flodel

Antworten:

4

Ruby, 104 98 81 80 Zeichen

$*.combination(3).map{|c|puts c*?,if(0..3).all?{|i|c.map{|x|x[i]}.uniq.size!=2}}

Probelauf (anhand Ihrer Beispieldaten):

c:\a\ruby>set.rb OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D
OR1N,WP2N,DG3N
WP2N,DR1D,OG3O
WP2N,DR1D,OG3O
DG3N,WG3S,OG3O

Es wird WP2N,DR1D,OG3Ozweimal ausgegeben, weil Sie zwei DR1Ds in Ihren Beispieldaten haben.

Erläuterung:

$*.combination(3).map{|c|- Jede Kombination von 3 Karten
puts 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, truewenn sie in diesen Block übergeben werden
c.map{|x|x[i]}- Nimm den ith-Index jeder Zeichenfolge
.uniq.size!=2}- wenn die Menge der einzigartigen Eigenschaften (Form, Farbe usw.) nicht 2 ist (also 1 oder 3)

Türknauf
quelle
Unter der Annahme, dass diese Herausforderung zum Codegolf wird, kann ich zwei Verbesserungen vorschlagen: a) endmehrere Zeilenumbrüche entfernen: Umwandlung if ... puts ... endin puts ... if ...b) Alle können einen Block nehmen, ist also x.map{}.all?gleichx.all?{}
Howard
@How Danke, ich werde diese Verbesserungen vornehmen, wenn ich an einen Computer komme.
Türklinke
@ Howard Bearbeitet, um beide einzuschließen. Vielen Dank!
Türklinke
Entfernen Sie auch das Leerzeichen nach if.
Howard
Ich mag die Rubinlösung, kurz, prägnant und mehr oder weniger lesbar
Dr. Jerry
5

Mathematica 93 92 93 82 76 73

f={}⋃Select[StringSplit@#~Subsets~{3}, FreeQ[Tally/@(Characters@#^T),2]&]&

Die 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

Array 1

wird dann transponiert,

Array 2

und Tally/@(Characters@#^T)berechnet die Anzahl der unterschiedlichen Elemente in jeder Zeile.

{3,1,1,3}

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

f["OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"]

{{"DG3N", "WG3S", "OG3O"}, {"OR1N", "WP2N", "DG3N"}, {"WP2N", "DR1D", "OG3O"}}

DavidC
quelle
Es kann kürzer sein, wenn Duplikate zulässig sind. 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"}}
alephalpha 17.10.13
Sehr clevere Möglichkeit, auf "alle gleich" oder "alle verschieden" zu prüfen!
DavidC
4

Mathematica 73

f = Select[StringSplit@#~Subsets~{3}, FreeQ[Tally /@ Thread@Characters@#, 2] &] &

Verwendung

f["OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"]

{{OR1N, WP2N, DG3N}, {WP2N, DR1D, OG3O}, {WP2N, DR1D, OG3O}, {DG3N, WG3S "," OG3O "}}

Alephalpha
quelle
4

Brachylog , 12 Bytes

ṇ₁⊇Ṫz{=|≠}ᵐz

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.

                The output variable is
  ⊇             a subsequence
   Ṫ            of length 3
ṇ₁              of the input split on spaces,
    z      z    the columns of which
     {   }ᵐ     are all
       |        either
      =         the same element repeated,
        ≠       or entirely free of duplicates.
Nicht verwandte Zeichenfolge
quelle
3

GolfScript, 53 Zeichen

" "/:w,,{:a,{:^,{a^]{w=}%.0\zip{.&,2=|}/!{.p}*;}/}/}/

Die Eingabe muss auf STDIN erfolgen, Beispiel online :

> OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D
["OR1N" "DG3N" "WP2N"]
["WP2N" "OG3O" "DR1D"]
["DG3N" "OG3O" "WG3S"]
["WR2D" "OR2D" "DR2D"]

Kommentierter Code:

" "/:w          # split the input at spaces and assign it to variable w
,,              # create the array [0..n-1] (n being the length of w)
{:a,{:^,{       # three nested loops: a=0..n-1, ^=0..a-1, _=0..b-1 
                # (third loop has no variable assigned but just pushes on stack)
    a^]         # make an array [a,^,_] of the three loop variables
    {w=}%       # take the corresponding list items, i.e. [w[a],w[^],w[_]]
    .0\         # push zero, add duplicate of the the array
    zip         # zip transposes the array, thus [OR1N WP2N DG3N] -> [OWD RPG 123 NNN]
    {           # loop over those entries
      .&        # unique
      ,2=       # length equals 2?
      |         # "or" with top of stack (two zero pushed before)
    }/          # end of loop, on stack remains the results of the "or"s
    !{.p}*      # if no length of 2 is there, make a copy of the set and print it
    ;           # discard stack item
}/}/}/          # closing the three nested loops
Howard
quelle
2
Ich würde sagen, ein klarer Gewinner für ein Code-Golf. Hower völlig unlesbar ..
Dr. Jerry
1
@drjerry Im Vergleich zu anderen Golfscript-Codes ist es gut lesbar. ZB enthält es nur einfache Loops und keine fortgeschrittenen Tricks. Ich werde später eine Erklärung des Codes hinzufügen.
Howard
0\zip{.&,2=|}/!kann verkürzt werden aufzip{.&,}%2&!
Peter Taylor
1

Javascript 323 313

function a(b){d=h=[];c=e=f=0;for(i in b){for(j in b){for(k in b[i]){if(b[i][k]==b[j][k]){if(c+f<4)c++;else if(c==4){h+=b[j];if(h.length=3)return h}}else{for(l in d){for(m in d[l]){g=f;if(d[l][2]==i){if(d[l][3]==k)if(b[j][k]!=d[l][0]&&b[j][k]!=d[l][1])f++;}else{continue}}if(g==f)d[e++]=[b[i][k],b[j][k],j,k]}}}}}}

Es ist eine Funktion, die ein Array von Objekten nimmt und ein Array von Objekten zurückgibt.

DEMO Geige (mit Aufräumen).

Mathekühler
quelle
Sie müssen keine Variablen deklarieren ...
Türklinke
@Doorknob Ich nehme es zurück, du hast recht. bearbeitet. Vielen Dank!
Math Chiller
1

APL (IBM), 76

⍉¨x/⍨{{⍵≡1⌽⍵}⍵=1⌽⍵}¨x←⊃¨(∘.,/3⍴⊂⍪¨(' '≠y)⊂y←⍞)⌷⍨¨z/⍨∧/¨2</¨z←,⍳3⍴12

Ich habe keine IBM APL, aber ich glaube, dass dies funktionieren wird.

Probelauf (Emulieren von IBM APL in Dyalog APL)

OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D
 OR1N  WP2N  WP2N  DG3N 
 WP2N  DR1D  DR1D  WG3S 
 DG3N  OG3O  OG3O  OG3O 
TwiNight
quelle
Zum ersten Mal sehe ich apl Code, danke!
Dr. Jerry
1

Salbei, 71

Wenn Ces sich um eine Zeichenfolge handelt, sagen wir "OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D", führen Sie aus

[c for c in Subsets(C.split(),3)if{1,3}>={len(set(x))for x in zip(*c)}]

bekommen [{'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:

[c for c in Subsets(C.split(),3)if sum(matrix(3,map('WODRPG123N'.find,''.join(c))))%3==0]

Ich war ein bisschen genervt, dass Dich es zweimal benutzt habe ... bis ich herausgefunden habe, wie ich das missbrauchen soll. Aber noch besser, ich missbrauche die findMethode auch. str.findGibt -1 zurück, wenn kein Buchstabe gefunden wird. Da -1 = 2 mod 3der Brief Snicht in vorkommt, wird er entsprechend behandelt 'WODRPG123N'.

boothby
quelle