Możesz rozłożyć liczbę większą niż 0 jako unikalną sumę dodatnich liczb Fibonacciego. W tym pytaniu robimy to poprzez wielokrotne odejmowanie największej możliwej dodatniej liczby Fibonacciego. Na przykład:
1 = 1
2 = 2
3 = 3
4 = 3 + 1
12 = 8 + 3 + 1
13 = 13
100 = 89 + 8 + 3
Teraz nazywam produkt Fibonacciego tymi samymi listami, co powyżej, ale z dodatkiem zastąpionym mnożeniem. Na przykład f(100) = 89 * 8 * 3 = 2136
.
Napisz program lub funkcję, która podając dodatnią liczbę całkowitą n zwraca iloczyn Fibonacciego o tej liczbie.
Przypadki testowe:
1: 1
2: 2
3: 3
4: 3
5: 5
6: 5
7: 10
8: 8
9: 8
42: 272
1000: 12831
12345: 138481852236
code-golf
math
sequence
fibonacci
code-golf
word
code-golf
cipher
code-golf
string
math
subsequence
code-golf
regular-expression
code-golf
brainfuck
assembly
machine-code
x86-family
code-golf
math
factorial
code-golf
math
geometry
code-golf
math
arithmetic
array-manipulation
math
number
optimization
stack
metagolf
code-golf
tips
assembly
code-golf
tips
lisp
code-golf
number-theory
path-finding
code-golf
number
sequence
generation
code-golf
math
geometry
code-golf
grid
permutations
code-golf
code-golf
graphical-output
geometry
fractal
knot-theory
code-golf
math
arithmetic
code-golf
interpreter
balanced-string
stack
brain-flak
code-golf
math
set-theory
code-golf
math
array-manipulation
code-golf
code-golf
string
natural-language
code-golf
code-golf
math
linear-algebra
matrix
code-golf
string
encode
orlp
źródło
źródło
2
Można rozłożyć jako-1 + 3
. Prawidłowe stwierdzenie twierdzenia Zeckendorfa jest takie, że dodatnią liczbę Fibonacciego można jednoznacznie rozłożyć jako sumę niesekwencyjnych liczb Fibonacciego o dodatnim indeksie.Odpowiedzi:
Galaretka ,
1615 bajtówNiezbyt szybki lub przyjazny dla pamięci, ale wystarczająco wydajny dla wszystkich przypadków testowych. Wypróbuj online!
Jak to działa
źródło
Python, 54 bajty
Po prostu jakaś dobra stara rekurencja.
źródło
Perl,
6963 + 4 (-pl61
flaga) = 67 bajtówZa pomocą:
Nie golfowany:
Ideone .
źródło
061
jest kodowaniem ASCII tego znaku'1'
. Fajny hack w użyciu,$\
aby wydrukować go prawie za darmo.JavaScript (ES6),
7842 bajtówPort odpowiedzi @ Sp3000. Oryginalna 78-bajtowa wersja:
źródło
> <> , 57 bajtów
Oczekuje, że numer wejściowy będzie obecny na stosie podczas uruchamiania programu.
Tworzy sekwencję Fibonacciego (
f0, f1, f2, ..., fn
) na stosie, dopóki nie zostanie osiągnięta liczba większa niż liczba wejściowa (i
). Następnie za pomocą produktu (p
) zainicjowanego w celu1
...Wypróbuj online!
źródło
Pyth, 28 bajtów
Myślę, że można grać w golfa znacznie dalej ...
Wypróbuj online!
źródło
Pyth, 24 bajty
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
Q
jest przypisany z numerem wejściowym.Część
h.WgQeH,eZsZ1
oblicza największą liczbę Fibonacciego, która jest mniejsza lub równaQ
Więc jeśli
Q = 10
generuje liczby / pary:Reszta kodu oblicza partycję i mnoży liczby razem:
Istnieje oczywiście wiele krótszych rozwiązań (z naprawdę kiepskimi czasami uruchamiania)
*FhfqQsTyeM.u,eNsNQ1
.źródło
Haskell, 44 bajty
Yay dla wzajemnej rekurencji:
a
jest poprzednim numerem Fibonacciegob
jest bieżącą liczbą Fibonacciegoc
jest wejściemf
jest pożądaną funkcjąMniej golfa:
źródło
Właściwie 22 bajty
Wypróbuj online!
Wyjaśnienie:
źródło
JavaScript (ES6)
13410692 bajtówDzięki za @cat za zauważenie spacji.
Po prostu niezoptymalizowana wersja wykonana na mój telefon. Po powrocie do gry gram w golfa. Pomysły są mile widziane.
źródło
ZWROT , 44 bajty
Try it here.
Zadziwiająco mało wydajna anonimowa lambda, która pozostawia wynik na Stack2. Stosowanie:
UWAGA: ␌ i ␁ są symbolami zastępczymi dla ich odpowiednich niedrukowalnych znaków: Form Feed i Początek nagłówka .
Wyjaśnienie
źródło
PHP, 119 bajtów
Kod (owinięty w dwa wiersze dla czytelności):
Pierwszy wiersz oblicza
$f
liczby Fibonacciego mniejsze niż$n
(argument podany w wierszu poleceń). Drugi wiersz oblicza współczynniki Fibonacciego (przez odjęcie) i mnoży je, aby obliczyć iloczyn$o
.Przygotuj kod za pomocą
<?php
(technicznie nie jest częścią programu), umieść go w pliku (fibonacci-factors.php
), a następnie uruchom jako:Lub uruchom go za pomocą
php -d error_reporting=0 -r '... code here ...' 100
.Niegolfowany kod i zestaw testów można znaleźć na Github .
źródło
P, 47 bajtów
Test
odczytaj to jako pary (i, mapa (m, i)), gdzie m jest funkcją obliczeniową, a ja różnymi argumentami
pisze
Wyjaśnienie
n funtion\arg
stosuje funkcję (funkcja (funkcja (... funkcja (argumenty))) n razy (wewnętrznie używa rekurencji talowej) i zwraca sekwencję wyników. Obliczamy 60 pierwszych pozycji serii fibonnaci jako*+60(|+\)\1 0
. W takim przypadku funkcją jest ( | +): + \ zastosowane w sekwencji oblicza sumy cząstkowe (ex + \ 1 2 3 to 1 3 6) i | odwraca sekwencję, więc każda 'iteracja' obliczamy sumy cząstkowe dwóch poprzednich liczb Fibonacciego i zwracamy częściowe sumy odwrócone60(|+\)\1 0
generują sekwencje 1 0, 1 1, 2 1, 3 2, 5 3, 8 5, 13 8, 21 13, ...*+
nakładane na ten wynik przerzucają (trasują go) i przyjmują pierwszą. Wynik jest sekwencją 1 1 2 3 5 8 13 21 34 55 ..(cond)function\args
stosuje funkcję (function (.. function (args))) podczas warunku true i zwraca sekwencję częściowych wynikówfunction[arg]
nałożone na funkcję więcej niż jednego argumentu tworzy rzut (częściowe zastosowanie)Możemy podać nazwę argumentom, ale implikowane nazwy to x, y, z
{y-x x bin y}[*+60(|+\)\1 0]
deklaruje lambda za pomocą argumentów x, y z rzutowaniem częściowym (arg x jest serią Fibonacciego, oblicza się jako * + 60 (| +) \ 1 0). x oznacza wartości Fibonacciego, a y liczbę do przetworzenia. Wyszukiwanie binarne (bin) służy do zlokalizowania indeksu większej liczby Fibonacciego <= y (x bin y
) i odjęcia odpowiedniej wartości x.Aby obliczyć iloczyn z częściowych wyników, odwracamy je i obliczamy różnicę dla każdej pary (
-':|
), upuszczamy pierwszą (1_
ponieważ wynosi 0) i mnożymy przez (*/
).Jeśli interesuje nas skumulowana suma, kod jest taki sam, ale z
+/
zamiast*/
. Możemy również użyć dowolnego innego operatora diadic zamiast + lub *O wydajności wykonania
Wiem, że w tym konkursie wydajność nie stanowi problemu. Ale w tym problemie możemy wahać się od kosztu liniowego do kosztu wykładniczego, więc jestem ciekawy.
Opracowałem drugą wersję (długość 48 bajtów bez komentarza) i powtarzałem przypadki testowe baterii 1000 razy w obu wersjach.
czas wykonania to: oryginalna wersja 0'212 seg, nowa wersja 0'037 seg
Oryginalna wersja oblicza serię fibbonaci raz na aplikację funkcji; Nowa wersja oblicza Fibonacciego tylko jeden.
W obu przypadkach obliczenia serii Fibonacciego wykorzystują rekurencję ogona
źródło