Zaczerpnięte z tego pytania w Stack Overflow. Dziękujemy również @miles i @Dada za sugerowanie danych testowych dotyczących niektórych przypadków narożnych.
Wyzwanie
Biorąc pod uwagę tablicę wartości całkowitych, usuń wszystkie zera, które nie są flankowane przez jakąś niezerową wartość.
Odpowiednio, wpis powinien zostać zachowany, jeśli jest niezerowy lub jeśli zero jest bezpośrednio bliskie niezerowej wartości.
Przechowywane wpisy powinny zachować w danych wyjściowych kolejność, jaką miały na wejściu.
Przykład
Dany
[2 0 4 -3 0 0 0 3 0 0 2 0 0]
wartości, które należy usunąć, są oznaczone x
:
[2 0 4 -3 0 x 0 3 0 0 2 0 x]
i tak wynik powinien być
[2 0 4 -3 0 0 3 0 0 2 0]
Zasady
Tablica wejściowa może być pusta (a następnie dane wyjściowe również powinny być puste).
Formaty wejściowe i wyjściowe są jak zwykle elastyczne: tablica, lista, ciąg znaków lub cokolwiek rozsądnego.
Kod golfa, najmniej najlepszy.
Przypadki testowe
[2 0 4 -3 0 0 0 3 0 0 2 0 0] -> [2 0 4 -3 0 0 3 0 0 2 0]
[] -> []
[1] -> [1]
[4 3 8 5 -6] -> [4 3 8 5 -6]
[4 3 8 0 5 -6] -> [4 3 8 0 5 -6]
[0] -> []
[0 0] -> []
[0 0 0 0] -> []
[0 0 0 8 0 1 0 0] -> [0 8 0 1 0]
[-5 0 5] -> [-5 0 5]
[50 0] -> [50 0]
źródło
_2
zamiast-2
? Wiele języków korzysta z tego formatu.-0
?[010 0 0 01 1]
?Odpowiedzi:
JavaScript (ES6), 35 bajtów
Działa również na liczbach zmiennoprzecinkowych dla dwóch dodatkowych bajtów.
źródło
Python, 50 bajtów
Funkcja rekurencyjna, która wymaga krotki. Obejmuje pierwszy element, jeśli pomiędzy pierwszymi dwoma elementami lub poprzednią wartością zapisaną od czasu ostatniego jest niezerowa wartość. Następnie usuwa pierwszy element i powtarza się. Poprzedni element jest przechowywany na liście singleton
p
, która automatycznie pakuje się na listę i zaczyna jako pusta (dzięki Dennisowi za 3 bajty z tym).55 bajtów:
Generuje wszystkie fragmenty długości o długości 3, najpierw umieszczając zera na początku i na końcu, i przyjmuje elementy środkowe tych, które nie wszystkie są zerowe.
Podejście iteracyjne okazało się dłuższe (58 bajtów)
To nie działa dokładnie, ponieważ
b,*l
wymaga Python 3, ale Python 3input
daje ciąg znaków. Inicjalizacja jest również brzydka. Może zadziałałoby podobne podejście rekurencyjne.Niestety metoda indeksowania
nie działa, ponieważ
l[-1:2]
interpretuje-1
jako koniec listy, a nie punkt przed jej rozpoczęciem.źródło
Haskell,
5548 bajtówPrzykład użycia:
h [0,0,0,8,0,1,0,0]
->[0,8,0,1,0]
.scanr
odbudowuje listę danych wejściowychx
z dodatkową0
na początku i na końcu. Na każdym etapie dopasowujemy wzór 3 elementy i zachowujemy środkowy, jeśli jest co najmniej jeden element niezerowy.Dzięki @xnor za 7 bajtów, przełączając się z
zip3
nascanr
.źródło
h x=[snd t|t<-zip3(0:x)x$tail x++[0],(0,0,0)/=t]
, ale wydaje mi się, że nie ma krótkiego sposobu na uzyskanie drugiego elementu 3-krotnego.scan
niżzip3
:h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]]
.Matlab,
2927 bajtówDane wejściowe muszą składać się z
1*n
macierzy (gdzien=0
jest to możliwe). (Zgłasza błąd dla0*0
macierzy).źródło
's'
zamiast'same'
<- :-D'UniformOutpout'
(co zrozumiałe). Ale nie wiedziałem o tym~~a
zamiasta.*a
?logical
tablic. Jest to często problem w przypadku wbudowanych, które nie są napisane w samym Matlabie. W przeciwnym razie tablice logiczne zachowują się bardzo podobnie do tablic numerycznych. To może działać w myślach Octave, ale w tej chwili nie mam go zainstalowanego.J,
1714 bajtówZapisano 3 bajty z pomocą @ Zgarb.
Stosowanie
Wyjaśnienie
Wypróbuj tutaj.
źródło
0<
działałby zamiast0~:
?MATL , 8 bajtów
Dane wyjściowe to ciąg znaków z liczbami oddzielonymi spacjami. Pusta tablica na wyjściu jest wyświetlana jako nic (nawet nowa linia).
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Kod przekształca dane wejściowe na typ logiczny, tzn. Niezerowe wpisy stają się
true
(lub1
), a zero wpisów staje sięfalse
(lub0
). Jest to następnie rozwiązywane z jądrem[1 2 3]
. Niezerowa wartość powoduje niezerowy wynik na tej pozycji i na sąsiednich pozycjach. Konwersja na logiczną dajetrue
wartości, które należy zachować, więc indeksowanie danych wejściowych za pomocą tego daje pożądane dane wyjściowe.źródło
Jolf, 14 bajtów
Teraz, gdy o tym myślę, Jolf jest Javą języków golfowych. westchnienia Wypróbuj tutaj.
Wyjaśnienie
źródło
Python 3, 55 bajtów
źródło
Galaretka , 9 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Perl, 34 + 1 (
-p
flaga) = 35 bajtówPotrzebuje flagi -p do uruchomienia. Pobiera listę liczb jako imput. Na przykład :
źródło
5
jeśli wejdę50 0
.Haskell, 48 bajtów
Patrzy na poprzedni element
p
, pierwszy elementh
i element po (jeśli istnieje), a jeśli jest niezerowy, wstawia pierwszy elementh
.Warunek
any(/=0)$p:h:take 1t
jest długi, w szczególnościtake 1t
. Poszukam sposobu na jego skrócenie, być może poprzez dopasowanie wzoru.źródło
Retina ,
423533 bajtów7 bajtów dzięki Martinowi Enderowi.
Ostatni wiersz jest konieczny.
Zweryfikuj wszystkie przypadki testowe jednocześnie. (Nieznacznie zmodyfikowany, aby uruchomić wszystkie przypadki testowe jednocześnie).
Wygląda na idealny język do zrobienia tego w ... wciąż został pokonany przez większość odpowiedzi.
źródło
Mathematica, 43 bajty
źródło
C, 96 bajtów
Wywołaj
f()
wskaźnikiem do listy liczb całkowitych i wskaźnikiem wielkości listy. Lista i rozmiar są modyfikowane na miejscu.Wypróbuj na ideone .
źródło
f(int*p,int*n)
oszczędza bajt. Lub zdefiniujs
jako trzeci parametr (który nie został przekazany. To rodzaj OK).Brachylog ,
4438 bajtówWypróbuj online!
Ten język jest dobry do sprawdzania rzeczy, z czego będziemy korzystać.
Predykat 0 (główny predykat)
Predykat 1 (predykat pomocniczy)
źródło
Matlab z Przybornikiem przetwarzania obrazu, 27 bajtów
To anonimowa funkcja.
Przykładowe zastosowanie:
źródło
imerode
, ale moje wersje były dłuższe niż moja obecna, fajna robota =)Narzędzia Bash + GNU, 25
Akceptuje dane wejściowe jako listę oddzieloną znakiem nowej linii.
Ideone - z dodanym kodem sterownika testowego, aby uruchomić wszystkie przypadki testowe razem poprzez konwersję do / z separacją spacji i separacją nowego wiersza.
źródło
Cheddar , 78 bajtów
Zestaw testowy.
Cheddar nie ma filtra, więc filtrowanie odbywa się poprzez zawijanie pożądanych elementów i przekształcanie elementów, których nie chcemy, w puste tablice, a następnie łączenie wszystkiego.
Na przykład
[0,0,0,8,0,1,0,0]
staje się[[],[],[0],[8],[0],[1],[0],[]]
, a następnie byłaby skonkatenowana tablica[0,8,0,1,0]
.źródło
.reduce((+))
->.sum
APL, 14 bajtów
Test:
Wyjaśnienie:
0,⍵,0
: dodaj zero na początku i na końcu ⍵×3∨/
: znajdź znak GCD każdej grupy trzech sąsiednich liczb (będzie to 0, jeśli wszystkie będą zerowe, a 1 w przeciwnym razie).⍵/⍨
: wybierz wszystkie elementy z ⍵, dla których wynik to 1.źródło
Ruby 2.x, 63 bajty
Kredyt tam, gdzie jest to należne, jest w istocie częścią doskonałej odpowiedzi Neila na ES6.
To także moje pierwsze zgłoszenie PCG. tak.
źródło
Brain-Flak 142 bajty
Wypróbuj online!
Wyjaśnienie
źródło