Łańcuch dodawania jest sekwencją liczb całkowitych rozpoczynających się od 1, gdzie każda liczba całkowita inna niż początkowa 1 jest sumą dwóch poprzednich liczb całkowitych.
Oto na przykład łańcuch dodawania:
[1, 2, 3, 4, 7, 8, 16, 32, 39, 71]
Oto sumy, które sprawiają, że jest to łańcuch dodawania:
1 + 1 = 2
1 + 2 = 3
1 + 3 = 4
3 + 4 = 7
1 + 7 = 8
8 + 8 = 16
16 + 16 = 32
7 + 32 = 39
32 + 39 = 71
W tym wyzwaniu otrzymasz dodatnią liczbę całkowitą n
i musisz wygenerować jeden z najkrótszych łańcuchów dodawania, który kończy się na n
.
Przykłady - zwróć uwagę, że istnieje wiele możliwych wyników, wszystko, co musisz znaleźć, to łańcuch dodatków, który jest tak samo krótki:
1: [1]
2: [1, 2]
3: [1, 2, 3]
4: [1, 2, 4]
5: [1, 2, 3, 5]
6: [1, 2, 3, 6]
7: [1, 2, 3, 4, 7]
11: [1, 2, 3, 4, 7, 11]
15: [1, 2, 3, 5, 10, 15]
19: [1, 2, 3, 4, 8, 11, 19]
29: [1, 2, 3, 4, 7, 11, 18, 29]
47: [1, 2, 3, 4, 7, 10, 20, 27, 47]
71: [1, 2, 3, 4, 7, 8, 16, 32, 39, 71]
Standardowe reguły we / wy itp. Standardowe luki zabronione. Code golf: Wygrywa najmniej bajtów.
code-golf
sequence
arithmetic
isaacg
źródło
źródło
Odpowiedzi:
Haskell , 57 bajtów
Rozwiązanie brutalnej siły. Wypróbuj online!
Wyjaśnienie
Lista nieskończona
c
zawiera wszystkie łańcuchy dodawania uporządkowane według długości. Definiuje się go indukcyjnie, biorąc listęx
zc
dwóch elementówx
i dołączając ich sumę dox
. Funkcjaf
znajduje pierwszą listę,c
która kończy się żądaną liczbą.źródło
Brachylog , 14 bajtów
Wypróbuj online!
Poddanie brutalnej siły, które buduje wszystkie możliwe łańcuchy dodatków przy użyciu iteracyjnego pogłębiania, zatrzymując się po znalezieniu łańcucha zawierającego właściwy argument. W przeciwieństwie do większości zgłoszeń Brachylog, jest to zgłoszenie funkcji, które wprowadza za pomocą swojego prawego argumentu (tradycyjnie nazywanego wyjściem) i wysyła za pomocą swojego lewego argumentu (konwencjonalnie nazywanego wejściem); robienie tego jest nieco kontrowersyjne, ale najwyżej głosowana meta odpowiedź na ten temat mówi, że jest legalna (i robi to zgodnie z naszymi normalnymi ustawieniami domyślnymi We / Wy dla funkcji). Gdybyśmy użyli wejścia i wyjścia w bardziej konwencjonalny sposób, byłoby to 16 bajtów (
∧≜;1{j⊇Ċ+}ᵃ⁽.∋?∧
), ponieważ prawa strona programu nie byłaby w stanie skorzystać z domniemanego ograniczenia (wymagałoby to wyłączenia i nowego jawnego ograniczenia, kosztem 2 bajtów).Wyjaśnienie
Interesującą subtelnością jest to, co dzieje się podczas pierwszej iteracji, gdzie dane wejściowe to liczba, a nie lista, jak w innych iteracjach; zaczynamy od cyfry 1, wykonujemy dwie kopie każdej cyfry (tworząc cyfrę 11), a następnie znajdujemy 2-cyfrową podsekwencję (również cyfrę 11). Następnie bierzemy jego sumę cyfr, która wynosi 2, i dlatego sekwencja zaczyna się
[1,2]
tak, jak chcemy. Na kolejnych iteracjach, zaczynamy z listą podobnego[1,2]
, podwajając go[1,2,1,2]
, a następnie podjęcie dwóch elementów podciąg ([1,1]
,[1,2]
,[2,1]
, lub[2,2]
); wyraźnie, sumy każdego z nich będą obowiązywać kolejne elementy łańcucha dodawania.Trochę frustrujące jest tutaj to, że potrzebna jest tutaj wskazówka kolejności oceny, szczególnie
≜
komponent (wydaje się, że domyślnieᵃ
bierze podpowiedź kolejności oceny od wewnątrz, a nie z zewnątrz, a więc raczej prymitywne użycie≜
w celu wymuszenia tego problemu).źródło
ᵃ
jest jednym z tych wbudowanych programów, które rzadko się pojawiają, ale kiedy jest to potrzebne, naprawdę jest to potrzebne, ponieważ nie ma zdalnego sposobu na zaimplementowanie go przy użyciu innych konstrukcji kontrolnych. Kiedy zdałem sobie sprawę, że toᵃ
wyzwanie, reszta przyszła dość bezpośrednio stamtąd.Galaretka , 17 bajtów
Wysyła leksykograficznie pierwsze rozwiązanie w czasie wykładniczym.
Wypróbuj online!
Jak to działa
źródło
JavaScript (ES6),
8386 bajtówEdycja: naprawiono, aby wyświetlać listę w odwrotnej kolejności
Próbny
Pokaż fragment kodu
źródło
PHP, 195 bajtów
Wypróbuj online!
źródło
Mathematica, 140 bajtów
.
tworzy inny najkrótszy łańcuch dodawania za każdym razem, gdy go uruchomisz
Wypróbuj online,
wklej kod za pomocą ctrl + v, umieść dane wejściowe tj. [71] na końcu kodu i naciśnij shift + enter
źródło
[1,2,4,5,9,18,36,72,77,149]
). Wygląda na to, że Twój program używa losowego próbkowania i nie ma gwarancji znalezienia optymalnego rozwiązania.Pyth, 13 bajtów
Zestaw testowy
Daje leksykograficznie pierwszy najkrótszy łańcuch. Jest dość wolny, ale nie taki zły -
19
kończy się w około 30 sekund za pomocą pypy.Kilka pomysłów z rozwiązania @ Dennis.
Naprawdę podoba mi się ten - jest w nim mnóstwo fajnych sztuczek.
Wyjaśnienie:
Wciąż jest to trochę trudne do zrozumienia, ale pozwól mi wyjaśnić nieco bardziej szczegółowo.
Zaczynamy od
ySQ
, który daje wszystkie możliwe uporządkowane podzbiory[1, 2, ... Q]
, w rosnącym porządku wielkości. Najkrótszy łańcuch dodawania jest zdecydowanie jednym z nich, ale musimy go znaleźć.Pierwszą rzeczą, którą zrobimy, jest filtrowanie listy, aby zachować tylko listy zawierające
Q
. Robimy to z/#Q
.Następnie porządkujemy listę według tego, co pozostało po usunięciu wyniku określonej funkcji.
-D
zamówienia przez resztę po usunięciu czegoś.Usuwamy to
sM^N2
, gdzieN
znajduje się lista, z której usuwamy rzeczy.^N2
daje produkt kartezjańskiN
ze sobą, wszystkie możliwe pary dwóch elementów wN
.sM
następnie sumuje każdą z par.Jaki jest najmniejszy możliwy wynik po tym usunięciu? Cóż, najmniejszy element na liście wejściowej na pewno pozostanie, ponieważ wszystkie liczby są dodatnie, więc każda suma dwóch liczb będzie większa niż najmniejsza liczba. I będzie co najmniej jedna liczba, ponieważ sprawdziliśmy, czy dane wejściowe były obecne na liście. Dlatego najmniejszym możliwym wynikiem będzie, gdy każda liczba oprócz najmniejszej liczby będzie sumą dwóch innych liczb na liście, a najmniejsza liczba na liście to 1. W tym przypadku kluczem sortującym będzie
[1]
. Wymagania te oznaczają, że lista musi być łańcuchem dodatkowym.Tak więc sortujemy łańcuchy dodatków z przodu. Pamiętaj, że
y
podaje podzbiory w kolejności rosnącej, więc lista posortowana na początku musi być jednym z najkrótszych łańcuchów dodawania.h
wybiera tę listę.źródło