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 OR1N
iDG3N
i
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.
Odpowiedzi:
Ruby,
104988180 znakówPrzykładowy przebieg (przy użyciu przykładowych danych):
Wyprowadza
WP2N,DR1D,OG3O
dwa razy, ponieważ masz dwaDR1D
s w przykładowych danych.Wyjaśnienie:
$*.combination(3).map{|c|
- każda kombinacja 3 kartputs 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ą,true
kiedy zostaną przekazane do tego blokuc.map{|x|x[i]}
- weźi
indeks 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)źródło
end
plus kilka podziałów linii: przekształcićif ... puts ... end
wputs ... if ...
b) wszyscy mogą wziąć blok, a więcx.map{}.all?
jest równyx.all?{}
if
.Mathematica
93 92 93 82 7673Logika
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
jest następnie transponowany,
i
Tally/@(Characters@#^T)
ocenia liczbę różnych elementów w każdym rzędzie.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
źródło
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"}}
Mathematica 73
Stosowanie
źródło
Brachylog , 12 bajtów
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.
źródło
GolfScript, 53 znaki
Dane wejściowe należy podać na STDIN, przykład online :
Skomentowany kod:
źródło
0\zip{.&,2=|}/!
można skrócić dozip{.&,}%2&!
javascript
323313jest to funkcja, która pobiera tablicę obiektów i zwraca tablicę obiektów.
Skrzypki DEMO (z porządkiem).
źródło
APL (IBM), 76
Nie mam IBM APL, ale wierzę, że to zadziała.
Przykładowy przebieg (emulacja IBM APL w Dyalog APL)
źródło
Sage, 71
Jeśli
C
jest łańcuchem, powiedzmy"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"
, wykonajdostać
[{'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
:Byłem trochę zirytowany, który
D
został użyty dwa razy ... dopóki nie wymyśliłem, jak to wykorzystać. Ale jeszcze lepiej, również nadużywam tejfind
metody.str.find
zwraca -1, jeśli litera nie zostanie znaleziona. Ponieważ-1 = 2 mod 3
listS
jest obsługiwany odpowiednio, ponieważ nie występuje w'WODRPG123N'
.źródło
Python 2 , 99 bajtów
Wypróbuj online!
źródło