Załóżmy, że chcemy przesunąć tablicę, tak jak ma to miejsce w grze 2048 : jeśli mamy dwa równe kolejne elementy w tablicy, scal je w podwójny element wartości. Shift musi zwrócić nową tablicę, w której każda para kolejnych równych elementów jest zastępowana ich sumą, a pary nie powinny się przecinać. Przesunięcie jest wykonywane tylko raz, więc nie musimy ponownie łączyć uzyskanych wartości. Zauważ, że jeśli mamy 3 kolejne równe elementy, musimy zsumować skrajne prawe, więc na przykład [2, 2, 2]
powinno się stać [2, 4]
, a nie [4, 2]
.
Zadanie polega na napisaniu najkrótszej funkcji, która pobiera tablicę i zwraca tablicę przesuniętą.
Możesz założyć, że wszystkie liczby całkowite będą ściśle dodatnie.
Przykłady:
[] -> []
[2, 2, 4, 4] -> [4, 8]
[2, 2, 2, 4, 4, 8] -> [2, 4, 8, 8]
[2, 2, 2, 2] -> [4, 4]
[4, 4, 2, 8, 8, 2] -> [8, 2, 16, 2]
[1024, 1024, 512, 512, 256, 256] -> [2048, 1024, 512]
[3, 3, 3, 1, 1, 7, 5, 5, 5, 5] -> [3, 6, 2, 7, 10, 10]
Jestem również bardzo zainteresowany rozwiązaniem wykorzystującym redukcję :)
źródło
Odpowiedzi:
Galaretka ,
10 98 bajtówTryItOnline lub uruchom wszystkie przypadki testowe
W jaki sposób?
źródło
Haskell,
475750 bajtówUżywa
reduce
(lubfold
jak to się nazywa w Haskell, tutaj prawy foldfoldr
). Przykład użycia:map abs.foldr(#)[] $ [2,2,2,4,4,8]
->[2,4,8,8]
.Edycja: +10 bajtów, aby działało również dla nieposortowanych tablic. Połączone liczby są wstawiane jako wartości ujemne, aby zapobiec ponownemu scaleniu. Są one poprawiane przez finał
map abs
.źródło
Brain-Flak ,
15896Wypróbuj online!
Wyjaśnienie:
1 Odwróć listę (przenosząc wszystko na inny stos, ale to nie ma znaczenia)
2 Wykonaj kroki 3-6, aż na stosie nie pozostanie nic:
3 Zduplikuj dwa górne elementy (2 3 -> 2 3 2 3)
4 Umieść 1 na górze, jeśli dwie pierwsze są równe, 0 w przeciwnym razie (z wiki)
5 Jeśli dwie górne były równe (niezerowe u góry), dodaj kolejne dwie i wciśnij wynik
6 Przenieś górny element na drugi stos
7 Przełącz na drugi stos i drukuj niejawnie
źródło
PHP, 116 bajtów
lub
-4 Bajtów, jeśli wyjściem może być tablica
print_r
zamiast „kod_json”176 bajtów, aby rozwiązać ten problem za pomocą Regex
źródło
for($i=count($a=$argv);--$i;)$b[]=($a[$i]==$a[$i-1])?2*$a[$i--]:$a[$i];print_r(array_reverse($b));
ten sam pomysł, ale krótszy[]
potrzebuję$r=[];
Dziękuję za pomocGNU sed,
41 3837Obejmuje +1 za -r
-3 Dzięki cyfrowej traumie
-1 Dzięki seshoumara
Wejścia i wyjścia to ciągi rozdzielone spacjami w jedności (w oparciu o ten konsensus ).
Wypróbuj online!
źródło
y,!, ,
aby zapisać 1 bajt.Retina , 32
r
w linii 3 aktywuje dopasowanie wyrażenia regularnego od prawej do lewej. A to oznacza, że\1
odniesienie musi pojawić się przed(1+)
grupą przechwytującą, do której się odwołuje.Wypróbuj online.
źródło
Perl, 41 bajtów
Obejmuje +1 dla
-p
Podaj sekwencję wprowadzania na STDIN:
shift2048.pl
:źródło
Python, 61 bajtów
Boolean
b
sprawdza, czy dwa ostatnie elementy powinny się zwinąć, sprawdzając, czy są one równe w sposób bezpieczny dla list o długości 1 lub 0. Ostatni element, jeśli następnie jest dołączony z mnożnikiem1
równości lub2
nierówności. Jest dołączany do wyniku rekurencyjnego na liście z tak wieloma elementami odciętymi na końcu. Dzięki Dennis za 1 bajt!źródło
[l[-1]<<b]
zapisuje bajt.l[-2:-1]
jest[l[-2]]
Perl, 43 + 1 (
-p
) = 44 bajtyTon Hospel wymyślił 41 bajtów odpowiedzi , sprawdź to!
-4 dzięki @Ton Hospel!
Edycja : dodano
\b
, ponieważ bez niego nie udawało się na wejściu, tak jak24 4
na wyjściu28
.Uruchom z
-p
flagą:Nie widzę innego sposobu niż przy użyciu
reverse
dwukrotnie do prawej-krotnie (jak tylkos/(\d+) \1/$1*2/ge
będzie lewy-krotnie, czyli2 2 2
staną4 2
zamiast2 4
). Więc 14 bajtów utraconych dziękireverse
... Nadal myślę, że musi istnieć inny (lepszy) sposób (w końcu perl!), Daj mi znać, jeśli go znajdziesz!źródło
reverse reverse
wydaje się nieco długi. Nie jestem ekspertem w Perlu, ale czy istnieje sposób, aby zrobić skrót doreverse
(jeśli nic innego, [ab] używaszeval
)?($_)
reverse
wygląda na to, żereverse
nie można go wywołać bez argumentów (no cóż, przykłady pokazują, że można, ale jest tylko jeden prototyp:)reverse LIST
, więc zapomniałem o$_
domyślnym argumencie;)LIST
może być pusty ...$_
domyślnego argumentu, dokument określa prototyp bez parametrów (takich jakprint
lublenght
...). A może mam po prostu złe wrażenie.JavaScript (ES6), 68 bajtów
źródło
[1024, 1024, 512, 512, 256, 256]
jest rozwiązywany jako[2048, 512, 1024]
i nie[2048, 1024, 512]
...?Perl 5.10,
6150 bajtów (49+ 1 dla flagi)Dzięki Ton Hospel za oszczędność 11 bajtów!
Rozwiązanie wolne od Regex, z
-a
flagą:Wypróbuj tutaj!
źródło
@a=($F[-1]-$b?$b:2*pop@F,@a)while$b=pop@F;say"@a"
JavaScript (ES6),
686558576564 bajtówZapisano 1 bajt dzięki @ l4m2
Naprawiono nieposortowane tablice teraz, gdy wyjaśniono, że takich danych należy się spodziewać.
źródło
a=>(a.reverse()+'').replace(/(.),\1/g,(c,i)=>i*2).split`,`.reverse()
?[1024, 1024, 512, 512, 256, 256]
(myślę, że ten przypadek testowy mógł zostać dodany później).f=(a,l=[],m)=>(x=a.pop())*!m-l?f(a,x).concat(l):x?f(a,2*x,1):[l]
?05AB1E , 26 bajtów
Wypróbuj online!
Uogólnione kroki
źródło
Mathematica, 53 bajty
Wyjaśnienie
Podziel dane wejściowe na listy podrzędne składające się z serii identycznych elementów. tzn .
{2, 2, 2, 4, 8, 8}
staje się{{2, 2, 2}, {4}, {8, 8}}
.Podziel każdą podlistę na partycje o długości maksymalnie 2. tzn . Stanie
{{2, 2, 2}, {4}, {8, 8}}
się{{{2, 2}, {2}}, {{4}}, {{8, 8}}}
.Łącznie każda partycja. tzn .
{{{2, 2}, {2}}, {{4}}, {{8, 8}}}
staje się{{4, 2}, {4}, {16}}
.Odwróć wyniki, ponieważ
Partition
polecenie Mathematiki idzie od lewej do prawej, ale chcemy, aby partycje były w innym kierunku. tzn .{{4, 2}, {4}, {16}}
staje się{{2, 4}, {4}, {16}}
.Spłaszcz wynik. tzn .
{{2, 4}, {4}, {16}}
staje się{2, 4, 4, 16}
.źródło
Plus@@@
jestTr/@
i myślę, że możesz uniknąć nawiasów iJoin@@
jeśli użyjesz##&@@
wynikuReverse
(choć go nie przetestowałem).Java 7, 133 bajty
Input jest ArrayList i po prostu zapętla się do tyłu, usuwając i podwajając w razie potrzeby.
źródło
Long
odniesienia w linii 3 z==
. Zastanów sięa.get(i)-a.get(i-1)==0
.Perl, 37 bajtów
Obejmuje +4 za
-0n
Uruchom z danymi wejściowymi jako osobnymi liniami na STDIN:
shift2048.pl:
źródło
Haskell, 56 bajtów
źródło
PHP,
86 100 9994 bajtywymaga PHP 7.0; pobiera wartości z argumentów wiersza poleceń.
Uruchom
-nr
lub wypróbuj online .źródło
for($r=[];$v=($p=array_pop)($a=&$_GET[a]);)array_unshift($r,end($a)-$v?$v:2*$p($a));print_r($r);
jest o 1 bajt krótszyJulia 205 bajtów
Wywoływaną funkcją jest
H
na przykład
H([1,2,2,4,8,2,])
Nie jest to w żaden sposób najkrótszy sposób na zrobienie tego w Julii. Ale to jest tak fajne, że i tak chciałem się tym podzielić.
t(a)
jest typem wartości reprezentującym wartość (a).s(a)
jest instancją tego typu wartościg
jest funkcją, która wywołuje wartości różnic (przy użyciu typów wartości) i liczby jego parametrów. I to jest fajneK
po prostu owija sięg
tak, żeBardzo fajna część:
To definiuje
^
operatora do zastosowania do funkcji. Tak, żeK^s(2)(X)
jest taki sam jakK(K(X))
takH
jest po prostu dzwoniącK
naK
pęczek razy - tyle razy, aby na pewno zwinąć żadnej zagnieżdżony przypadekMożna to zrobić znacznie krócej, ale ten sposób jest po prostu zabawny.
źródło
PowerShell v2 +, 81 bajtów
Pobiera dane wejściowe jako jawną tablicę
$n
, odwraca je$n[$n.count..0]
,-join
s elementy wraz z przecinkiem, a następnie regex-replace
sa pasującą parę cyfr z pierwszym elementem a*2
i otoczoną znakami. Rurki, które wynikają (które@(2,2,4,4)
będą wyglądać na wejściu(4*2),(2*2)
) doiex
(skrót dlaInvoke-Expression
i podobne doeval
), co konwertuje mnożenie na liczby rzeczywiste. Przechowuje wynikową tablicę w$b
, hermetyzuje ją w parens, aby umieścić ją w potoku, a następnie odwraca za$b
pomocą[$b.count..0]
. Pozostawia powstałe elementy w potoku, a dane wyjściowe są niejawne.Przypadki testowe
Uwaga: W programie PowerShell koncepcja „zwracania” pustej tablicy jest bez znaczenia - jest konwertowana do
$null
momentu, gdy opuści zakres - a więc jest to odpowiednik braku zwracania, co dzieje się tutaj w pierwszym przykładzie (po kilku złośliwie pełnych błędach). Dodatkowo dane wyjściowe są tutaj oddzielone spacjami, ponieważ jest to domyślny separator dla tablic strunowych.źródło
JavaScript - 103 bajty
źródło
[2,2,4,4]
wydajności[2,2,4,4]
.Brain-Flak , 60 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Python 2, 94 bajty
Wypróbuj online
źródło
Julia,
7382 bajtówUżyj prawej klapki, aby zbudować listę od tyłu do przodu (można również użyć klapki w lewo i odwrócić listę na początku i na końcu).
Jeśli nagłówek bieżącej listy nie jest równy następnemu elementowi do dodania, po prostu wstaw go.
W przeciwnym razie usuń nagłówek listy (brzmi trochę okrutnie) i wstaw element razy 2.
Przykład
źródło
Rakieta 166 bajtów
Nie golfowany:
Testowanie:
Wynik:
źródło
Japt , 12 bajtów
Wypróbuj online!
Rozpakowane i jak to działa
Wpadłem na pomysł z galaretką Jonathana Allana .
źródło
Mathematica, 51 bajtów
{Longest@a___,x_/;x>0,x_,b___}
dopasowuje listę zawierającą dwie kolejne identyczne liczby dodatnie i przekształca te dwie liczby w-2x
.Longest
zmusza mecze do spóźnienia się.Proces ilustruje krok po kroku:
źródło
Vim, 28 bajtów
G@='?\v(\d+)\n\1<C-@>DJ@"<C-A>-@=<C-@>'<CR>
Makro, które regex wyszukuje wstecz pasujące kolejne liczby, i dodaje je do siebie.
Tablica wejściowa musi mieć jedną liczbę w wierszu. Ten format oszczędza mi uderzeń, co jest miłe, ale prawdziwym powodem jest obejście nakładających się dopasowań wyrażeń regularnych. Biorąc pod uwagę ciąg
222
, jeśli/22
dopasujesz tylko pierwszą parę, a nie nakładającą się drugą parę. Zasady nakładania się są różne, gdy dwie pary zaczynają się na różnych liniach. W tym wyzwaniu[2, 2, 2]
staje się[2, 4]
, więc dopasowanie nakładającej się pary ma kluczowe znaczenie.UWAGA: Wyzwanie wymagało tylko jednego podania. Z tego powodu musisz mieć
:set nowrapscan
. Z:set wrapscan
Mógłbym stworzyć wersję, która kończy pracę na wielu przejściach, chociaż to zapisane rozwiązanie nie zawsze to robi.<C-@>
: Zwykle w wierszu polecenia należy wpisać literał<CR>
bez uruchamiania polecenia, za pomocą którego trzeba by go uciec<C-V>
. Ale możesz wpisać<C-@>
nieskalowany, a zostanie on potraktowany jako<C-J>
/<NL>
, co będzie jak<CR>
podczas uruchamiania makra, ale nie podczas pisania. Spróbuj przeczytać:help NL-used-for-Nul
.@=
: Tym razem nie mogę łatwo użyć zarejestrowanego makra, ponieważ istnieje możliwość, że dane wejściowe mogą nie mieć pasujących par. Jeśli tak się stanie podczas uruchamiania makra, nieudane wyszukiwanie zakończy się niepowodzeniem. Ale jeśli zdarzy się to podczas (domyślnie pierwszego) przebiegu nagrywania, uruchomione zostaną pozostałe polecenia trybu normalnego, uszkadzając plik. Minusem@=
jest to, że tracę bajt na rekurencyjnym wezwaniu; czasami można użyć@@
jako wywołania rekurencyjnego, ale@"
w tym przypadku byłoby to uruchamiane wcześniej z 4 bajtów.DJ@"<C-A>-
:DJ
usuwa linię i umieszcza liczbę (bez nowej linii) w rejestrze, dzięki czemu mogę uruchomić ją jako makro dla argumentu liczby<C-A>
. Muszę-
później, żeby nie dostać drugiego meczu w takich przypadkach[4, 2, 2]
.źródło
Perl6, 92 bajty
źródło
Prolog (SWI) ,
9787 bajtówWypróbuj online!
źródło