Gra w puzzle

13

Być może znasz grę Set (wspaniała gra dla dzieci), gra karciana z 81 kartami, w której każda karta ma na sobie figurkę z 4 różnymi atrybutami (forma, liczba, kolor i wypełnienie). Każdy atrybut ma 3 różne wartości:

form: wave, oval, diamond
colour: red, purple, and green
number: 1, 2, 3
fill: none, dashed, opaque.

Na stole leży 12 kart, a teraz wyzwaniem jest wskazanie zestawu. Zestaw składa się z trzech kart, w których każda wartość atrybutu występuje 0, 1 lub 3 razy. posiadanie 2 kart z czerwonymi cyframi, nieprzezroczystych lub 1 liczba nie jest dobre. Zobacz dostarczonego łącza do bardziej wizualne wyjaśnienia.

Wyobrażam sobie kod karty, w którym wszystkie atrybuty są tak zakodowane

"WP2N"

oznacza

2 Purple Waves with No fill

Razem z na przykład OR1NiDG3N

i wprowadź opis zdjęcia tutaj

jest to zestaw (3 różne formy, 3 różne kolory, 3 inna liczba, 1 wypełnienie).

Dane wejściowe to rozdzielany spacjami ciąg unikalnych kodów (losowo wybranych z 81 możliwych kodów) reprezentujących karty.

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

Rozwiązanie musi wskazywać wszystkie możliwe zestawy w ramach danej kolekcji. Więc

OR1N, WP2N, DG3N

musi być częścią rozwiązania wraz ze wszystkimi innymi zestawami.

dr jerry
źródło
5
Brzmi obiecująco, ale proszę sprecyzować, jakie dane wejściowe należy obsługiwać (standardowe, plik, parametr) i jak będą wyglądać dane wejściowe i wyjściowe. Zapewnij również wizualną reprezentację (zrzut ekranu lub podobny) przebiegu próbnego.
manatwork
1
Cofałem mój głos z bliska i głosowałem za tym; to bardzo interesujące! :)
Klamka
4
Do diabła masz na myśli „gra dla dzieci”?
stoisko
2
Czekajcie ... są 4 różne 4 litery: N, D, S i O.
stoisko
1
@boothby: Powiedziałbym coś przeciwnego. Jeśli alfabety nie nakładają się, dla każdego zestawu kandydatów możesz po prostu policzyć, ile razy pojawia się każda litera lub cyfra: zestaw jest ważny tylko wtedy, gdy żadna liczba lub litera nie pojawia się dwukrotnie.
flodel

Odpowiedzi:

4

Ruby, 104 98 81 80 znaków

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

Przykładowy przebieg (przy użyciu przykładowych danych):

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

Wyprowadza WP2N,DR1D,OG3Odwa razy, ponieważ masz dwa DR1Ds w przykładowych danych.

Wyjaśnienie:

$*.combination(3).map{|c|- każda kombinacja 3 kart
puts c*?,if- wyprowadza zestaw, jeśli ...
(0..3).all?{|i|- jeśli wszystkie liczby od 0 do 3 (wersety właściwości ciągu) oceniają, truekiedy zostaną przekazane do tego bloku
c.map{|x|x[i]}- weź iindeks th każdego ciągu
.uniq.size!=2}- jeśli ilość unikalnych właściwości (forma, kolor itp.) nie jest równa 2 (czyli 1 lub 3)

Klamka
źródło
Zakładając, że to wyzwanie stanie się kodegolfem, mogę zaproponować dwie ulepszenia: a) pozbyć się endplus kilka podziałów linii: przekształcić if ... puts ... endw puts ... if ...b) wszyscy mogą wziąć blok, a więc x.map{}.all?jest równyx.all?{}
Howard
@Jak dzięki, wprowadzę te ulepszenia, kiedy dojdę do komputera.
Klamka
@Howard Edytowane, aby uwzględnić oba. Dzięki!
Klamka
Usuń również spację po if.
Howard
Podoba mi się rubinowe rozwiązanie, krótkie, zwięzłe i mniej lub bardziej czytelne
dr jerry
5

Mathematica 93 92 93 82 76 73

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

Logika

StringSplit@#~Subsets~{3}tworzy listę podzbiorów składających się z 3 kart. Każdy potrójny, taki jak:

{{„D”, „G”, „3”, „N”}, {„W”, „G”, „3”, „S”}, {„O”, „G”, „3”, „O”}}

lub

tablica 1

jest następnie transponowany,

tablica 2

i Tally/@(Characters@#^T)ocenia liczbę różnych elementów w każdym rzędzie.

{3,1,1,3}

3 odpowiada „wszystkie różne”; 1 odpowiada „wszystkie takie same”.

FreeQ[...,2]określa, czy 2 karty tego samego typu, czy potrójne. Jeśli 2 nie znajduje się wśród talii, wówczas trzy karty są „zestawem”, zgodnie z zasadami gry Set.


Stosowanie

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

{{„DG3N”, „WG3S”, „OG3O”}, {„OR1N”, „WP2N”, „DG3N”}, {„WP2N”, „DR1D”, „OG3O”}}

DavidC
źródło
Może być krótszy, jeśli dozwolone są duplikaty. f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&Wyjście będzie{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
alephalpha
Bardzo sprytny sposób na sprawdzenie „wszystkie takie same” lub „wszystkie inne”!
DavidC
4

Mathematica 73

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

Stosowanie

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
źródło
4

Brachylog , 12 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe poprzez zmienną wejściową i generuje dane wyjściowe poprzez zmienną wyjściową.

Drugi przypadek testowy wzięty z niedawno zamkniętego duplikatu w jego kodowaniu, ponieważ to rozwiązanie tak naprawdę nie obchodzi, co tak naprawdę znaczy.

                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.
Niepowiązany ciąg
źródło
3

GolfScript, 53 znaki

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

Dane wejściowe należy podać na STDIN, przykład 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"]

Skomentowany kod:

" "/: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
źródło
2
Powiedziałbym wyraźnego zwycięzcę golfa kodowego. Hower totalnie nieczytelny ..
dr jerry
1
@drjerry W porównaniu z innym kodem golfowym jest dość czytelny. Np. Zawiera tylko zwykłe pętle i żadnych zaawansowanych sztuczek. Wyjaśnię kod później.
Howard
0\zip{.&,2=|}/!można skrócić dozip{.&,}%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]}}}}}}

jest to funkcja, która pobiera tablicę obiektów i zwraca tablicę obiektów.

Skrzypki DEMO (z porządkiem).

Agregat matematyczny
źródło
Nie musisz deklarować zmiennych ...
Klamka
@Doorknob cofam, masz rację. edytowane. dzięki!
Chłodziarka do matematyki
1

APL (IBM), 76

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

Nie mam IBM APL, ale wierzę, że to zadziała.

Przykładowy przebieg (emulacja IBM APL w 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
źródło
Po raz pierwszy widzę kod aplikacji dzięki!
dr jerry
1

Sage, 71

Jeśli Cjest łańcuchem, powiedzmy "OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D", wykonaj

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

dostać [{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]

A oto zupełnie inne podejście z wykorzystaniem interpretacji, że zestaw jest linią rzutową w GF(3)^4:

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

Byłem trochę zirytowany, który Dzostał użyty dwa razy ... dopóki nie wymyśliłem, jak to wykorzystać. Ale jeszcze lepiej, również nadużywam tej findmetody. str.findzwraca -1, jeśli litera nie zostanie znaleziona. Ponieważ -1 = 2 mod 3list Sjest obsługiwany odpowiednio, ponieważ nie występuje w 'WODRPG123N'.

boothby
źródło