Wyzwanie
Biorąc pod uwagę grę w kółko i krzyżyk w dowolnym formacie, sprawdź, czy jest ważna, czy nie. Jeśli plansza może być wynikiem gry w kółko i krzyżyk, jest ważna. Na przykład ta tablica jest ważna:
XOX OXO XOXPrzeciwnie, ta tablica jest nieważna:
XXX XXO OOO
Wejście
- Pełna (9/9) kółko i krzyżyk (wynik, nie gra).
Zasady
- Format wejściowy musi umożliwiać przedstawienie wszystkich 512 możliwych kart wejściowych. Należy go określić wraz z instrukcjami, aby go utworzyć, jeśli jest niejasny / niejasny. Musisz jednak indywidualnie oznaczyć znaki planszy.
- Możliwe są dwa wyjścia, jeden dla ważności i jeden dla inwalidztwa.
- Możesz założyć, że na planszy nie ma pustych miejsc.
Przypadki testowe
Ważny:
XOX OXO XOX XOX XOX OXO XOO OOX OXX OXO XOX OXO
Nieważny:
XXX XXX XXX OOO OOO OOO XXX OOO XXX OOO OOX XXX XXO OXO OOX
Mała pomoc?
Planszę uważa się za ważną (dla tego wyzwania) tylko wtedy, gdy spełnione są następujące dwa warunki:
- Istnieje 5 X i 4 O lub 4 X i 5 O. Na przykład
XXX OXO XXX
jest uważany za nieprawidłowy, ponieważ istnieje 7 X i 2 Os. - Wygrał tylko gracz z 5 znakami lub żaden z nich nie wygrał. Na przykład,
XXX OOO OOX
jest uważany za niepoprawny, ponieważ albo rządO
s, albo rządX
s zostaną utworzone jako pierwsze. Dwóch graczy nie może mieć swojej tury jednocześnie.
Obecny zwycięzca to ...
... galaretka odpowiada ais523 , w zadziwiającym 26 bajtów!
code-golf
decision-problem
tic-tac-toe
Erik the Outgolfer
źródło
źródło
O O O
X O X
X O X
, aby pokazać, że ten sam gracz może mieć zarówno rząd poziomy, jak i pionowy.Odpowiedzi:
Galaretka , 26 bajtów
Wypróbuj online!
Format wejściowy jest trochę nietypowy; jest to ciąg reprezentujący tablicę, ale z nowymi liniami Windows (znak powrotu karetki i nowa linia). Na przykład
XXO\r\nOXO\r\nOOX
. (W rzeczywistości dowolny dwuznakowy ciąg dopełniania między wierszami działa, ale znaki nowej linii w systemie Windows są znacznie bardziej obronne niż inne opcje).Podstawową ideą jest to, że szukamy znaków, które pojawiają się 4 razy na wejściu, ale nie mają trzech równomiernie rozmieszczonych wystąpień w oryginalnym ciągu. Z dwoma lub więcej znakami wypełnienia między liniami siatki 3 × 3, wszystkie linie poziome, pionowe i ukośne są równomiernie rozmieszczone, ale żadna inna równo rozmieszczona linia nie może mieć trzech elementów.
Wyjaśnienie:
ð
Iµ
S są separatory łańcuchowe , które rozszczepiają program na kilka części, z których każda niezależna. Zastąpiłem je spacjami poniżej, aby wszystko było trochę wyraźniejsze.Innymi słowy, znajdujemy listę znaków, które pojawiają się dokładnie cztery razy na wejściu, i tworzymy listę składającą się z trzech kopii każdego z nich; znajdujemy listę wszystkich podsekwencji, które są równomiernie rozmieszczone w oryginalnym ciągu; a jeśli odejmiemy sekundę od pierwszej, chcemy, aby wynik miał długość 1 (tzn. gracz grał cztery razy, ale nie wygrał). Pamiętaj, że skoro jesteśmy na planszy 3 × 3 i każdy kwadrat jest pełny, obaj gracze nie mogą grać cztery razy. W Jelly 1 to prawda, 0 to falsey, więc nie musimy robić nic specjalnego, aby przekonwertować wynikową listę na wartość logiczną. (Jest
µL
to jednak wymagane, ponieważ w przeciwnym razie obie byłyby możliwe“XXX”
i“OOO”
byłyby prawdziwymi wartościami wyjściowymi, a pytanie wymaga, aby wszystkie prawidłowe płyty dały ten sam wynik).źródło
JavaScript (ES6),
8887 bajtówZajmuje wejście jako ciąg 9
0
i1
znaków i zwrotów1
za ważne,0
za nieprawidłowe. Sortujemy postacie w kolejności. Jeśli środkowe trzy postacie są teraz takie same, plansza jest nieważna, ponieważ jest ich zbyt wiele. W przeciwnym razie zamieniamy oryginalną tablicę na binarną, odwracając bity, jeśli jest więcej0
s niż1
s. W tym momencie tablica jest ważna, jeśli0
nie ma linii trzy, więc po prostu testujemy wszystkie osiem linii za pomocą tablicy mas bitowych. Edycja: Zapisano 1 bajt dzięki @ETHproductions.źródło
Python 3,
13112712510096 bajtówDla innego podejścia algorytmicznego (i takiego, które naprawdę będzie pasować do tych wielobajtowych języków golfowych z wbudowaną kompresją), zamiast obliczać, czy tablica jest poprawna, uzyskajmy 512-bitową liczbę, gdzie każdy bit reprezentuje, czy nie określona tablica jest ważna lub nie i przekazuje wartość binarną reprezentującą tablicę. Ponadto, dzięki symetrii, drugą połowę tabeli można wyeliminować wraz z wiązką zer:
Wartość testowa:
Jest reprezentowany jako wartość binarna
0b111010111
, a funkcja zwraca wartość niezerową, jeśli tablica jest poprawna.źródło
a&(1<<b)
nie wymagają nawiasów.if b>255:b=511-b
!if
.Partia, 140 bajtów
Pobiera dane wejściowe jako dziewięć osobnych argumentów i danych wyjściowych
1
dla wiersza poprawnego i0
niepoprawnego. Działa poprzez śledzenie, ile razy widziO
linię prostopadłąOOO
lubXXX
. Dogodnie Batch pozwala nam wykonywać arytmetykę liczb całkowitych pośrednio, więc nie zwiększamy,%%l
tylko jakąś zmienną (chociaż interesują nas tylko trzy wymienione zmienne). Następnie musimy sprawdzić, czy alboX
nie wygrał i jest pięćO
sekund, albo żeO
nie wygrał i są czteryO
sekundy.źródło
Mathematica,
8275 bajtówDzięki Martin Ender za oszczędność 7 bajtów!
Nienazwana funkcja przyjmująca zagnieżdżoną 3 x 3 listę 1 i 0 jako dane wejściowe i wyjściowe
True
lubFalse
.Używa poręcznej elastyczności
Total
funkcji (tutaj do gry w golfat
): biorąc pod uwagę przykładową tablicęe = { {1,2,3} , {4,5,6} , {7,8,9} }
, poleceniet[e]
sumuje trzy wektory (tutaj daje{12,15,18}
); poleceniet/@e
sumuje każdą podlistę osobno (tutaj daje{6,15,24}
); a poleceniee~t~2
sumuje wszystkie dziewięć elementów (tutaj daje45
).Najpierw sprawdzamy,
3<(b=#~t~2)<6
czy całkowita liczba 1s wynosi 4 czy 5; jeśli nie, wychodzimy zFalse
. Jeśli tak, używamy,c=If[b>4,1-#,#]
aby wymusić, aby były cztery 1, a nie pięć. Następnie obliczamy sumy kolumn, sumyt[c]
wierszyt/@c
, sumę głównej przekątnejTr@c
i sumę przeciwnej przekątnejTr@Reverse~c
, i używamy~FreeQ~3
do sprawdzenia, czy3
nie pojawia się na żadnym poziomie w tych obliczonych sumach.Zabawna uwaga dodatkowa: w przeciwieństwie do większości wyglądów na tej stronie, tutaj
Tr
nie używa się jej do podsumowania jednowymiarowej listy, ale jest ona faktycznie używana zgodnie z przeznaczeniem - do obliczania śladu macierzy dwuwymiarowej!źródło
Pyth - 36 bajtów
Uwzględniam diagi i zamiast tego używam dwóch trójskładników.
Pakiet testowy
źródło
JavaScript (ES6), 101 bajtów
Pobiera dane wejściowe jako 9-bitową maskę binarną, gdzie
X = 1
iO = 0
(MSB = lewa górna komórka, LSB = prawa dolna komórka).Przypadki testowe
Pokaż fragment kodu
źródło
Python 2,
1581321099291123 bajtyDane wejściowe to lista / krotka wierszy, z których każda to trzy krotka ciągów znaków, np .:
[('X', 'O', 'X'), ('O', 'X', 'O'), ('X', 'O', 'X')]
Zapisano niektóre bajty, ignorując przekątne w odpowiedzi @ Maltysen, co również skróciło poniższe wyrażenie.Dzięki @vaultah za uratowanie1718 bajtów.Konieczne okazuje się sprawdzenie przekątnych, które usunęły wiele powyższych oszczędności.
Wypróbuj tutaj.
Wyjaśnienie
f
to spłaszczony wkład do krojenia.w
zawiera postacie z wygrywającymi sekwencjami.Policz wystąpienia każdej zwycięskiej postaci, która będzie wynosić 0, jeśli
w
jest pusta, lub 5, jeślilen(w)
wynosi 1. 10 sum, gdy obie mają zwycięską sekwencję, jest niemożliwe. Zwycięzca posiadający 5 oznacza, że przegrany ma 4. Nie możesz mieć> 5 bez zwycięskiej sekwencji.źródło
lambda b:len({x[0]for x in b+zip(*b)if len(set(x))==1})<2and set(map(
b.count,'XO'))=={4,5}
zapisuje niektóre bajty....and{4,5}==set(map(
b.count,'XO'))
zapisuje jeszcze jeden bajt.R,
8882 bajtówWszystkie kombinacje trzech liczb całkowitych od 1 do 9, które sumują się do 15, to rzędy / kolumny / przekątne kwadratu pokazanego poniżej.
Funkcja przyjmuje dane wejściowe jako wektor wartości logicznych, T dla „X”, F dla „O”, która jest spłaszczoną reprezentacją planszy. ALE, są one ponownie uporządkowane, tak aby ich indeks był taki sam jak liczba w kwadracie, w kolejności (2,7,6,9,5,1,4,3,8). Kolejność ta może zostać osiągnięta przez spłaszczenie planszy w normalny sposób, a następnie pocięcie o c (6,1,8,7,5,3,2,9,4). Więc to
jest reprezentowany jako:
który jest:
Funkcja najpierw określa, czy jest gracz z dokładnie czterema znakami. Jeśli tak, funkcja używa faktów, które sumują do 15, aby ustalić, czy ten gracz ma trzy z rzędu (plansza jest nieprawidłowa, jeśli gracz ma).
Jeśli chcesz wziąć tradycyjnie spłaszczoną płytkę jako kod wejściowy, kod wyglądałby następująco:
Jestem w tym nowy, porady będą mile widziane.
źródło
if()
zamiast tego używasz :f=function(x)
if(sum(x)%in%4:5,all(apply(combn(which(x==(sum(x)<5)),3),2,sum)!=15),F)
. Nie są dokładnie testowane. Backticks niszczy kod, ale tak jestbacktick if backtick(
.x=scan();
if(sum(x)%in%4:5,all(apply(combn(which(x==(sum(x)<5)),3),2,sum)!=15),F)
i wprowadź jako1
i0
. 82 bajty.JavaScript (ES6),
145139131127 bajtówWprowadź jako ciąg rozdzielany spacjami, taki jak
"XOX OXO XOX"
. Wyjścia1
dla nieprawidłowej płyty,0
dla prawidłowej. To oczywiście nie jest najlepsza technika, przynajmniej nie w JavaScript ...Zasadniczo sprawdza, czy oba następujące elementy są wstrzymane:
O
s, ANDWyrażenie regularne polega na sprawdzeniu, czy decyzja została podjęta. Pasuje do planszy, jeśli istnieją dowolne odcinki o długości trzy jednego znaku z 0 (wiersz), 2 (dolna prawa przekątna), 3 (kolumna) lub 4 (dolna lewa przekątna) znaki oddzielające każdą parę.
Testowy fragment kodu
Pokaż fragment kodu
źródło
Rubin,
104 9991 bajtówFormat wejściowy: ciąg binarny zawierający 9 symboli (0 i 1s) reprezentujących tablicę, na przykład pierwszy przypadek testowy
101010101
. Najpierw przekonwertuj go na liczbę binarną, sprawdź, czy popcount wynosi 4 lub 5, jeśli 5 to odwróć liczbę, abyśmy zawsze mieli 4. Sprawdź, czy trzy z nich są wyrównane (maskujące poziomo, pionowo, po przekątnej).TL; DR : Zwraca false, jeśli gracz z 4 znakami wygrał, prawda w przeciwnym razie.
Dzięki Jordan za komentarze,
Nie mogę odtworzyć łańcucha UTF-8, który zapisałby kolejny bajt.
źródło
.select{...}[0]
z.find{...}
."8ǀĤITđ".unpack("U*")
(na wypadek, gdyby coś zginęło w tłumaczeniu, łańcuch jest wynikiem wywołaniapack("U*")
oryginalnej tablicy; ma 12 bajtów).any?
zamiastnone?
przerzucania wyjścia i zapisywania całego bajtu?Perl 6 ,
10399 bajtówLambda, która akceptuje listę takich jak
(('X','O','X'), ('O','X','O'), ('X','O','X'))
i zwraca Bool.Działa to tak:
c
. (Jeśli żaden znak nie pojawi się dokładnie 5 razy, będzie on zawierał wartość fałszu)c
jest prawdą, a każda wygrywająca linia jest typuc
.źródło
PHP, 125 bajtów
Miałem taki sam pomysł jak Arnauld : Płyta jest ważna, jeśli są ustawione 4 lub 5 bitów i albo
X
alboO
albo nikt nie ma passę (ale nie jednocześnie).Aby wygenerować sygnał z pola zastępuje
X
się1
iO
z0
, dołącz linie i przekonwertować plik binarny do przecinku podać jako argument wiersza poleceń.wydruki są
1
ważne; puste wyjście dla niepoprawnego. Uruchom z-r
.awaria
źródło
Szybki, 178 bajtów
źródło
ES6 (Javacript),
130,138, 117 bajtówEDYCJE:
Niezwykle proste podejście. Prawdopodobnie można grać w golfa nieco dalej.
Akceptuje dane wejściowe jako 9 oddzielnych argumentów, 1es i 0es
Argumenty: 1-3 - pierwszy rząd, 4-6 - drugi rząd, 7-9 - trzeci rząd.
Grał w golfa
Interaktywne „łóżko testowe”
źródło
[1,0,1,1,0,1,0,1,0]
(XOX XOX OXO
).a+b+c+d+e+f+g+H+i
zamiastF.reduce((r,c)=>r+=c*1)
(w którym momencie nie potrzebujeszF
) b) pisać.includes(C)
(i przejść do wartości inlineC
)?OOO XXX OXO
porażka?