Biorąc pod uwagę tablicę liczb całkowitych nieujemnych, Twoim zadaniem jest zachowanie tylko niektórych jego elementów, jak opisano poniżej.
Powiedzmy, że tablica jest
[1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1]
.Najpierw uzyskać pierwszy element tablicy
n
. Zatrzymaj pierwszen
elementy i odrzuć następny (odrzućn+1
th). Nowa tablica to[1, 2, 4, 11, 5, 2, 0, 13, 10, 1]
.Następnie łapiesz element po usuniętym i robisz dokładnie to samo. Ponownie stosujemy ten proces
[1, 2, 11, 5, 2, 0, 13, 10, 1]
Powtarzasz ten proces, dopóki nie dojdziesz poza granice tablicy / nie ma już elementów w tablicy. Zatrzymujemy się, ponieważ
11
jest większa niż długość tablicy.Teraz powinieneś wypisać wynik.
Dane wejściowe / wyjściowe można przyjmować / dostarczać w dowolnej standardowej formie. Tablica nigdy nie będzie pusta i będzie zawierać tylko nieujemne liczby całkowite. Wszystkie standardowe luki są zabronione.
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach!
Przypadki testowe
Wejście -> Wyjście [1, 2, 3, 4, 5] -> [1, 3, 4] [6, 1, 0, 5, 6] -> [6, 1, 0, 5, 6] [1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1] -> [1, 2, 11, 5, 2, 0, 13, 10, 1] [2, 2, 2, 2, 2, 2] -> [2, 2] [1, 2, 3, 1, 2, 3, 1, 2, 3] -> [1, 2] [3, 1, 2, 4, 0] -> [] *
* Ostatni przypadek testowy dotyczy 0
, więc postanowiłem opublikować proces, aby był bardziej przejrzysty:
[3, 1, 2, 4, 0] --> [3, 1, 2, 0] --> [1, 2, 0] --> [1, 0] --> [0] --> [] )
( Inspirowane przez to wyzwanie przez Erik Outgolfer )
2
zamiast pierwszego usuwa się go3
?[1, 2, 3, 1, 2, 3, 1, 2, 3]
n
”, zawsze zaczynasz od początku tablicy, aby zachowaćn
elementy? Czy (jak myślałem na pierwszy rzut oka) nie przechowujeszn
elementów w miejscu, w którymn
oceniasz pierwszy element ?Odpowiedzi:
Pyth, 18 bajtów
Wypróbuj tutaj.
źródło
JavaScript (ES6), 45 bajtów
Przypadki testowe
Pokaż fragment kodu
źródło
Haskell , 50 bajtów
g.pure.(0:)
to anonimowa funkcja pobierająca i zwracająca listęInt
s, użyj jako(g.pure.(0:))[1,2,3,4,5]
.Wypróbuj online!
Jak to działa
g
przyjmuje argument krotki reprezentujący podzieloną listę.a
to lista początkowych elementów przechowywana w poprzednim kroku,_
to element, który należy odrzucić,b
to następny element, który zostanie użyty jako długość, ic
pozostałe elementy.b
, następuje nowy podział i następuje ong
ponownie. W przeciwnym razie zatrzymuje sięa
w wyniku.g.pure.(0:)
rozpoczyna wszystko od wywołaniag
z krotką([],0:l)
, w którejl
znajduje się dane wejściowe, i0
zostaje natychmiast odrzucona przezg
.pure
tutaj używaApplicative
instancji krotek (binarnych), a typ wyniku([Int],[Int])
wygodnie umieszcza argument jako drugi element w krotce z[]
pierwszym elementem.źródło
Python 3 , 59 bajtów
Wypróbuj online!
źródło
Haskell , 51 bajtów
Wypróbuj online! Przykładowe zastosowania:
f [1,2,3,4,5]
.źródło
Java 8, 68 bajtów
Ta lambda akceptuje zmienną
List<Integer>
(obsługujeremove(int)
npArrayList
.). Wyjście jest zmutowanym wejściem. Przypisz doConsumer<List<Integer>>
.Wypróbuj online
Przepływ sterowania tym problemem jest bardzo denerwujący. Każdą iterację musimy usunąć element i ustawić element w następnej pozycji, a obie te operacje wymagają sprawdzenia zasięgu (i każda z nich może wyzwalać zakończenie programu). Jedną strategią jest przeprowadzanie obu operacji w jednej iteracji w pętli, z aktualizacją indeksu strzeżoną przez własną kontrolę zasięgu. Inną strategią, która okazała się krótsza, jest naprzemienne wykonywanie operacji w każdej pętli, co robi to rozwiązanie.
źródło
APL (Dyalog Classic) , 32 bajty
Wyjaśnienie
Wypróbuj online!
źródło
Perl 5 , 38 + 1 (-a) = 39 bajtów
Wypróbuj online!
źródło
Haskell, 99 bajtów (88 bez wcięcia)
źródło
VI,
3125 bajtów<C-?>
odpowiadaControl + ?
, a<Esc>
doEscape
oczywiście. Każdy z nich liczy się dla 1 bajtu (patrz meta ).Wejście
Plik wejściowy powinien zawierać 1 liczbę całkowitą na linię + 1 pustą linię na końcu, przykład:
Widzimy każdy wiersz pliku wejściowego jako element tablicy, na przykład
1 :: 2 :: 3 :: 4 :: 5 :: []
jak w niektórych językach (na przykład caml).Uruchomić
Możesz uruchomić vi za pomocą następującego polecenia i wpisać rozwiązanie skok po skoku:
Możesz także użyć tej jednowierszowej:
Powinno to wygenerować plik
output
z poprawnym wynikiem z pliku wejściowegoinput
.Objaśnienia
Aby wprowadzić rozwiązanie, najpierw przedstawię 19-bajtowe rozwiązanie działające tylko dla tablic bez 0. To rozwiązanie wykorzystuje rekurencyjne makro, używane z niewielką modyfikacją w ostatecznym rozwiązaniu:
Wyjaśnienie częściowego rozwiązania
Sztuczka polega na tym, aby użyć
"0
rejestru do przechowywania bieżącej liczby całkowitej (i podziału linii, bardzo ważne). Dlatego polecenie@0
pozwala przeskakiwaćn
linie (wywołaćn
wartość"0
). Jeśli skok przekroczy liczbę linii w pliku, makro nie powiedzie się, więc program zatrzyma się (poza granicami tablicy, zgodnie z wymaganiami).Ale to rozwiązanie nie działa, jeśli dane wejściowe zawierają
0
. Rzeczywiście, jeśli"0
wartość rejestru jest równa0
,@0
przeskoczy o jedną linię (z powodu podziału linii), a nie0
tak, jak nam się podobało. Zatem następne polecenie (dd
) nie usunie 0-tej liczby całkowitej, ale 1-szą (niepoprawną).Prawidłowym rozwiązaniem tego problemu
0
jest zawsze zwiększanie liczby całkowitej przed jej wyrwaniem i zmniejszanie tuż po niej. Zatem@0
polecenie przeskoczy on+1
linie (n
to bieżąca liczba całkowita, która została zwiększona).k
Polecenia jest wtedy konieczne, aby przejść do wierszan
(poprzednia linia). Korzystając z tej sztuczki, potrzebna jest pusta linia na końcu pliku wejściowego, aby uniknąć przeskakiwania poza tablicę (a tym samym zakończenie programu), ponieważ teraz zawsze przeskakujemyn+1
linie, przed przejściem do poprzedniej linii.Wyjaśnienie ostatecznego rozwiązania
Zapisanie zawartości makra w pliku przed zarejestrowaniem pozwala zaoszczędzić kilka bajtów:
qa...q
i cofania wszystkich zmian po rejestracji:let @a="..."
)Edycje
# 1
źródło
Pyth, 32 bajty
Wypróbuj online
źródło
#VlQ.(Q@QN;Q
robi to w 12 bajtach i jestem prawie pewien, że można grać w golfa jeszcze bardziejW<Zl=Q+<Q@QZ>Qh@QZ=Z@QZ)Q
(25). Podejście pizzakingme jest jednak znacznie lepsze.#VlQ .(Q@QN)%;Q
. Informacje zwrotne od golfistów Pyth byłyby mile widziane, wciąż się uczę!C # (.NET Core) , 74 bajty
Wypróbuj online!
To pobiera listę ints i modyfikuje ją. Widziałem niektóre odpowiedzi Java, które omijają import, używając w pełni kwalifikowanej nazwy w definicji argumentu Lambda. Jeśli nie jest to dozwolone, mogę usunąć tę odpowiedź.
źródło
System.Collections.Generic.List<int>
zamiastusing System.Collections.Generic
i dodając to do liczby bajtów. Ale chyba nie różni się niczym od używania tablicy.using
jeśli chcesz; tak długo, jak sama lambda nie opiera się na stwierdzeniu, nie musiałbyś uwzględniać go w liczbie bajtów. Osobiście zawsze używam w pełni kwalifikowanych nazw w kodzie testowym, aby było jasne i łatwe do zweryfikowania, co importuje lambda.R ,
6453 bajtówFunkcja rekurencyjna. Ma jedno obowiązkowe wejście,
a
listę do pominięcia.i
jest indeksem liczby rzeczy do przeskoczenia (domyślnie to1
) id
jest indeksem następnego elementu po usunięciu wymaganej wartości, który jest również indeksem elementu do usunięcia. Zwracanumeric(0)
pusty wektor dla pustego wyjścia.Wypróbuj online!
Nie golfowany:
źródło