Wyzwanie zaczerpnięte z mojego konkursu na kod uniwersytecki
To właściwie Dzień 0, ale wczorajsze wyzwanie było zbyt łatwe i może być duplikatem innego pytania tutaj.
Tetris to gra wideo, która stała się popularna w latach 80. Polega ona na umieszczeniu szeregu elementów o różnych kształtach, które spadają na deskę, aby pasowały w możliwie najbardziej kompaktowy sposób.
W tym problemie założymy sekwencję spadających kawałków, każda w określonej pozycji i o określonej orientacji, której nie można zmienić. Kawałki są ułożone w stos, gdy spadają, a pełne rzędy nie są eliminowane (jak w oryginalnej grze). Celem jest ustalenie ostatecznej wysokości każdej kolumny planszy po upadku wszystkich elementów.
Istnieje 7 różnych elementów pokazanych na rysunku:
Wyzwanie
Biorąc pod uwagę listę elementów, wypuść wysokość wszystkich kolumn z planszy po opadnięciu wszystkich elementów
Kawałek składa się z trzech liczb: I, R i P. Pierwsza liczba, I, jest identyfikatorem kawałka (liczba od 1 do 7, w tej samej kolejności, jak na rysunku). Druga liczba, R, oznacza obrót kawałka. Może przyjmować wartości 0, 90, 180 lub 270 i reprezentuje kąt obrotu elementu w kierunku przeciwnym do ruchu wskazówek zegara. Trzecia liczba, P, wskazuje pozycję utworu. Reprezentuje kolumnę po lewej stronie zajmowaną przez element (może to być indeks 1 lub 0. Proszę określić).
Przykład i przypadek testowy (1 indeks)
- Dany
[[1, 0, 1], [4, 0, 1], [5, 90, 4]]
- Wynik
[3, 3, 1, 3, 2]
- Dany
[[6, 270, 4], [1, 180, 5], [1, 90, 6], [7, 0, 4]]
- Wynik
[0, 0, 0, 9, 9, 8, 3, 3]
Podana
[[3,0,1],[3,180,3]]
wydajność[1,1,4,4,4]
Podana
[[2,180,1],[2,0,3]]
wydajność[2,2,4,3,3]
Notatki
- To jest golf golfowy
- Wiersz / kolumna może mieć indeks 1 lub 0. Proszę sprecyzuj.
- Możesz ponownie zdefiniować wartości wejściowe (być może chcesz nazwać element 1 jako A itp.). W takim przypadku proszę określić
pytania
Czy możemy użyć dowolnych 4 różnych wartości zamiast kąta w stopniach ?: Tak
Czy mamy radzić sobie z „dziurami”, jeśli element nie pasuje dokładnie do poprzednich ?: Tak
Czy wysokość lub szerokość deski jest ograniczona? Nie. Szerokość ani wysokość nie są ograniczone
Dzięki @Arnauld za obrazy i przypadki testowe *. *
I
,R
aP
być wprowadzane w innej kolejności?Odpowiedzi:
JavaScript (Node.js) ,
286 284 270266 bajtówWypróbuj online! lub wypróbuj ulepszoną wersję, która wyświetla także ostateczną tablicę.
Kodowanie kształtu
Wszystkie elementy są przechowywane jako dokładnie 4 skrawki (4x4 bity) z rzędami posortowanymi w odwrotnej kolejności, a piksel skrajnie lewy odwzorowany na najmniej znaczący bit. Innymi słowy, binarna reprezentacja kształtu jest odbijana zarówno pionowo, jak i poziomo.
Przykład:
Funkcja skrótu i tabela odnośników
Tylko pierwsze wpisy są jawnie przechowywane. Cała reszta jest ustawiona na .82 0
Te wpisy są pakowane jako:
która rozwija się do następujących 82 skubków:
Użycie formatu szesnastkowego w ostatecznym formacie jest wymagane tylko dla dwóch poziomych reprezentacji kawałka , stąd powyższy ciąg.I
"ff"
Parametry funkcji skrótu zostały brutalnie wymuszone w sposób, który optymalizuje wiodące i końcowe zera. Fakt, że ciąg można jeszcze bardziej skompresować za pomocą
1e12
zer po środku i konwersji z base-16 na base-4 dla prawej części, jest po prostu pożądanym, ale nieoczekiwanym efektem ubocznym. :-)Oto demonstracja procesu rozpakowywania wszystkich sztuk i wszystkich obrotów.
Skomentował
źródło
C (clang) ,
253239221212 bajtówWypróbuj online!
ps W rzeczywistości rozmiar kodu wynosi 221 bajtów (ale 212 znaków) z powodu znaków UNICODE zakodowanych w UTF-8. Ale tio.run traktuje to jako kod 212 bajtów ...
Rozmiar kodu na moim komputerze to 209 znaków (218 bajtów). Ale nie mogłem zastąpić
\225
widocznym char w tio.run 😞Nieskluczony kod
Opis
Znajdźmy górną linię podstawową ( TBL ) każdej figury i opiszmy ją jako liczbę komórek poniżej TBL dla każdej pozycji poziomej. Opiszmy także liczbę komórek (wysokość) powyżej TBL ( HAT ).
Na przykład:
Opiszmy TBL i HAT dla każdej figury i każdego kąta obrotu:
Teraz trzeba kodują te numery jako sekwencje 2 bitów i wprowadzane do macierzy (zastępującego
4 0
przy3 1
90 ° kącie „linia”, aby zmieścić się w 2 bity - efekt będzie taki sam, i zmniejszania szerokości od 1).Będziemy kodować w kolejności: szerokość (w 2 LSB), TBL , HAT (wstecz dla pętli wstecznej). Na przykład
2 2 1 1 0
do 270 ° kąta T rysunku są kodowane jako1 0 1 2 1
(ostatnia 1 ma szerokość 1 )0b0100011001 = 281
.aktualizacja 12.02:
a) Przekształciłem tablicę na ciąg i zapisałem 18 znaków (możesz zobaczyć poprzedni kod 239 bajtów ) :))
b) Większa optymalizacja, kod jest zmniejszony o 9 znaków.
To moja ostatnia próba (tak myślę, lol!) 😀
źródło
<s> ... </s>
.Common Lisp, 634 bajty
Gadatliwy
Sprawdź to
Kawałki są okrągłymi listami liczb. Każda z tych list podrzędnych reprezentuje bok kształtu, liczby wskazujące, jak daleko są od przeciwnej strony. Są one od lewej do prawej, gdy ta strona znajduje się na dole, od prawej do lewej, gdy jest u góry, od góry do dołu, gdy jest po lewej stronie, i od dołu do góry, gdy jest po prawej stronie. Te opcje projektowania eliminują potrzebę pisania kodu do rotacji. Niestety, brak kodu rotacji nie nadrobił długich reprezentacji kształtów lub nieco skomplikowanej logiki, której użyłem do obliczenia nowych wysokości kolumn.
Rotacja jest nieujemną liczbą całkowitą. 0 = 0 stopni, 1 = 90 stopni, 2 = 180 stopni, 4 = 270 stopni
źródło
C # (interaktywny kompilator Visual C #) , 308 bajtów
Wypróbuj online!
OK - To było szaleństwo ... Przekazałem odpowiedź, w której stosowałem techniki gry w golfa. Ale kiedy zobaczyłem, co podchodzą inni, zrozumiałem, że jest lepszy sposób.
Każda
(shape, rotation)
krotka jest kodowana w dosłownym ciągu znaków C # z usuniętymi duplikatami. Proces kodowania rejestruje każdą z tych konfiguracji w 2 bajtach.Najniższa wysokość 3 bitów i szerokość następnych 3 bitów. Ponieważ każda z tych wartości nigdy nie jest większa niż 4, można je odczytać bezpośrednio z 3 bitów bez jakiejkolwiek konwersji. Oto kilka przykładów:
Następnie każda kolumna jest przechowywana w 3 bitach. Najbardziej użyteczną rzeczą do przechowywania była liczba brakujących kwadratów od góry i dołu kolumny.
Nigdy nie brakuje więcej niż 2 kwadratów od góry lub od dołu i nigdy nie brakuje więcej niż 1 kwadratu z obu jednocześnie. Biorąc pod uwagę ten zestaw ograniczeń, wymyśliłem następujące kodowanie:
Ponieważ musimy uwzględnić maksymalnie 3 kolumny z brakującymi kwadratami powyżej lub poniżej, możemy zakodować każdą
(shape, rotation)
krotkę w 15 bitach.Wreszcie zduplikowane kształty zostały usunięte. Poniższy przykład pokazuje, jak wiele
(shape,rotation)
krotek może wytwarzać zduplikowane dane wyjściowe dla tego samego kształtu przy różnych obrotach:Wszystkie unikalne dane wyjściowe są określane i zapisywane w a
byte[]
oraz konwertowane na literał ciągu C #. W celu szybkiego LOOKUP w której kształt jest na podstawieI
, aR
pierwsze 7 bajtów tablicy składa zakodowanego klucza wyszukiwania.Poniżej znajduje się link do programu, którego użyłem do kompresji elementów.
Wypróbuj online!
Kod mniej golfowy i komentowany:
źródło
Węgiel , 98 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe jako tablicę wartości [P, R, I], gdzie I wynosi od 0 do 6, R wynosi od 0 do 3, a P jest również indeksowany na 0. Wyjaśnienie:
Zapętlić elementy wejściowe.
Wyodrębnij opis bieżącego kawałka i rotacji. (Patrz poniżej.)
Wyodrębnij pozycję.
Upewnij się, że jest wystarczająca pozioma przestrzeń do umieszczenia elementu.
Upewnij się, że jest wystarczająco dużo miejsca w pionie, aby umieścić element.
Oblicz nowe wysokości dotkniętych kolumn.
Po przetworzeniu wszystkich elementów wyślij ostateczną listę wysokości kolumn w osobnych wierszach.
Skompresowany ciąg reprezentuje oryginalny ciąg
00001923001061443168200318613441602332034173203014614341642430137
. Tutaj2
s sąI
separatorami i1
s sąR
separatorami. Elementy dekodują zatem w następujący sposób:Brakujące
R
wartości są automatycznie uzupełniane cyklicznie przez węgiel drzewny. Każda cyfra jest następnie odwzorowywana na dwie wartości, zwis i całkowitą wysokość, zgodnie z poniższą tabelą:Zwis i całkowita wysokość odnoszą się do wysokości kolumn w następujący sposób: Biorąc pod uwagę element, który chcemy umieścić w danej pozycji
e
, może być możliwe umieszczenie elementu, nawet jeśli jedna z kolumn jest wyższa niże
. Ilość wolnego miejsca wynika z nawisu. Nowa wysokość kolumny po umieszczeniu elementu jest po prostu położoną pozycją powiększoną o całkowitą wysokość.Przykład: Załóżmy, że zaczynamy od umieszczenia
5
kawałka w kolumnie 1. Ponieważ nie ma nic innego, kawałek jest zatem umieszczany w pozycji 0, a kolumny 1 i 3 mają teraz wysokość 1, a kolumna 2 ma wysokość 2. Chcemy następnie umieścić6
kawałek z1
rotacją w kolumnie 0. Tutaj możemy faktycznie umieścić ten kawałek w pozycji 0; chociaż kolumna 1 ma wysokość 1, element ma zwis 1, więc jest wystarczająco dużo miejsca, aby ją umieścić. Kolumna 0 kończy się na wysokości 2, a kolumna 1 kończy na wysokości 3.źródło