Wyzwanie
Wyzwanie polega na napisaniu kodu, który przyjmuje dodatnią liczbę całkowitą n jako dane wejściowe i wyświetla wszystkie możliwe sposoby zapisywania liczb od 1 - n, ze znakiem dodatnim lub ujemnym pomiędzy, tak że ich suma wynosi równa zero. Pamiętaj, że możesz używać tylko dodawania lub odejmowania.
Na przykład, jeśli wartością wejściową jest 3, wówczas istnieją 2 sposoby, aby suma 0:
1+2-3=0
-1-2+3=0
Zauważ, że liczby są w porządku, zaczynając od 1 do n (w tym przypadku jest to 3). Jak widać z przykładu, znak pierwszej liczby może być również ujemny, więc bądź ostrożny.
Teraz 3 było bardzo proste. Wymieńmy wszystkie sposoby, biorąc pod uwagę liczbę 7.
1+2-3+4-5-6+7=0
1+2-3-4+5+6-7=0
1-2+3+4-5+6-7=0
1-2-3-4-5+6+7=0
-1+2+3+4+5-6-7=0
-1+2-3-4+5-6+7=0
-1-2+3+4-5-6+7=0
-1-2+3-4+5+6-7=0
Mamy więc tutaj 8 możliwych sposobów.
Wejście i wyjście
Jak wspomniano wcześniej, wejście będzie dodatnią liczbą całkowitą . Twój wynik powinien zawierać wszystkie możliwe sposoby, w jakie liczby dają sumę zero. Jeśli nie ma możliwości zrobienia tego samego, możesz wypisać cokolwiek chcesz.
Ponadto, można wydrukować dane wyjściowe w dowolnym formacie chcesz . Ale powinno to być zrozumiałe . Na przykład możesz wydrukować go jak w powyższym przykładzie. Lub możesz po prostu wydrukować znaki liczb w kolejności. W przeciwnym razie możesz również drukować „0” i „1” w kolejności, gdzie „0” wyświetla znak ujemny, a „1” wyświetla znak dodatni (lub odwrotnie).
Na przykład możesz przedstawić 1 + 2-3 = 0, używając:
1+2-3=0
1+2-3
[1,2,-3]
++-
110
001
Jednak dla uproszczenia zaleciłbym użycie jednego z trzech pierwszych formatów. Możesz założyć, że wszystkie dane wejściowe są prawidłowe.
Przykłady
7 ->
1+2-3+4-5-6+7=0
1+2-3-4+5+6-7=0
1-2+3+4-5+6-7=0
1-2-3-4-5+6+7=0
-1+2+3+4+5-6-7=0
-1+2-3-4+5-6+7=0
-1-2+3+4-5-6+7=0
-1-2+3-4+5+6-7=0
4 ->
1-2-3+4=0
-1+2+3-4=0
2 -> -
8 ->
1+2+3+4-5-6-7+8=0
1+2+3-4+5-6+7-8=0
1+2-3+4+5+6-7-8=0
1+2-3-4-5-6+7+8=0
1-2+3-4-5+6-7+8=0
1-2-3+4+5-6-7+8=0
1-2-3+4-5+6+7-8=0
-1+2+3-4+5-6-7+8=0
-1+2+3-4-5+6+7-8=0
-1+2-3+4+5-6+7-8=0
-1-2+3+4+5+6-7-8=0
-1-2+3-4-5-6+7+8=0
-1-2-3+4-5+6-7+8=0
-1-2-3-4+5+6+7-8=0
Punktacja
To jest kod-golf , więc wygrywa najkrótszy kod!
źródło
+
jakoN
i-
jako-N
, czy to za daleko? (np.3
->[[-3,-3,3], [3,3,-3]]
)0
i1
, ale używającN
i-N
(patrz moja edycja powyżej)Odpowiedzi:
Haskell , 42 bajty
Wypróbuj online!
źródło
0==
?Galaretka , 9 bajtów
Wypróbuj online!
Exp
Galaretka , 9 bajtów
Sugestia Jonathana Allana , wypisz listę znaków.
Wypróbuj online!
źródło
,Nṗæ.ÐḟR
?n
.N
I-N
wyjście Zasugerowałem została dopuszczona, dzięki czemu oszczędza jeden bajt :) (wystarczy wspomnieć format odpowiedź)Python 2 , 62 bajty
Wypróbuj online!
Pan Xcoder zapisał 4 bajty przy użyciu sprytnego użycia argumentów oznaczonych gwiazdką.
źródło
*l
zamiastl=[]
Perl,
3736 bajtówźródło
-n
i<<<
jeśli zastąpi$_
siępop
. To tak naprawdę nie poprawia twojego wyniku, ale sprawia, że ogólna ekspresja jest krótsza;)05AB1E , 11 bajtów
Wypróbuj online!
Format wyjściowy dla np. Danych wejściowych
3
to:Oznacza to, że
-1-2+3, 1+2-3
.źródło
Wolfram Language (Mathematica) , 36 bajtów
Wypróbuj online!
źródło
Łuska , 10 bajtów
Wypróbuj online!
Wyjaśnienie
Niezbyt skomplikowane.
źródło
Python 3 , 105 bajtów
Wypróbuj online!
źródło
Szybki , 116 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 , 91 bajtów
Wypróbuj online!
Zwraca listę satysfakcjonujących list (np. F (3) = [[- 1, -2,3], [1,2, -3]])
źródło
APL (Dyalog) , 38 bajtów
Wypróbuj online!
źródło
Pyth , 13 bajtów
Wypróbuj tutaj!
źródło
C (gcc) , 171 bajtów
Wypróbuj online! Używa znaków
0
ujemnych i2
dodatnich.źródło
Czysty , 79 bajtów
Wypróbuj online!
źródło
Python 3 + numpy,
104103 bajtyWyjście wynosi [-1, 1] odpowiadające znakowi.
źródło
if
dla -1 bajtówJavaScript (ES6),
6961 bajtówZaoszczędzono 8 bajtów, pozbywając się k , jak sugeruje @Neil
Wyświetla wszystkie rozwiązania za pomocą alert () .
Przypadki testowe
Korzystanie z console.log () zamiast alert () w celu ułatwienia obsługi.
Pokaż fragment kodu
źródło
k
? Coś w tym stylu:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Siatkówka , 73 bajty
Wypróbuj online! Wyjaśnienie:
Przekształć dane wejściowe w jednoargumentowe.
Konwertuj liczbę na listę
=
liczb z prefiksem.Zastąp każdy
=
po kolei zarówno-
i+
, za każdym razem duplikując liczbę linii.Osobno policz liczbę
_
s po-
s i+
s. To sumuje liczby ujemne i dodatnie.Zachowaj tylko te wiersze, w których
-
s i+
s anulują się.Usuń liczby.
Konwertuj na dziesiętny.
źródło
Perl 6 , 43 bajtów
Spróbuj
Zwraca sekwencję list
Rozszerzony:
1..$_ X* 1,-1
⇒(1, -1, 2, -2)
(…).rotor(2)
⇒((1, -1), (2, -2))
[X] …
⇒((1, 2), (1, -2), (-1, 2), (-1, -2))
źródło
J ,
3530 bajtów-5 bajtów dzięki FrownyFrog!
Wypróbuj online!
Oryginalny:
J , 35 bajtów
Jak to działa
Mnożę listę 1..n przez wszystkie możliwe listy współczynników 1 / -1 i znajduję te, które sumują się do zera.
Wypróbuj online!
Alternatywnie spróbowałem jawnego czasownika, używając podejścia iloczynu kartezjańskiego +/-:
J , 37 bajtów
{(<"1@,.-)
znajduje na przykład produkty kartezjańskie:Szkoda, że zawiera wynik, więc wydałem trochę bajtów na rozpakowanie wartości
Wypróbuj online!
źródło