Dziś twoim celem jest znalezienie liczby całkowite a i b daną liczbę całkowitą nieujemną n takie, że:
Należy napisać program lub funkcję, która przyjmuje parametr n i wyjść i B w formacie do wyboru.
Obowiązują standardowe luki. Ponadto zamierzone jest samodzielne wdrożenie powyższego problemu za pomocą podstawowej arytmetyki. Dlatego nie możesz używać wbudowanej funkcji algebry dokładnej, wymiernych ani funkcji implementujących nietrywialne konstrukcje matematyczne (na przykład sekwencję Lucas ).
Najkrótszy kod w bajtach wygrywa.
Przykładowe wejście / wyjście:
0 → 1, 0
1 → 3, 1
2 → 14, 6
3 → 72, 32
4 → 376, 168
5 → 1968, 880
6 → 10304, 4608
7 → 53952, 24128
8 → 282496, 126336
9 → 1479168, 661504
źródło
[3 5;1 3]**input('')*[1;0]
ma 26 bajtów, a nie 41.@(n)[3 5;1 3]^n*[1;0]
(uchwyt funkcji) pozwoliłby ci zaoszczędzić pięć znaków, mut fajny pomysł!Python 2, 50
Mnoży się
3+sqrt(5)
wielokrotnie przez działanie na(a,b)
reprezentującą paręa+b*sqrt(5)
. Równoważne do rozpoczęcia od wektora kolumny[1,0]
in
czasów pomnożenia w lewo przez macierz[[3,5],[1,3]]
.źródło
Julia,
2220 bajtówTworzy to funkcję lambda, która przyjmuje na wejściu pojedynczą liczbę całkowitą i zwraca 2-elementowy wektor liczb całkowitych odpowiadający rozwiązaniu [a, b]. Aby to nazwać, nadaj mu nazwę, np
f=n->...
.Zacznij od pomnożenia
Następnie możemy przetłumaczyć prawą stronę tego równania na macierz 2-kolumnową, gdzie pierwsza odpowiada współczynnikowi a, a druga współczynnikowi b :
Pomnóż tę macierz sama n razy, a następnie pomnóż w prawo przez wektor kolumny (1, 0) i POOF! Wyskakuje wektor rozwiązania.
Przykłady:
źródło
J, 20 bajtów
Pomnóż wektor
[1 0]
przez[[3 5] [1 3]]
n
czasy macierzy .2 bajty zapisane dzięki @al algorytmshark.
Zastosowanie i test:
źródło
+/ .*(3 5,:1 3&)&1 0
.(+/@:*&(3 5,.1 3)&1 0)
działa, a(+/@:*&1 0&(3 5,.1 3))
nie? Czy drugie nie powinno być prawidłowo połączone, a pierwsze zamienione?&
powoduje zasilanie / zapętlenie, więc modyfikujesz wejście po lewej stronie podczas zasilania (przeciwnie do normalnej modyfikacji po prawej stronie).Pyth, 20 bajtów
u
który jest ogólnie redukowany, jest tutaj stosowany jako pętla powtarzania zastosowania. Funkcja aktualizacji toG
->,+*3sGyeG+sGyeG
, gdzieG
jest 2 krotki. Ta funkcja przekłada się na3*sum(G) + 2*G[1], sum(G) + 2*G[1]
.s
jestsum
,y
jest*2
.źródło
APL (22)
Wyjaśnienie:
{
...}⍣⎕⍨2↑1
: przeczytaj liczbę i uruchom następującą funkcję wiele razy, używając[1,0]
jako danych wejściowych.2 2⍴3 5 1
: macierz[[3,5],[1,3]]
⍵+.×⍨
: pomnóż pierwszą liczbę w ⍵ przez 3, drugą przez 5, i zsumuj je, to jest nowa pierwsza liczba; następnie pomnóż pierwszą liczbę w ⍵ przez 1, drugą przez 3 i zsumuj te, czyli nową drugą liczbę.źródło
Galaretka , 13 bajtów
Wypróbuj online!
Jak to działa
źródło
Mathematica, 31
źródło
CJam, 21 bajtów
Wypróbuj online.
Jak to działa
źródło
JavaScript,
6361 bajtówKorzystam z rekurencyjnej oceny dwumianu: (x + y) ^ n = (x + y) (x + y) ^ {n-1}
Nowość (dzięki @ edc65)
Stary
źródło
F=n=>{for(i=y=0,x=1;i++<n;)[x,y]=[3*x+5*y,x+3*y];return[x,y]}
n=>[...Array(n)].map(_=>[x,y]=[3*x+5*y,x+3*y],y=0,x=1)[n-1]
ta sama długośćC, 114 bajtów
To powoduje nudne mnożenie macierzy. Aby uzyskać więcej zabawy (cytat: „niesamowicie przerażający”) 238 bajtów, nie szukaj dalej!
Rozpruty:
Prawdopodobnie można to nieco skrócić. Wypróbuj program testowy online !
źródło
k2 - 22 znak
Funkcja przyjmująca jeden argument.
_mul
jest mnożenie macierzy więc curry go z matrycy(3 5;1 3)
, a następnie uderzył go z funkcjonalnej mocy przysłówek:f/[n;x]
stosujef
sięx
,n
czasy. Ponownie curry, tym razem z wektorem początkowym1 0
.To nie zadziała w Kona, ponieważ z jakiegoś powodu
f/[n;x]
nie jest poprawnie zaimplementowane.n f/x
Działa tylko składnia, więc najkrótsza poprawka to{x _mul[(3 5;1 3)]/1 0}
23 znaki.źródło
ised, 25 bajtów (20 znaków)
Miałem nadzieję, że będzie lepiej, ale jest po prostu zbyt wiele aparatów ortodontycznych potrzebnych, aby uczynić go kompetentnym, priorytet operatorów nie jest optymalny do gry w golfa.
Oczekuje, że wejście znajdzie się w gnieździe pamięci o wartości 1 USD, więc działa to:
Dla n = 0 zero jest pomijane (wyjścia 1, zamiast 1 0). Jeśli to problem, wymień ostateczna
1
z~[2]
.źródło
Poważnie, 32 bajty, niekonkurujące
Hex Dump:
Wypróbuj Onlline
Oczywiście nie jest to zawodnik najkrócej, ale przynajmniej metoda jest oryginalna. (Zwracając uwagę, że taki problem niekoniecznie wskazuje sekwencję Lucas, jak wspomniano w opisie, ten program generuje kolejne terminy sekwencji przy użyciu relacji powtarzalności
a_n = 6 * a_ {n-1} - 4 * a_ {n-2}).
źródło
Haskell, 41 bajtów
Przykład użycia:
(iterate(\(a,b)->(3*a+5*b,a+3*b))(1,0)!!) 8
->(282496,126336)
.źródło
C / C ++ 89 bajtów
Sformatowany:
Ta sama koncepcja:
Stanowisko testowe:
Wyjście:
źródło
K, 37 bajtów
lub
Oba są tym samym.
źródło
Python 3, 49 bajtów
chociaż na mojej maszynie daje to tylko prawidłową odpowiedź dla danych wejściowych w zakresie
0 <= n <= 18
.To implementuje formułę formularza zamkniętego
i wykorzystuje fakt, że
v ** n
część jest niewielka i można ją obliczyć raczej zaokrąglając niż bezpośrednio.źródło
Schemat, 97 bajtów
źródło
C 71 bajtów (60 ze wstępnie zainicjalizowanymi zmiennymi)
Możliwości gry w golfa, ale tylko po to, aby udowodnić, że C nie musi być „strasznie przerażający”.
Jeśli wartości w a są inicjalizowane na {1,0}, robimy to lepiej.
Jest to iteracyjnie użycie odwzorowań a-> 3a + 5b, b-> a + 3b, ale unikanie zmiennej tymczasowej poprzez obliczenie a na podstawie nowej wartości b.
źródło
a[*a=1]=0
zamiast*a=1,a[1]=0
(niekonkurujące) galaretka, 10 bajtów
Wypróbuj online!
Wykorzystuje matrycę. Oblicza ([[3,1], [5,3]] ** input ()) [0].
źródło