Biorąc pod uwagę listę dodatnich liczb całkowitych z niektórymi zamienionymi na 0
, wypisz listę z brakującymi liczbami, które zostały zmienione na 0
zamienione.
Charakterystyka listy danych wejściowych:
Lista zawsze będzie miała długość co najmniej 2.
Zdefiniujmy listę wejściową jako
a
i „oryginalną listę” (czyli listę przed zastąpieniem liczb0
s) jakob
. Dla każdegon
,a[n]
jest albob[n]
albo0
.Dla każdego
n
,b[n]
jest albob[n-1] + 1
albob[n-1] - 1
. Oznacza to, że liczbyb
będą zawsze zmieniały się1
przy każdym indeksie od poprzedniego. Pierwszy element jest oczywiście zwolniony z tej zasady.Dla każdego przebiegu zer w
a
(to znaczy kolejne elementy zastąpione0
), zx
co stanowi wskaźnik na początku cyklu, ay
reprezentujących koniec,a[x-1]
abya[y+1]
zawsze albo wyłącznie zwiększenia lub jedynie maleje. Dlatego będzie tylko jeden możliwy sposób wypełnienia zer.- Oznacza to również, że ani pierwszy, ani ostatni element tablicy nie może być zerami.
Mówiąc prościej, aby wypełnić ciąg zer, po prostu zastąp go zakresem od liczby poprzedzającej do liczby następującej po niej. Na przykład wejście
1 2 0 0 0 6 7
musi generować
1 2 3 4 5 6 7
Ponieważ jest to code-golf , wygra najkrótszy kod w bajtach.
Przypadki testowe:
In Out
-----------------------------------------------------
1 0 0 0 5 6 0 4 0 0 1 | 1 2 3 4 5 6 5 4 3 2 1
7 6 0 0 3 0 0 0 7 0 5 | 7 6 5 4 3 4 5 6 7 6 5
1 0 3 0 5 0 3 0 5 0 7 | 1 2 3 4 5 4 3 4 5 6 7
14 0 0 0 0 0 0 0 0 23 | 14 15 16 17 18 19 20 21 22 23
źródło
0
nasz program może przyjąć inną wartość, na przykładnull
?0
.Odpowiedzi:
JavaScript (ES6),
72 66 64 5453 bajtyZaoszczędź 12 bajtów dzięki @Neil!
Zapisano 1 bajt dzięki @IsmaelMiguel
Całkiem dobrze jak na JavaScript.
Wypróbuj online (wszystkie przeglądarki działają)
Wyjaśnienie
źródło
a.find((q,r)=>r>i&&q)>b?++b:--b
to to samo cob+=a.find((q,r)=>r>i&&q)>b||-1
MATL , 11
12bajtówDziała z bieżącą wersją (13.0.0) języka / kompilatora.
Wypróbuj online!
źródło
Haskell,
686158 bajtówPrzykład użycia:
g.filter(>0) $ [7,6,0,0,3,0,0,0,7,0,5]
->[7,6,5,4,3,4,5,6,7,6,5]
.Jak to działa: usuń z wejścia zera, a następnie zadzwoń
g
. Niecha
będzie pierwszym, ab
następnie drugim elementem pozostałej listy. Połącz listy oda
góry dob-1
i oda
dołu dob+1
(jedna z nich będzie pusta), a połączenie rekurencyjne zostaniea
usunięte.Edycja: @Zgarb zapisał 3 bajty. Dzięki!
źródło
Mathematica, 59 bajtów
Przypadek testowy
źródło
Perl,
4745443937 bajtówObejmuje +1 dla
-p
Oczekuje listy na standardowe wejście. Przykład: echo 1 0 3 0 1 | perl -p file.pl
źródło
Galaretka,
1211 bajtówWypróbuj online!
Alternatywna wersja, 8 bajtów (niekonkurująca)
Niestety, Jelly's
pop
nie poddało się iteracji w najnowszej wersji, która poprzedza to wyzwanie. Zostało to naprawione, a następujące działania działają w bieżącej wersji.Wypróbuj online!
Jak to działa
W alternatywnej wersji
ḢWW;
staje się niepotrzebny. Ponieważ jednak pierwszy element jest rzutowany na iterowalny przed pojawieniem się, nie jest tak naprawdę modyfikowany. FinałḊ
usuwa duplikat pierwszego elementu.źródło
Retina,
393431 bajtów3 bajty zapisane dzięki @Martin.
Pobiera dane wejściowe i podaje dane wyjściowe jako jednoargumentowy.
Kod iteracyjnie wypełnia każde puste miejsce (0)
previous_number - 1 + 2 * if_next_nonzero_number_bigger
.previous_number - 1
jest$1
iif_next_nonzero_number_bigger
jest$3
.W przypadku dziesiętnych operacji we / wy kod ma 51 bajtów, co widać w tłumaczeniu online ze wszystkimi przypadkami testowymi .
źródło
1
w Lookahead.GNU Sed (z
exec
rozszerzeniem za pomocą bash), 61Wynik obejmuje +1 za
-r
opcję sed.0
s i zamień je..
{1..4}
dla lokalnych punktów końcowych. Piękno ekspansji nawiasów klamrowych polega na tym, że wygenerowana sekwencja zawsze będzie przebiegać we właściwym kierunku, niezależnie od tego, czy początek czy koniec jest większy.e
opcjis
polecenia, aby wywołać bash, aby ocenić to rozwinięcie nawiasu0
znaleziono więcej s, wróć do początku.Ideone.
źródło
Python 2,
195111 bajtów (dzięki Alex !)Dane wejściowe: musi być a
[list]
ints Danewyjściowe:
[list]
intsźródło
Perl,
8582 bajtówzawiera +1 dla
-p
Oczekuje listy na standardowe wejście. Przykład:
echo 1 0 3 0 1 | perl -p file.pl
.Używa zagnieżdżonego wyrażenia regularnego. Nieco czytelne:
źródło
Python 2,
9288 bajtów(Usunięto zmienną pośrednią)
źródło
Pyth, 17 bajtów
Jak to działa:
Innymi słowy: wszystkie zera są usuwane z danych wejściowych, następnie wyłączny zakres jest wstawiany między każdy element. Ten zakres wynosi zero dla elementów tylko jednego od siebie.
źródło
05AB1E , 3 bajty (niekonkurujące)
To była funkcja dodana po wyzwaniu. Kod:
Wyjaśnienie:
Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe!
źródło
Vim: 231 kluczowych poleceń
Zauważ, że każde ^ poprzedzające znak oznacza, że powinieneś zachować kontrolę podczas pisania tego znaku
Kroki, abyś mógł to uruchomić!
:s/\^V/<Ctrl-V><Ctrl-V>/g
i naciśnij enter (dwa s powinny dać ci niebieskie ^ V):s/\^R/<Ctrl-V><Ctrl-R>/g
i naciśnij klawisz Enter (teraz powinieneś zobaczyć niebieski ^ Rs):s/\^X/<Ctrl-V><Ctrl-X>/g
i naciśnij klawisz Enter (teraz powinieneś zobaczyć niebieski ^ Xs):s/\^O/<Ctrl-V><Ctrl-O>/g
i naciśnij enter:s/\^A/<Ctrl-V><Ctrl-A>/g
i naciśnij enter:s/\^\[/<Ctrl-V><Ctrl-[>/g
i naciśnij klawisz Enter (to polecenie jest nieco inne, ponieważ musiałem uciec przed [)0"yy$
. Polecenie jest teraz przechowywane w rejestrze y@y
Jeśli ktoś zna lepszy sposób udostępniania polecenia, daj mi znać. Wiem, że to jest długie, ale najlepsze, co mogłem wymyślić.
Wejście wyjście
Łańcuch wejściowy powinien być sam w dowolnym wierszu pliku. 1 0 0 4 3 0 0 0 7
Dane wyjściowe po prostu nadpisują ciąg wejściowy 1 2 3 4 3 4 5 6 7
Wyjaśnienie
Algorytm
Makra używane
@e - Sprawdź koniec. Do ostatniego numeru zostanie dołączony e. Jeśli liczba pod kursorem ma na końcu e, usuń e i zatrzymaj wykonywanie. W przeciwnym razie rozpocznij cykl interpolacji za pomocą @b.
@b - Rozpocznij cykl interpolacji. Zapisz liczbę pod kursorem dla operacji odejmowania (@s), a następnie znajdź następny niezerowy termin (@f)
@s - Przechowuje polecenie odejmowania do użycia w @d. To jest po prostu
(val)^X
gdzie(val)
jest liczba na początku kroku interpolacji. Ustawia się to za pomocą polecenia @b.@f - Znajdź następny niezerowy termin. Zapisz bieżącą wartość do rejestru bez nazwy, następnie napisz
@f @d
w następnym wierszu, a następnie uruchom @z. Powtórzy to polecenie, jeśli liczba jest zerem, i wykona @d, jeśli nie jest.@z - warunkowe wykonanie, jeśli rejestr bez nazwy ma wartość 0. To polecenie oczekuje dwóch poleceń w nowym wierszu w formacie
command1 command2
. Jeśli rejestr bez nazwy ma wartość 0,command1
jest wykonywany, w przeciwnym raziecommand2
jest wykonywany. Zauważ, że żadne polecenie nie może zawierać spacji.@t - Tymczasowy rejestr poleceń. Przechowuje różne polecenia przez krótki czas przed ich wykonaniem. Używany głównie w instrukcjach if.
@d - Określ kierunek interpolacji. Odejmuje pierwszą liczbę w sekwencji od liczby pod kursorem (używając @s). Jeśli wynik jest ujemny, interpolacja musi zostać zmniejszona, aby ^ X zostało zapisane w @a. W przeciwnym razie powinniśmy zwiększyć, aby ^ A zostało zapisane w @a. Po zapisaniu, wróć na początek tego cyklu interpolacji i uruchom @i, aby faktycznie interpolować
@a - Zapisanie albo
^A
lub^X
zwiększać lub zmniejszać w czasie etapu interpolacji. Ustawia się to za pomocą polecenia @d.@i - Interpoluj. Skopiuj numer z bieżącej lokalizacji do @x i przejdź do następnego numeru. Jeśli liczba ta wynosi zero, zamień ją na @x i uruchom @a, aby poprawnie ją zmienić w górę lub w dół, a następnie powtórz to polecenie. Jeśli liczba nie jest zerem, osiągnęliśmy koniec tego cyklu interpolacji. Nowy należy rozpocząć od tego numeru na początku, więc uruchom @e, aby sprawdzić koniec i uruchom ponownie.
@x - Rejestr tymczasowego przechowywania. Używany w poleceniu interpolacji (@i)
Rozbijanie naciśnięć klawiszy
źródło
Python 3.5, 159 bajtów
rozwiązanie rekurencyjne
Bez golfa
W rozwiązaniu golfowym zastępuję warunki, wykorzystując fakt, że
h*True=h
ih*False=[]
Wynik
źródło
Perl 6 , 54 bajtów
źródło
MATLAB,
393837 bajtówAnonimowa funkcja interpolująca liniowo między punktami w
a
.find(a)
to tablica wskaźników elementów niezerowych wa
ia(a>0)
są wartościami dodatnimi. Zapisane 1 bajt dzięki sugestii kolegi z>
zamiast~=
.źródło