Opis
Rozważamy nieco uproszczoną wersję Tetris, w której każdy ruch składa się z:
- obracając element zgodnie z ruchem wskazówek zegara, od 0 do 3 razy
- pozycjonowanie elementu w danej kolumnie
- szybki spadek
Celem jest określenie liczby ukończonych linii, biorąc pod uwagę listę takich ruchów Tetris.
Ukończone rzędy są usuwane w miarę upuszczania elementów, zgodnie ze standardowymi zasadami Tetris.
Boisko
Pole gry ma szerokość 10 kolumn. Nie ma końca gry i zakłada się, że zawsze jest wystarczająco dużo miejsca i czasu na wykonanie powyższych czynności, bez względu na konfigurację pola gry. Wysokość pola gry tak naprawdę nie ma znaczenia, ale możesz użyć standardowych 22 rzędów jako górnej granicy.
Kształty Tetrominoes
Wejście wyjście
Wkład
Rozdzielona przecinkami lista ruchów Tetris zakodowanych 3 znakami. Pierwsze dwie znaki opisują kształt Tetromino, a ostatni opisuje pozycję, w której został upuszczony.
- Tetromino:
I
,O
,T
,L
,J
,Z
iS
, w tej samej kolejności, jak opisano powyżej. - Liczba obrotów w prawo:
0
do3
- Kolumna:
0
do9
. Jest to kolumna, w którejx
po obrocie znajduje się lewy górny róg elementu (oznaczony na powyższym obrazku) 1
Zakłada się, że wszystkie ruchy na podanej liście są prawidłowe. Nie trzeba sprawdzać, czy nie ma niepoprawnych wpisów, takich jak I07
( I
kształt poziomy umieszczony zbyt daleko po prawej stronie).
1 Możesz zaimplementować prawdziwy algorytm obrotu lub na stałe zakodować wszystkie różne kształty, o ile x
jest on umieszczony w kolumnie podanej przez trzeci znak ruchu.
Wydajność
Liczba ukończonych linii.
Przykład
O00,T24
wygeneruje pierwszą pozycję i O00,T24,S02,T01,L00,Z03,O07,L06,I05
wygeneruje drugą pozycję.
Dlatego następująca sekwencja wygeneruje Tetris i powinna zwrócić 4
:
O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19
Przypadki testowe
1) "O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19" -> 4
2) "S00,J03,L27,Z16,Z18,I10,T22,I01,I05,O01,L27,O05,S13" -> 5
3) "I01,T30,J18,L15,J37,I01,S15,L07,O03,O03,L00,Z00,T38,T01,S06,L18,L14" -> 4
4) "S14,T00,I13,I06,I05,I19,L20,J26,O07,Z14,Z10,Z12,O01,L27,L04,I03,S07,I01,T25,J23,J27,O01,
I10,I10" -> 8
5) "O00,T24,L32,T16,L04,Z11,O06,L03,I18,J30,L23,Z07,I19,T05,T18,L30,I01,I01,I05,T02" -> 8
Strona testowa
Możesz użyć tego JSFiddle do testowania listy ruchów.
Odpowiedzi:
PHP,
405399378372368360354347331330328319309300 bajtów(z mapowaniem bloków Dave'a )
program, przyjmuje ruchy jako osobne argumenty, wyświetla wynik
podział na funkcje:
przyjmuje ruchy jako tablicę, zwraca wynik
w celach informacyjnych: stare mapowanie
testowanie
zobacz moją inną odpowiedź na PHP
Chcę obejrzeć?
usuń
#
ze źródła funkcji i dodaj to:kilka kroków w golfa
Obj 5: Big Leap (399- 21 = 378) był po prostu przesuwając przesunięcie kolumny
z osobnej pętli do dwóch istniejących pętli.
Rev. 8: Przejście z tablicy na bazę 16 za sztukę ($ s) nie dało wiele,
ale ustąpiło miejsca trochę golfa.
Wersja 17: łączyć wartości z
base64_encode(pack('V*',<values>))
indeksowaniem bajtów i stosowaniem zamiast
unpack
zapisywania 16 bajtówRev 25 do 29: zainspirowany kodem Dave'a: nowy skrót (-2), nowy projekt pętli (-9), goto (-10)
bez wcześniejszej zmiany; to kosztowałoby 17 bajtów.
większy potencjał
Za pomocą
/2%9
mogę zapisać 15 bajtów (tylko 14 bajtów/4%5
), umieszczając dane binarne w pliku,
b
a następnie indeksującfile(b)[0]
.Czy tego chcę?
Postacie UTF-8 kosztowałyby dużo transformacji.
na haszowanie
Użyłem
ZJLO.ST /2%9 -> 0123.56
; aleT.ZJLOS /3%7 -> 0.23456
jest równie dobry.jeden bajt dłużej:
O.STJLZ %13/2 -> 0.23456
i jeszcze trzy:
OSTZJ.L %17%12%9 -> 01234.6
Nie mogłem znaleźć krótkiego skrótu (maks. 5 bajtów), który nie pozostawia luki;
ale Dave znalazł
STZJL /4%5 -> 01234
, usuwając O z listy. wtg!btw:
TIJSL.ZO (%12%8) -> 01234.67
pozostawia miejsce dlaI
kształtu(i fikcyjna
A
,M
lubY
kształt).%28%8
i%84%8
zrób to samo (ale zE
zamiastA
).źródło
break 2
jest znacznie czystsze niż to, co musiałem zrobić w C! Państwo może być w stanie zaoszczędzić kilka bajtów za pomocąarray_diff
(zestaw zakończone linie do ustalonej wartości, zamiast używaćunset
następnie zastąpićarray_values
zarray_diff
), ale nie mogę powiedzieć z docs, jeżeli byłoby spłaszczyć powtarzające się wartości (np array_diff ([1,2, 2,3], [1]) -> [2,2,3] lub po prostu [2,3])array_diff
nie usuwa zduplikowanych wartości; i mam już stałą wartość (1023); ale nie reindeksuje tablicy. Świetny pomysł, ale kosztowałby bajt./10
wszędzie), ale poza tym myślę, że skończone. Jestem zaskoczony, jak bezpośrednio konkurencyjne były PHP i C. To była świetna zabawa - mam nadzieję, że OP zaakceptuje twoją odpowiedź!if
.C
401392383378374351335324320318316305 bajtówPobiera wejście rozdzielone przecinkami na standardowe wejście, zwraca wynik w statusie wyjścia.
Wymaga
char
podpisania (co jest domyślnym ustawieniem GCC) i wymaga'3Z3Z'
interpretacji jako 861549402 (co ma miejsce w przypadku GCC na małych komputerach z systemem Endian).Przykład użycia:
Wyjaśnienie na wysokim poziomie:
Wszystkie kształty oprócz linii można zmieścić na siatce 3x3 z brakującym jednym rogiem:
Oznacza to, że łatwo jest przechowywać je w bajtach. Na przykład:
(wyrównujemy każdy element do dolnej lewej części pudełka, aby ułatwić upuszczenie)
Ponieważ otrzymujemy co najmniej 4 bajty do liczby całkowitej, oznacza to, że możemy przechowywać wszystkie 4 obroty każdego elementu w jednej liczbie całkowitej, ze specjalnym przypadkiem dla linii. Możemy również dopasować każdy rząd siatki gry do int (potrzebuje tylko 10 bitów), a aktualnie spadający kawałek do długiej (4 linie = 40 bitów).
Awaria:
-4, -1 dzięki @Titus i -23, -11 z inspiracją z ich odpowiedzi
źródło
s+=(d[A-x]=d[A])
bez użyciax
?x
jest potrzebne, aby śledzić, ile wierszy do zapaści w obecnym etapie (każdy wierszA
jest ustawiony na wartości rzęduA-x
co postępami pętla)1[a]
ia[1]
rób to samo (a dokładnieja[b]
tłumacząc*(a+b)
). Jest to nadużywane w ten sposób, aby uniknąć nawiasów klamrowych. W tym przypadku1[*v]
==(*v)[1]
, tj. Druga litera polecenia, tj. Obrót.I
symbolu zastępczego? Jeśli tak, spróbuj/2%9
jako hash zamiast%12
.%12%8
Jeśli nie.Rubinowy,
474443428379 + 48 = 427 bajtów-1 dzięki @Titus
Można zdecydowanie bardziej grać w golfa.
Czyta binarny słownik elementów (patrz poniżej) ze STDIN lub nazwy pliku i przyjmuje listę ruchów jako argument, np
$ cat pieces | ruby script.rb O00,T24,S02,...
.Dane binarne (format xxd)
Zobacz na repl.it (z zakodowanymi argumentami, słownikiem): https://repl.it/Cqft/2
Nie golf i wyjaśnienia
źródło
m >> 10
może byćm >> x
\d
s w wyrażeniu regularnym:/(\w)(\d)(\d)/
→/(\w)(.)(.)/
PHP,
454435427420414 bajtówpola bitowe na kawałki i mapę; ale nie ma specjalnego przypadku dla
I
kształtu jak golf Dave'a.pobiera argumenty z wiersza poleceń, wyświetla wynik
niepoddane golfowi jako funkcja
przyjmuje argumenty jako tablicę, zwraca wynik
testy (w funkcji)
źródło
<?
koszty ogólne :)