Inspirowany przez xkcd .
Wyzwanie polega na ustaleniu, czy liczba stanowi dobrą kombinację w grze 2048 . Twój wpis będzie liczbą, taką jak:
8224
A wyjście będzie to, czy ta liczba będzie zrobić dobry 2048 kombi, który dla tego wejścia byłby true
lub yes
lub 1
lub inny sposób wskazuje na pozytywny wynik.
Dla tych, którzy nie są zaznajomieni z gry, oto proste wyjaśnienie: potęgami dwójki są rozmieszczone na siatce, tak: [2] [2]
. Płytki można przesuwać w dowolnym kierunku, a jeśli spotykają się dwa identyczne kafelki, stają się one kolejną siłą dwóch (tak więc [2] [2]
po przesunięciu w lewo lub w prawo [4]
). Możesz też po prostu wypróbować grę tutaj .
Co oznacza „dobra kombinacja 2048”? Oznacza dowolną liczbę, która gdyby była w grze „2048”, mogłaby być połączona w jedną liczbę. (Zero oznacza puste miejsce i w razie potrzeby można je zignorować). Pamiętaj, że liczby mogą składać się z wielu cyfr! Jednak liczby nie mogą się zmieniać między ruchami. Oto kilka przykładów / przypadków testowych („Dobry” oznacza dobrą kombinację, a „Zły” oznacza niezadowalający):
- Dobry: 8224 (8224 -> 844 -> 88 -> 16)
- Dobry: 2222 (2222 -> 44 -> 8)
- Dobra: 22048 (22048 -> 448 -> 88 -> 16)
- Źle: 20482 (nie można łączyć zewnętrznych 2, ani nie można łączyć 2048 i 2)
- Dobry: 20482048 (20482048 -> 4096)
- Źle: 210241024 (210241024 -> 22048, ale teraz jest to [2] [2048] i nie można ich łączyć, ponieważ liczby nie mogą się zmieniać między ruchami)
- Dobrze: 2048 (to już jedna liczba)
- Źle: 2047 (to nie jest potęga 2)
- Źle: 11 (w grze nie ma 1)
- Dobrze: 000040000000 (zera to puste spacje)
Różne zasady:
- Dane wejściowe mogą być z dowolnego uzasadnionego miejsca, tj. STDIN, argument funkcji, plik itp.
- Dane wyjściowe mogą być również w dowolnym miejscu uzasadnionym, tj. STDOUT, wartość zwracana przez funkcję, plik itp.
- Zignoruj rozmiar siatki -
22222222
nadal powinien generować wartość true. - Nie jest to maksymalna liczba, która może być, o ile jest to potęga dwóch. Dlatego możliwymi liczbami są dowolne potęgi dwóch większe od 0.
- Dla tych, którzy martwią się zerami powodującymi niejednoznaczność, tak nie jest. Na przykład
22048
może być parsowany jako jeden[2] [2048]
lub[2] [2] [0] [4] [8]
. Pierwszy nie działa, ale drugi działa, więc powinien wypisać true. - To jest golf golfowy , więc wygra najkrótszy kod w bajtach!
1
22048
że dane wyjściowe powinny być generowane,good
ale to nieprawda. Nie możesz się połączyć2
z,2048
a4x4
jeśli wszystkie liczby powinny być oddzielne, otrzymasz 5 komórek. więc może powinieneś usunąć0
? Również twój 5 przykład wydaje się być nieprawidłowy, ponieważ gra zatrzymuje się o2048
:)Odpowiedzi:
GolfScript, 137 znaków
Dane wejściowe należy podać na STDIN. Dane wyjściowe to
0
/1
dla złych / dobrych liczb. Większość kodu jest niezbędna do parsowania możliwych danych wejściowych.Ta krótsza wersja (113 znaków) wykonuje prosty test zmiany, który nie działałby poprawnie w przypadku wprowadzania danych
224422
.Wszystkie przypadki testowe można sprawdzić online .
źródło
Python:
457422 znakówFunkcja f (s) pobiera ciąg cyfr i odpowiednio wyświetla „dobre” lub „złe”. Zdecydowałem się nie używać 0 jako spacji, ponieważ spacje nie mają znaczenia w grze i powodują dwuznaczność podczas analizowania ciągów (czy 22048 jest dobre czy złe?). To używa tylko liczb do 2048, ale można to zmienić bez dodawania znaków. Kosztem około 10 znaków mogę również wydrukować wszystkie etapy łączenia liczb. I zdaję sobie sprawę, że ten kod nie jest jeszcze wystarczająco golfowy; nie martw się, nadchodzą zmiany.
źródło
Haskell:
285 254 253 237 230227użycie - wystarczy załadować go do ghci i przekazać ciąg do h.
Kod:
Komentarz:
i
jest to sprawdzenie, czy liczba jest potęgą 2, zostanie to rozegrane przez języki z nieznacznym przewrotem.%
rekurencyjnie generuje wszystkie parsowania, które są listami potęg 2 lub 0.c
zrzuca płytki.l
rekursywnie sprawdza, czy płytki są składane po lewej lub dobre.g
sprawdza, czy płytki można składać w lewo lub w prawo. Liczby na kafelkach nie są ograniczone - np.h ((show (2^200))++(show (2^200)))
Zwraca true dla 2 kafelków oznaczonych „1606938044258990275541962092341162602522202993782792835301376”.Edytowano, aby naprawić błąd, który nie spowodował prawidłowego zwinięcia „88222288888” po prawej stronie, ale także znalazł więcej możliwości gry w golfa.
źródło
Perl, 175–336 bajtów
Utrzymanie nienaruszonych podstawowych elementów:
[ 64 i 256 prowadzą do słabo rozwiązywalnych dwuznaczności, z którymi chciwe dopasowanie nie jest w stanie sobie poradzić ... ale są to ładne liczby bajtów. ]
źródło
Delfy
572582 znakówEdytowany kod, limit jest ustawiony na 2 ^ 30, więc nie przekroczy wartości MaxInt w Delphi.
Grał w golfa
Nie golfił
EDYTOWAĆ
Zainteresowałem się więc i zastanawiałem, ile z tych kombinacji pasuje do układanki, i przetestowałem ją.
Dla innych, którzy również są ciekawi, wykonaj również test;)
Ale ok, oto wyniki:
20736 combinations were tested and 1166 were great combinations
Muszę powiedzieć kombinacje 3 lub więcej zer zostały pominięte (sens prawda?)
Kombinacje są niemal unikatowe, czyli kombinacje
2248
,8224
,8422
i4228
wszystkie były liczone jako wielki kombinacji.źródło
Mathematica - 218 bajtów
Wersja bez golfa:
Internal\
PartitionRagged` magia pochodzi z tego pytania .To rozwiązanie obsługuje dowolne rozmiary siatki i dowolnie duże liczby.
Oto 195-bajtowa wersja, która działa jak rzeczywista gra z maksymalnie 4 płytkami (tak
f[22222222]
jestFalse
):gdzie wymieniłem
z
źródło
DeleteCases
wygląda na to, że usuwa pary skrajnie lewe, więc sięf[88222288888]
nie powiedzie?DeleteCases
wystarczy usunąć zera i liczby, które nie są potęgą dwóch. Rzeczywiste zwijanie par odbywa się według reguły//. {a___, x_, x_, b___} :> {a, 2 x, b}
, która działa dla tej liczby i jej odwrotności. Właściwie nie jestem całkowicie pewien, w jakiej kolejności Mathematica stosuje te zamienniki, ale działa.Haskell - 260
263f
jest funkcją. Przykłady:Małe wyjaśnienie:
p
zwraca wszystkie sposoby podziału listy.q
filtruje te, które składają się tylko z potęg 2, (wyłączając 1, ale włączając 0).c
próbuje zwinąć ciąg.r
iteruje prawe i lewe zwinięcie, aż pozostanie tylko 1 element lub łańcuch nie będzie składany.źródło
c
, spróbuj „222244442222” - zwraca wartość prawda, ale nie można tego złożyć w grze. Musi powrócić z(2*x):c s
.