Pozwala zdefiniować proces zgniatania tablicy liczb. W sympatii czytamy tablicę od lewej do prawej. Jeśli w pewnym momencie napotkamy dwa takie same elementy w rzędzie, usuwamy pierwszy i podwajamy drugi. Na przykład tutaj jest proces zgniatania następującej tablicy
[5,2,2,3]
^
[5,2,2,3]
^
[5,2,2,3]
^
[5,4,3]
^
[5,4,3]
^
Ten sam element może być wielokrotnie zwinięty, na przykład [1,1,2]
staje się [4]
po zmiażdżeniu.
Nazwiemy tablicę niezniszczalną, gdy proces zmiażdżenia tej tablicy nie zmieni jej. Na przykład [1,2,3]
wciąż jest [1,2,3]
po zmiażdżeniu.
Twoim zadaniem jest wziąć tablicę i określić liczbę zmiażdżeń wymaganych, aby uczynić ją niemożliwą do zniszczenia. Potrzebujesz tylko liczb całkowitych z zakresu od 0 do 2 32 -1
To jest golf golfowy, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.
Przypadki testowe
[1] -> 0
[1,1] -> 1
[2,1,1] -> 2
[4,2,1,1] -> 3
[2,2,2,1,1] -> 3
[0,0,0,0] -> 1
[4,0,0,0,4] -> 1
[4,0,0,0,0,4] -> 1
[] -> 0
źródło
[1,1,2,4,8]
zwrócić 1 lub 4?0,0,0,0
było1
. Dobrym pomysłem może być wyraźne wspomnienie gdzieś, że liczymy, ile razy musimy zapętlić się przez tablicę, aby ją całkowicie zmiażdżyć, a nie , jak początkowo myślałem, całkowitą liczbę zmiażdżenia 2 liczb razem.Odpowiedzi:
Zestaw x86 (64-bitowy),
6665 bajtówPomocne były instrukcje strunowe. Konieczność poprawiania pojedynczych błędów w środowisku 64-bitowym nie była.
W pełni skomentowany kod źródłowy:
Mogę spróbować zrobić to w wersji 32-bitowej, choćby dla zabawy, ponieważ te prefiksy REX naprawdę mnie zabiły.
Edycja: zgoliłem jeden bajt, zastępując lodsq przez add,% rdx przez% rax i zwijając dwa cld w jeden.
źródło
Pyth , 22 bajty
Sprawdź wszystkie przypadki testowe.
źródło
Haskell , 66 bajtów
Wypróbuj online!
Wyjaśnienie
f
to funkcja miażdżąca listę. Wykonuje zgniatanie, jak opisano w pytaniu.g
to funkcja zliczająca liczbę zmiażdżeń. Jeślif x==x
,g x=0
w przeciwnym razieg x=1+g(f x)
.źródło
g(f x)
nag$f x
+
ma wyższy priorytet niż$
Paradoc (v0.2.10), 16 bajtów (CP-1252)
Wypróbuj online! / z nagłówkiem / stopką, które sprawdzają wszystkie przypadki testowe
Pobiera listę na stosie i daje liczbę na stosie.
Całkiem prosta implementacja, szczerze mówiąc. Miażdży listę, zaczynając od wartownika -1, zapętlając listę, popychając każdy element i dodając go do elementu pod nim, jeśli są równe. Na koniec odcinamy -1. Zmiażdżymy tylko równe liczby razem, a wszystkie liczby problemów są nieujemne, więc wartownik -1 nie wpłynie na proces kruszenia. Po wdrożeniu funkcji kruszenia wystarczy tylko policzyć iteracje do ustalonego punktu.
Wyjaśnienie:
Gdybyśmy mogli założyć, że dane wejściowe są niepuste, nie potrzebowalibyśmy wartownika i moglibyśmy ogolić 2 bajty:
{(\ε=k+x}]}IL(
Kolejny fajny fakt: tracimy tylko 2 bajty, jeśli zmuszamy się do używania tylko ASCII:
{1m\{=k+x}e]1>}IL(
źródło
JavaScript (ES6), 86 bajtów
Nieoznakowany i wyjaśniony
Testy
Pokaż fragment kodu
źródło
a.length>n
jest taki sam jaka[n]!=[]._
. W tym przypadku (ponieważ wszystkie elementy w tablicy są liczbami większymi niż -1), jest to to samo coa[n]>-1
. Równieża[i]==a[++i]&&x
jest taki sam jaka[i]-a[++i]||x
.1/a[i]
działa również, aby zapisać kolejny bajt.JavaScript, 67 bajtów
Wypróbuj online!
źródło
Brain-Flak , 144 bajty
Wypróbuj online!
Wyjaśnienie
Funkcja zgniatania ocenia liczbę par elementów, które zostały zmiażdżone razem:
źródło
Java 8, 120 bajtów
Lambda od
List<Long>
doInteger
. Lista danych wejściowych musi zostać zaimplementowanaremove(int)
(npArrayList
.). Przypisz doFunction<List<Long>, Integer>
.Wypróbuj online
Niegolfowana lambda
c
zlicza do tej pory liczbę zmiażdżeń,i
jest indeksem na liście if
wskazuje, czy kontynuować miażdżenie listy po zakończeniu iteracji. Wewnątrz pętli porównywana jest każda sąsiednia para.i
jest bezwarunkowo zwiększany, więc jeśli element zostanie usunięty przez zmiażdżenie,i
najpierw jest zmniejszany, aby anulować przyrost. Poprzedni element zostanie usunięty z listy.Podziękowanie
źródło
valueOf
pamięci podręcznej. Przykład:{128L, 128L}
. To dlategol.get(i)==l.get(i-1)
, że należy go zastąpićl.get(i).equals(l.get(i-1))
.l.get(i)-l.get(i-1)==0
zadziała. Dzięki!Perl 5 , 96 bajtów
94 kod, 2 dla
-pa
Wypróbuj online!
źródło
JavaScript (ES6), 70 bajtów
Wyjaśnienie:
Przypadki testowe:
Pokaż fragment kodu
źródło
Python 2 ,
112110108107105100 bajtówEdycja: zapisano 2 bajty, usuwając
or
instrukcję returnEdycja: zapisano 2 bajty
i
jako indeks drugiego z dwóch elementów, które mają być dostępneEdycja: zapisano 1 bajt dzięki @ Mr.Xcoder
Edycja: zapisano 7 bajtów dzięki @jferard
Wypróbuj online!
źródło
JavaScript (ES6), 83 bajty
Objaśnienie: Elementy są rekurencyjnie wyodrębniane z oryginalnej tablicy i dołączane są unikalne wartości,
b
a whilec
jest flagą wskazującą, czy tablica została pomyślnie zgnieciona.źródło
J, 54 bajty
Wypróbuj online!
Pod żadnym względem nie mój najlepszy golf. Z pewnością musi istnieć lepszy sposób konwersji listy z jednym elementem na atom.
Wyjaśnienie
zmiażdżyć
To raz zmiażdży tablicę. Trzeba podać tablicę w odwrotnej kolejności, ponieważ wstawka J działa od prawej do lewej (czego nauczyłem się dzisiaj). Nie ma to szczególnego znaczenia, ponieważ wszystko, czego potrzebujemy, to ile razy możemy zmiażdżyć tablicę.
czasy
Jest to dość proste: zastosuj crush do tablicy, dopóki nasz wynik nie zbiegnie się, ale jest kilka problemów, z którymi musiałem sobie poradzić, uzyskując znacznie więcej kodu, niż się spodziewałem.
Po pierwsze, gdy zgniatanie ogranicza się do jednego elementu, element ten faktycznie znajduje się na liście jednego elementu (tzn. Nie jest anatomiczny), więc funkcja jest ponownie stosowana, co powoduje przeliczenie. Aby to naprawić, użyłem hacka, który wymyśliłem, aby zredukować listę pojedynczych elementów do atomu, który jest
".@":
(przekonwertować na ciąg, a następnie ocenić).Po drugie,
crush
błędy na pustej liście. Myślę , że możesz zdefiniować, jak funkcja powinna zachowywać się po otrzymaniu pustych danych wejściowych za pomocą insert (/
), ale nie mogłem znaleźć niczego po pobieżnym spojrzeniu, więc używam innego obejścia. To obejście polega na dodawaniu_
(nieskończoności) do listy, ponieważ nigdy nie wpłynie to na liczbę zmiażdżenia tablicy (_ > 2^64
). Jednakże , skutkuje to jedną listę składającą się z elementów_
, gdy ze względu na pustą listę, więc trzeba przekonwertować do atomu znowu przed zgnieceniem.źródło
Galaretka , 21 bajtów
Wypróbuj online!
źródło
R , 142 bajty
Przerażające, jestem pewien, że jest bardziej sprytny sposób.
Liczby całkowite R są w rzeczywistości co najwyżej wszystkie
2^31-1
.Wypróbuj online!
źródło