Wprowadzenie
Rozważ niepustą listę L liczb całkowitych. Plaster o sumie zerowej z L oznacza ciągłą podciągiem L których suma wynosi 0. Na przykład, [1, -3, 2] jest plaster o sumie zerowej [-2, 4, 1, -3, 2, 2 , -1, -1] , ale [2, 2] nie jest (ponieważ nie sumuje się do 0), podobnie jak [4, -3, -1] (ponieważ nie jest ciągły).
Zbiór plastry o sumie zerowej L jest pokrywa sumie zerowej z L , jeśli każdy element należący do co najmniej jednego segmentu. Na przykład:
L = [-2, 4, 1, -3, 2, 2, -1, -1]
A = [-2, 4, 1, -3]
B = [1, -3, 2]
C = [2, -1, -1]
Trzy wycinki A , B i C sumy zerowej tworzą pokrycie L dla sumy zerowej . Wiele kopii tego samego wycinka może pojawić się w okładce o sumie zerowej, tak jak to:
L = [2, -1, -1, -1, 2, -1, -1]
A = [2, -1, -1]
B = [-1, -1, 2]
C = [2, -1, -1]
Oczywiście nie wszystkie listy mają zerową sumę; niektóre przykłady to [2, -1] (każdy wycinek ma niezerową sumę) i [2, 2, -1, -1, 0, 1] (skrajne lewe 2 nie jest częścią wycinka o sumie zerowej).
Zadanie
Twoje dane wejściowe to niepusta liczba całkowita L , wykonana w dowolnym rozsądnym formacie. Twój wynik powinien być zgodny z prawdą, jeśli L ma pokrycie sumą zerową, a wartością fałszowania, jeśli nie.
Możesz napisać pełny program lub funkcję, a wygrywa najniższa liczba bajtów.
Przypadki testowe
[-1] -> False
[2,-1] -> False
[2,2,-1,-1,0,1] -> False
[2,-2,1,2,-2,-2,4] -> False
[3,-5,-2,0,-3,-2,-1,-2,0,-2] -> False
[-2,6,3,-3,-3,-3,1,2,2,-2,-5,1] -> False
[5,-8,2,-1,-7,-4,4,1,-8,2,-1,-3,-3,-3,5,1] -> False
[-8,-8,4,1,3,10,9,-11,4,4,10,-2,-3,4,-10,-3,-5,0,6,9,7,-5,-3,-3] -> False
[10,8,6,-4,-2,-10,1,1,-5,-11,-3,4,11,6,-3,-4,-3,-9,-11,-12,-4,7,-10,-4] -> False
[0] -> True
[4,-2,-2] -> True
[2,2,-3,1,-2,3,1] -> True
[5,-3,-1,-2,1,5,-4] -> True
[2,-1,-1,-1,2,-1,-1] -> True
[-2,4,1,-3,2,2,-1,-1] -> True
[-4,-1,-1,6,3,6,-5,1,-5,-4,5,3] -> True
[-11,8,-2,-6,2,-12,5,3,-7,4,-7,7,12,-1,-1,6,-7,-4,-5,-12,9,5,6,-3] -> True
[4,-9,12,12,-11,-11,9,-4,8,5,-10,-6,2,-9,10,-11,-9,-2,8,4,-11,7,12,-5] -> True
[2,2,-1,-1,0,1] -> False
nie powinien być prawdziwy, ponieważ oba wycinki[2,-1,-1]
i wartość[-1,0,1]
dodana do zera oraz wszystkie ich elementy znajdują się na oryginalnej liście?Odpowiedzi:
Galaretka ,
1312 bajtówWypróbuj online!
Jak to działa
źródło
Mathematica,
6665 bajtówZaoszczędziłem 1 bajt i mam nadzieję, że dzięki ngenisis nauczyłem się nowej sztuczki na przyszłość!
Dwie równie długie alternatywy, z których obie są nienazwanymi funkcjami przyjmującymi listę liczb całkowitych jako dane wejściowe i zwracające
True
lubFalse
:W obu przypadkach
Tr@#[[i;;j]]
oblicza sumę wycinka danych wejściowych z pozycjii
do pozycjij
(indeksowane 1).Product[...,{i,k},{j,k,l}]
mnoży razem wszystkie te sumy przekrojów, jakoi
przedziały powyżej co najwyżej indeksówk
ij
przedziały powyżej co najmniej indeksówk
. (Zauważ, żel=Tr[1^#]
definiujel
się jako sumę1
wszystkich mocy na liście wejściowej, która jest po prostu długością listy.) Innymi słowy, ten produkt jest równy 0 wtedy i tylko wtedy, gdyk
element th należy do wycinka o sumie zerowej .W pierwszej wersji każdy z tych produktów jest porównywany
0
iAnd@@
zwracaTrue
dokładnie, gdy każdy pojedynczy produkt jest równy0
. W drugiej wersji na listę produktów działa funkcjaNorm
(długośćl
wektora -wymiarowego), która jest równa0
wtedy i tylko wtedy, gdy każdy wpis jest równy0
.źródło
Tr[1^#]
oszczędza1
bajt zLength@#
.0^
działałby zamiast0==
? Nie jestem pewien, jak Mathematica sobie z tym radzi. (wróciłbyś1
/0
zamiasttrue
/false
)Indeterminate
do0^0
. Poza tym,1
/ w0
rzeczywistości nie są w prawdzie / fałszem w Mathematica - jest zbyt mocno wpisany, aby uszczęśliwić golfistów :)Mathematica,
6564 bajtówDzięki ngenisis za oszczędność 1 bajtu.
Wolę znaleźć rozwiązanie pasujące do czystego wzorca, ale okazuje się być trudne (i rzeczy takie
{___,a__,___}
są zawsze bardzo długie).źródło
Haskell, 94 bajty
Przykład użycia:
g [-11,8,-2,-6,2,-12,5,3,-7,4,-7,7,12,-1,-1,6,-7,-4,-5,-12,9,5,6,-3]
->True
.Jak to działa (użyjmy
[-1,1,5,-5]
do wprowadzania danych):źródło
powerslice
jest tak świetną nazwą funkcji.Ruby, 81 bajtów
Wypróbuj online
Uproszczone rozwiązanie brutalnej siły; dla każdego elementu tablicy spróbuj znaleźć plasterek o sumie zerowej, który go zawiera.
źródło
J,
3635 bajtówDo każdego podsumu dodaję indeksy elementu i przechowuję indeksy, jeśli subum jest,
0
a następnie sprawdzam, czy każdy indeks jest obecny.Sztuczka: indeksy listy 1 mogą być generowane z
#\
np. Długością każdego prefiksu.Stosowanie:
Wypróbuj online tutaj.
źródło
#\*/@e.&,]({:*0=1#.{.)@|:\.\@,.#\
JavaScript (ES6), 109 bajtów
Testowy fragment kodu
Pokaż fragment kodu
źródło
Python,
123120 bajtów-3 bajty dzięki @Zgarb
Wypełnia listę o tym samym rozmiarze co dane wejściowe plasterkami o sumie zerowej i zastępuje zgodnie z indeksami, zwracając jej równość do oryginału na końcu.
źródło
0
jako symbolu zastępczego zamiastNone
. Nie będzie fałszywych trafień, ponieważ każdy0
z danych wejściowych zawsze zawiera część lub wycinek o sumie zerowej.Scala, 49 bajtów
Wypróbuj w ideone
Stosowanie:
Nie golfowany:
Wyjaśnienie:
źródło
%
jako nazwy parametru? Fajne!.,;:()[]{}\"'
. Bardzo przydatne do gry w golfa, ponieważ są one oddzielane od liter przez parsowanie, dzięki czemu można zaoszczędzić trochę białych znaków.true
to drugie przypadek fałszowania.Python, 86 bajtów
Prawda = 1 Falsy = Brak
źródło
1
trzeci przypadek testowy.1
wszystkie przypadki testowe, z wyjątkiem dwóch pierwszych przypadków fałszowania.Clojure, 109 bajtów
Generuje wszystkie partycje, które sumują się do zera, sprawdza, czy ma odrębne indeksy „długości wektora wejściowego”.
źródło
PHP, 104 bajty
Brutalna siła i wciąż ponad 99 bajtów. :-(
pobiera dane wejściowe z argumentów wiersza poleceń,
1
dla prawdy, puste dla fałszu. Uruchom z-r
.awaria
$argv[0]
zawiera nazwę pliku; jeśli zostanie uruchomiony z-r
, będzie to-
i oceniać0
dla operacji numerycznych.źródło
JavaScript (ES6), 102 bajty
Oblicza sumy częściowe dla wszystkich elementów
i..j
włącznie i resetuje odpowiednie elementyb
od1
do,0
kiedy znajdzie sumę zerową, ostatecznie sprawdzając, czy nie ma już żadnych1
s.źródło