Zagrajmy w golfa z kodem!
Biorąc pod uwagę stan planszy kółko i krzyżyk (przykład :)
|x|x|o|
|x|o|x|
|o|o|x|
Ustal, czy gra jest win
a lose
lub cat
. Twój kod powinien wypisać dowolną z tych opcji w danym stanie. Powyższa gra powinna zostać wypisanalose
Żeby było jasne: wygrana jest definiowana jako dowolne 3 x
s z rzędu (po przekątnej, w poziomie, w pionie). przegrana to 3 o
s z rzędu, podczas gdy cat
gra nie jest z rzędu.
Aby uczynić rzeczy interesującymi, musisz określić strukturę wejściową dla stanu, którą następnie musisz wyjaśnić. Na przykład xxoxoxoox
jest to prawidłowy stan, jak pokazano powyżej, w którym każdy ze znaków jest odczytywany od lewej do prawej, od góry do dołu. [['x','x','o'],['x','o','x'],['o','o','x']]
to gra w wielowymiarowej tablicy odczytanej w podobny sposób. Chociaż 0x1a9
jest to wartość szesnastkowa, 110101001
może działać jako odpowiednia kompresja, w której 1
można manipulować dla x
si i 0
można nim manipulować o
.
Ale to tylko niektóre pomysły, jestem pewien, że możesz mieć wiele własnych.
Podstawowe zasady:
- Twój program musi być w stanie zaakceptować dowolny możliwy stan.
- Forma danych wejściowych musi być w stanie reprezentować dowolny stan.
- „Stan wygranej należy ustalić z planszy”
- Załóż pełną tablicę
Win
wcześniejlose
na przykład w sprawie „xxxoooxxx”
Wygrywa najniższa liczba postaci
(win|lose|cat) [xo]{9}
gdzie pierwsze słowo oznacza, czy gra jest wygrana, przegrana, czy kot (?) Dla gracza x. Potrafi reprezentować dowolny stan.Odpowiedzi:
Ruby 2.0, 85 znaków
Oto proste rozwiązanie oparte na masce bitowej w Ruby:
Plansza jest reprezentowana przez liczbę szesnastkową, złożoną z dziewięciu bitów odpowiadających dziewięciu kwadratom. 1 to an
X
, 0 to anO
. To jest tak jak w0x1a9
przykładzie w pytaniu, chociaż0x
jest opcjonalne!Prawdopodobnie jest lepszy sposób na wykonanie maski bitowej niż zakodowanie dużej listy. Z przyjemnością przyjmę sugestie.
Zobacz, jak działa na Ideone tutaj .
źródło
273
dwa razy. I naprawdę podoba mi się tenmax
pomysł!Mathematica, 84 znaki
Format wejściowy:
{{1, 1, 0}, {1, 0, 1}, {0, 0, 1}}
źródło
Tr@a
to ślad pola (suma po przekątnej),Tr@Reverse@a
to ślad odwróconego pola (niektóre ponad przekątną),Tr/@a
jestTr
stosowany do każdego wiersza, co daje sumę nad każdym wierszem,Total@a
daje sumę nad każdą kolumną. Zasadniczo masz wszystkie 8 linii, które musisz sprawdzić. NastępnieWhich
rzecz jest stosowana do tego (w zasadzieif/elseif/else
instrukcji), gdzie#
reprezentuje listę 8 wartości.if
istnieje3
wygrasz,else if
istnieje0
tracisz,else if 1>0
(true)cat
.Bash:
283262258Posiada stosunkowo przyjazny interfejs.
Wykonać
bash tictactoe.sh O X O X O X X O X
Uwaga: lista 9 pozycji jest standardową reprezentacją macierzy. Nie ma znaczenia, czy plansza jest reprezentowana jako główna kolumna czy główna kolumna, czytana od lewej do prawej lub od góry do dołu - gry kółek i krzyżyków (lub kółko i krzyżyk, jeśli nalegasz) są symetryczne, więc kolejność wprowadzania nie powinna mieć znaczenia do wyniku w każdej poprawnej implementacji, o ile dane wejściowe są liniowe.
Edycja: Dzięki hjk za krótsze sugestie dotyczące składni funkcji.
źródło
t() { ... }
zamiastfunction t
? Można tam zapisać niektóre postacie. :)<<<
aby zapisać kolejne cztery znaki.Befunge 93-375
Pobiera ciąg binarny jako dane wejściowe.
Czyta ciąg. Bruteforce zapisuje go (najbardziej prawy pionowy pasek) jako macierz pomiędzy
dodawanie kraty (idk). Określa sumę kolumn, wierszy i dwóch diagnoz. Porównuje te wartości do 3 („wygrana”) lub 0 („przegrana”), w przeciwnym razie, jeśli wszystkie wartości będą równe 1 lub 2, to losuje („kot”).
źródło
GolfScript, 27 znaków
Format wejściowy to ciąg składający się z ośmiu cyfr ósemkowych, z których każda (nadmiarowo) koduje trzy kolejne kwadraty na planszy:
Aby zakodować sekwencję (wiersz / kolumna / przekątna) trzech kwadratów jako cyfrę ósemkową, zamień każdy
x
w sekwencji na 1, a każdyo
na 0, i zinterpretuj wynikową sekwencję zer i jedynek jako liczbę binarną od 0 do 7 włącznie.Ten format wejściowy jest całkowicie zbędny (wszystkie pozycje deska kodowane są co najmniej dwa razy, z pozycji centralnej kodowane cztery razy), ale nie w sposób jednoznaczny oznaczają ewentualnego stanu całkowitego wypełnienia płyty Tic-krzyżyk, a nie bezpośrednio zakodowania zwycięzca w danych wejściowych.
Dane wejściowe mogą opcjonalnie zawierać spacje lub inne ograniczniki między cyframi. W rzeczywistości wszystkim, na czym naprawdę zależy programowi, jest to, czy ciąg wejściowy zawiera cyfry,
7
czy nie0
.Na przykład tablica przykładowa:
mogą być reprezentowane przez dane wejściowe:
Dla wygody, oto program GolfScript do konwersji układu płytki graficznej ASCII, jak pokazano w powyższym wyzwaniu, na ciąg wejściowy odpowiedni dla tego programu:
Konwerter ignoruje wszelkie znaki inne niż
x
io
, w obu przypadkach, w danych wejściowych. Tworzy jednocyfrowe ciągi znaków (wraz z ogranicznikami spacji, jak pokazano powyżej), odpowiednie do wprowadzenia do powyższego programu określającego wygraną, więc konkatenację tych dwóch programów można wykorzystać do ustalenia zwycięzcy bezpośrednio z tablicy artystycznej ASCII.Ponadto, oto odwrócony konwerter, aby pokazać, że wejście rzeczywiście jednoznacznie reprezentuje płytkę:
Ps. Oto demo online tego rozwiązania.
źródło
Python 2 - 214 bajtów
Jestem pewien, że należy wprowadzić ulepszenia.
Biegać:
który reprezentuje ten zarząd:
Wyjścia z
NameError
wyjątkiem w każdym przypadku z wyjątkiemcat
.źródło
<<<
! +1 za to../whatever <<< 'blah blah blah'
jest taki sam,echo -n 'blah blah blah' | ./whatever
ale bez osobnego procesu dlaecho
.echo
wbash
jest właściwie wbudowany, więc nie rozwidla nowego procesuHaskell, 146 znaków
DOBRZE :). Moja reprezentacja planszy to jedna z tych 126 postaci
Oto rozwiązanie dla 146 znaków:
A oto jak to działa, jako skrypt haskell:
źródło
JavaScript, 420 znaków
W tej wersji
s
zawiera liczbę całkowitą, która reprezentuje stan planszy. Jest to tablica bitów wartości, w której dwa bity reprezentują każdy kwadrat na planszy:10
- X11
- O00
- Pusty kwadratTo rozwiązanie wykorzystuje manipulację bitową do testowania każdej z ośmiu możliwych konfiguracji „trzy z rzędu” (testuje je dwa razy, raz dla X i raz dla O).
Przedstawiam to z drobnymi drobiazgami na mojej stronie Kółko i krzyżyk, gdzie ta
detectWin
funkcja jest używana jako część prawdziwej gry Kółko i krzyżyk .źródło
Ruby, 84 znaków
Proste rozwiązanie oparte na RegExp. Format wejściowy to 9-cyfrowy ciąg binarny, np
110101001
Dla przykładowej płytki podanej w pytaniu.Ruby, 78 znaków
Format wejściowy:
xxo_xox_oox
źródło
Haskell, 169
Format wejściowy: „X” jest reprezentowany tylko przez
x
, „O” tylko przezo
. W każdym rzędzie znaki są równoczesne bez spacji itp. Wiersze są oddzielone nowymi wierszami.Generuje wszystkie możliwe wiersze / kolumny / przekątne, następnie filtruje
[("ooo","lose"),("xxx","win")]
według ich istnienia na planszy, a następnie wybiera drugie słowo w krotce, abyśmy wiedzieli, którzy gracze zwyciężyli. Przygotowujemy się"cat"
, abyśmy mogli wziąć ostatni element listy jako naszego zwycięzcę. Jeśli obaj gracze wygrają,"win"
będzie ostatni (listy ze zrozumieniem utrzymują porządek). Ponieważ"cat"
zawsze jest pierwszy, jeśli zwycięzca istnieje, zostanie on wybrany, ale w przeciwnym razie ostatni element nadal istnieje, ponieważ wyprzedzanie"cat"
gwarantuje brak pustki .EDYCJA: Ogolono 3 znaki, zmieniając sposób interpretowania ostatniej listy na
map
.źródło
C, około 150
Jest północ i nie przeprowadziłem żadnych testów , ale i tak opublikuję tę koncepcję. Wrócę do tego jutro.
Użytkownik wprowadza dwie liczby ósemkowe (chciałem użyć wartości binarnych, ale o ile wiem C obsługuje tylko liczby ósemkowe):
a
oznacza kwadrat środkowy, 1 dla X, 0 dla Ob
to dziewięciocyfrowa liczba reprezentująca kwadraty obwodowe, okrążająca planszę, rozpoczynająca się w jednym rogu i kończąca się w tym samym rogu (tylko z powtórzeniem tego rogu), 1 dla X, 0 dla O.Istnieją dwa sposoby na wygraną:
środkowy kwadrat to X (
a
= 1), a dwa przeciwległe kwadraty to także X (b&b*4096
jest niezerowy)trzy sąsiadujące kwadraty obwodowe to X (
b/8 & b & b*8
jest niezerowa). Jest to ważna wygrana tylko wtedy, gdy środkowy kwadrat jest kwadratem krawędzi, a nie kwadratem narożnym, dlatego konieczne jest również zastosowanie maskim
, aby uniknąć kwadratowych narożników.Przegrywanie jest wykrywane za pomocą zmiennej c, która jest odwrotnością b.
źródło
m
w wykrywaniu „zagubienia” -c/8&c&c*8
. Zmodyfikowałem Twój kod (bez testowania jego działania) w następujący sposób:int a,b;t(v){return a&&v&v<<12||v/8&v&v*8&0x208208;}main(){scanf("%o%o",a,b);printf("%s",t(b)?"win":t(b^0x1249249)?"lose":"cat");}
(130 znaków). Powtarzany test był wystarczająco długi, aby wyodrębnić go do funkcji testowejt()
; eliminuje to potrzebęc
im
; stałe zamienione na hex, aby zapisać jeden znak każdy.printf
nie potrzebuje ciągu formatującego - wystarczy podać ciąg wynikowy jako format - lubputs
taki, ponieważ pytanie nie wymaga nowego wiersza po wyjściu! (zapisuje kolejne 7 znaków).Grzmotnąć,
107103Generuje i uruchamia skrypt sed.
Format I / O:
oxo-oox-xoo
wyjścialose
(użyj a-
do oddzielenia wierszy). Wejście na standardowe wejście. Wymaga GNU sed dlac
polecenia.Zinterpretowałem zasadę 5 jako „jeśli możliwe jest zarówno zwycięstwo, jak i przegrana, wybierz zwycięstwo”.
Kod główny
To jest właściwa odpowiedź.
Naprawdę nic ciekawego. Definiuje,
$b
jak/cwin
zapisywać postacie, następnie definiuje część skryptu dotyczącą warunku wygranej, a następnie używased y/x/o/\;s$b/close/
do konwersjix
doo
icwin
doclose
(tym samym generując warunki przegranej). Następnie wysyła dwie rzeczy iccat
(które zostaną wyświetlone,cat
jeśli nie zostanie spełniony warunek wygranej / przegranej) do sed.Wygenerowany kod
To jest skrypt sed generowany i uruchamiany przez skrypt Bash.
W wyrażeniach regularnych
.
dopasowuje dowolną postać i po niejcTEXT
wyrażeniach regularnych drukuje TEKST i kończy działanie, jeśli wyrażenie jest dopasowane.Może to działać jako samodzielny skrypt sed. Ma on 125 znaków, można go liczyć jako kolejne rozwiązanie.
źródło
Python 3, 45
Wprowadzono dane wejściowe
i
, czyli listę liczb reprezentujących każdy rząd, kolumnę i przekątną planszy, np .:jest reprezentowany przez
[6, 2, 1, 4, 6, 1, 7, 4]
.Kod :
('cat','lose','win')[2 if 7 in i else 0 in i]
źródło
Dart - 119
(Zobacz dartlang.org ).
Oryginalna wersja wykorzystująca RegExp: 151 znaków.
W wierszu polecenia wpisuje się 11 znaków, np. „Xxx | ooo | xxx”. Jako separator można użyć dowolnego znaku innego niż xo.
Wiodące białe znaki i znaki nowej linii należy pominąć przed zliczaniem znaków, ale w miarę możliwości odcinam wewnętrzne białe znaki. Chciałbym, aby istniał mniejszy sposób na utworzenie podciągu.
Recusive wersja bit-base: 119 znaków. Dane wejściowe muszą być liczbą 9-bitową, przy czym 1s oznaczają „x”, a 0s oznaczają „o”.
źródło
CJam,
39 3836 znakówTo jest podstawowy konwertowany kod dla
który ma 52 znaki.
Dane wejściowe to po prostu ciąg znaków reprezentujący tablicę, zaczynając od lewego górnego rogu, przechodząc rząd po rzędzie. Na przykład:
co daje
win
wynik. Lubco daje
cat
wynik itp.Kod po prostu wykonuje następujące trzy czynności:
q3/_
- Podziel ciąg na części po 3, tj. Na rząd_z
- Skopiuj tablicę na wiersz i transponuj na tablicę na kolumnę.__Wf%s4%
- Odwróć każdy rząd i uzyskaj przekątną od lewej do prawej. Jest to wtórna przekątna planszy.\s4%
- Zdobądź główną przekątną planszy]`
- Zawiń wszystko w tablicę i uszereguj tablicę.Teraz mamy wszystkie możliwe grupy 3 z planszy. Sprawdzamy po prostu obecność „ooo” i „xxx”, aby ustalić wynik.
Wypróbuj online tutaj
źródło
GNU sed, 25 bajtów
Jeśli dane wejściowe to nadmiarowa reprezentacja planszy z osobnymi widokami dla kolumn, wierszy i przekątnych, jak również w innych odpowiedziach, wtedy sed bardzo dobrze nadaje się do sprawdzania stanu końcowego gry z najmniej bajtami.
Format wejściowy:
xxx ooo xxx xox xox xox xox xox
(stan płytki pochodzi z pytania PO)Jeśli format wejściowy nie jest redundantny (
xxx ooo xxx
), to powyższy kod sed działa tylko wtedy, gdy poprzedzony jest wierszem poniżej, co powoduje, że program ma 96 bajtów długości (z wymaganąr
flagą).źródło
Bash: 208 znaków
Wykonać
bash tictactoe.sh 0 1 0 1 0 1 1 0 1
Zainspirowany tą odpowiedzią .
źródło
VB.net
W tym przykładzie dostarczony jest kodowany jako następujący wzór bitowy
Teraz możemy ustalić wynik (lub zwycięzcę), wykonując następujące czynności.
źródło
J - 97 bajtów
Najprostsze dostępne podejście. Dane wejściowe przyjmuje się jako
111222333
, gdzie liczby reprezentują wiersze. Czytaj od lewej do prawej. Gracz jest,x
a wróg jesto
. Pustymi kwadratami może być cokolwiek opróczx
lubo
.Przykłady: (NB. To komentarz)
Niegolfowany kod wyjaśnienia
źródło
Python 2, 120 bajtów
Lub Python, 115 bajtów z powłoki Python (2 lub 3):
Zmienna planszowa jest ustawiona na format binarny opisany w pytaniu:
1
dla X,0
dla O, od lewej do prawej, od góry do dołu. W tym przypadku101001110
reprezentujeCo prowadzi do wyjścia:
Cat
źródło
Python (
7362 znaków)Dane wejściowe to cztery małe litery reprezentujące cztery różne widoki tej samej tablicy, wszystkie połączone w jeden ciąg: wiersz, kolumna, prawa-przekątna, lewa-przekątna.
AKTUALIZACJA
Dzięki theRare za zwrócenie na to uwagi dobrym przykładem! Każdy widok planszy wraz z każdym segmentem (rzędem lub kolumną) w obrębie tablicy musi być oddzielony znakiem, który nie jest ani „x”, ani „o”, aby struktura tablicy została zachowana nawet po konkatenacji. Obramowania wokół każdego widoku tablicy będą nawiasami kwadratowymi („[” i „]”), a separatorem między wierszami / kolumnami będzie znak „”.
To sprawia, że algorytm jest prosty - po prostu wyszukaj „xxx” lub „ooo” odpowiednio dla wygranej lub przegranej. W przeciwnym razie jest to remis (cat).
Np. Tablica (czytanie od lewej do prawej, od góry do dołu) ...
X | X | X X | O | X O | X | O
... jest reprezentowany jako „[xxx | xox | oxo]” (przez rzędy) + „[xxo | xox | xxo]” (przez kolumny) + „[xoo]” (prawy diag) + [xoo] ”(po lewej diag) = "[xxx | xox | oxo] [xxo | xox | xxo] [xoo] [xoo]".
Ta instrukcja Python wypisuje wynik gry, biorąc pod uwagę zmienną s jako dane wejściowe:
źródło
OXX XOO XOX
(powinien to być kot)?Haskell (69 znaków)
To wymaga takiego samego wkładu, jak opisano w tej odpowiedzi . Mówiąc dokładniej, wejściem jest 8 wartości ósemkowych, opisujących wartość binarną każdego wiersza, kolumny i przekątnej. Kod powoduje, że każde wystąpienie 7 „wygrywa”, każde wystąpienie 0 „przegrywa” i usuwa wszystko inne. Następnie dodaje „cat” na końcu i pobiera pierwsze 4 znaki z wyniku.
Będą 4 możliwe odpowiedzi: „przegrać”, „kot”, „wygrać”, a następnie „l”, i „wygrać”, a następnie „c”, których reguły nie zabraniają :)
Przykładowe użycie:
źródło
J: 83
Zastosowanie: wystarczy dołączyć ciąg znaków X i O i obserwować magiczną pracę. na przykład. „xxxoooxxx”.
Wewnętrzny czasownik
(+/@:(*./"1)@;@(;((<0 1)&|:&.>@(;|.)(,<)|:)))
zasadniczo zawiera razem oryginalną macierz binarną, a transpozycja jest zapakowana razem z 2 przekątnymi. Te wyniki są zrównane z sobą; sumy wierszy są pobierane w celu ustalenia wygranych, a następnie sumowane. dalej nazywam to czasownikiemInner
.Aby znaleźć zwycięzcę, różnica wyników między normalną a odwróconą macierzą binarną jest brana pod uwagę
(-&Inner -.)
.Reszta kodu po prostu tworzy dane wyjściowe i wybiera właściwy.
źródło
JavaScript,
133, 114 znakówDane wejściowe
i
to prosty ciąg z ogranicznikami wierszy, tj100|001|100
Edycja: zaktualizowałem moją metodę, aby zastąpić jedynką w wyrażeniu regularnym zerami, aby sprawdzić przypadek straty.
źródło
=
i cudzysłowy wokół wyrażenia regularnego. Ponadto,1...
jeden znak jest krótszy niż1.{3}
.r.test(i)
jest także o jedną postać krótszy niżi.match(r)
.J - 56 (26?) Char
Dane wejściowe otrzymują macierz 3x3 dziewięciu znaków, ponieważ J może to obsługiwać jako typ danych, LOL.
Przykłady:
Jeśli wolno nam kodować Golfscriptish cyfr ósemkowych nadmiarowo reprezentujących stan każdego wiersza, kolumny i przekątnej, to jest to tylko 26 znaków:
źródło
T-SQL (2012), 110
select max(iif(@&m=0,'lose',iif(@&m=m,'win','cat')))from(VALUES(292),(146),(73),(448),(56),(7),(273),(84))z(m)
Dane wejściowe to liczba szesnastkowa. To jest prawie tłumaczenie tłumaczenia ruby na T-SQL całkiem ładnie i schludnie.
źródło
JavaScript 1.6, 71 znaków
Zakładam, że dane wejściowe są tablicą,
game
która zawiera każdy wiersz, każdą kolumnę i każdy diag jako ciąg 3 znaków. Podobna do odpowiedzi boba , ale występuje w tablicy, a nie w postaci połączonego łańcucha.Edycja komentarza @ nyuszika7h (67 znaków)
źródło
~game.indexOf("xxx")
zamiastgame.indexOf("xxx")>=0
, to samo dla drugiego.Java 7, 260 bajtów
Przypadki bez golfa i testy:
Wypróbuj tutaj.
Wynik:
źródło
APL (NARS), 69 znaków, 138 bajtów
Dane wejściowe powinny być jedną matrycą 3x3 lub jedną liniową tablicą 9 elementów, która może być tylko 1 (dla X) i 0 (dla O), wynikiem będzie „kot”, jeśli nikt nie wygra, „przegrana”, jeśli O wygra, ”wygrana „jeśli X wygra. Nie ma możliwości sprawdzenia jednej nieprawidłowej płytki lub danych wejściowych, czy jedna tablica ma mniej niż 9 elementów lub więcej, lub sprawdź każdy element <2.
Jako komentarz: przekształci dane wejściowe w macierz 3x3 i zbuduje jedną tablicę o nazwie „x”, w której elementy są sumą każdej kolumny wiersza i przekątnej.
Niektóre testy patrz przykład pokazany przez innych:
źródło