Monday Mini-Golf: Seria krótkich golfowych wyzwań, opublikowanych (miejmy nadzieję!) W każdy poniedziałek.
Fibonacciego jak sekwencji otrzymano z użyciem takiego samego sposobu jak znanego ciągu Fibonacciego ; to znaczy, każdą liczbę F (n) można znaleźć, dodając dwie poprzednie liczby w sekwencji ( F (n) = F (n-1) + F (n-2) ) lub odejmując kolejne dwie liczby ( F (n) = F (n + 2) - F (n + 1) ). Główną różnicą jest to, że sekwencje te mogą zaczynać się dowolnymi dwiema liczbami. Zerowe indeksowanie tych sekwencji jest dyskusyjne, ale na razie użyjemy tej reguły:
- Liczba 0 w sekwencji podobnej do Fibonacciego jest ostatnią liczbą, która jest mniejsza niż liczba poprzednia.
Jako przykład, sekwencję Fibonacciego można zapisać jako 1, 0, 1, 1, 2, 3, 5...
, więc 0-ta liczba w sekwencji jest samotna 0
.
Wyzwanie
Celem wyzwania jest napisanie programu lub funkcji, która przyjmuje trzy liczby całkowite, w dowolnym formacie:
- A i B , dwie liczby, z którymi rozpoczyna się generowanie sekwencji.
- N , długość wynikowej sekwencji do wyjścia.
I wyprowadza pierwsze N liczb sekwencji, zaczynając od 0.
Detale
- A , B i N można przyjmować w dowolnej kolejności i formacie, o ile są one wyraźnie rozdzielone. Jeśli używasz innego zamówienia / formatu, określ, co to jest.
- Możesz założyć, że A , B i N są zawsze dodatnimi liczbami całkowitymi.
- Możesz założyć, że N wynosi nie więcej niż 100, a wynikowa sekwencja nie będzie zawierać
x >= 2^31
. - Jeśli A jest większy niż B , to B jest numerem 0 w sekwencji.
- Dane wyjściowe muszą być oddzielone spacjami, przecinkami i / lub znakami nowej linii.
- Końcowe spacje lub znaki nowej linii są dozwolone, ale nie przecinki końcowe.
Przypadki testowe
Przykład 1:
8 13 10
Pracujemy wstecz, 8 13
dopóki nie znajdziemy liczby większej niż poprzednia, otrzymujemy 13 8 5 3 2 1 1 0 1
. Zatem 0
jest numerem 0 w tej sekwencji. Pracując dalej, drukujemy 0
i kolejnych 9 członków:
0 1 1 2 3 5 8 13 21 34
Przykład 2:
23 37 5
Znów pracujemy wstecz, aby znaleźć cyfrę 0 37 23 14 9 5 4 1 3
. Tym razem jest to numer 0 1
, więc drukujemy go wraz z następnymi 4 członkami:
1 4 5 9 14
Przykład 3:
4 3 8
Dzięki temu nie musimy pracować wstecz, aby znaleźć cyfrę 0, ponieważ 3
jest mniejsza niż 4
:
3 7 10 17 27 44 71 115
Przykład 4:
29 47 11
Wynik:
1 3 4 7 11 18 29 47 76 123 199
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy prawidłowy kod w bajtach. Tiebreaker przechodzi do wcześniej opublikowanego zgłoszenia. Zwycięzca zostanie wybrany w następny poniedziałek, 28 września. Powodzenia!
Edycja: Gratulacje dla twojego zwycięzcy, @Jakube, używając Pytha dla niesamowitych 23 bajtów!
[8, 13, 10]
)?Odpowiedzi:
Pyth, 23 bajty
Wypróbuj online: pakiet demonstracyjny lub testowy
Całkiem nietypowy styl programowania w języku Pyth. Czasami programowanie funkcjonalne ma swoje wady.
Wyjaśnienie:
źródło
Siatkówka ,
6554 bajtówTutaj
<empty>
reprezentuje pustą linię końcową. Uruchom kod jako pojedynczy plik z-s
flagą.Format wejściowy to
gdzie liczby są reprezentowane w jedności . Dane wyjściowe to lista oddzielona przecinkami, również w postaci pojedynczej. Na przykład:
byłoby
i wydajność
Wyjaśnienie
Najpierw redukujemy
A
iB
do 0 i 1-szego elementu.+
Mówi siatkówki do powtarzać tego podstawienia regex dopóki nie przestanie regex dopasowanie lub substytucja nie zmienia się łańcuch. Wyrażenie regularne przechwytujeA
do grupy 1 za pomocą(1*)
, a następnie upewnia się, żeB
jest co najmniej tak duże, jakA
podczas przechwytywania zaB-A
pomocą\1(1*)
do grupy 2. Zapewnia to, że ta pętla zakończy się razA>B
.Podstawienie po prostu odwraca
A,B
sięB-A,A
poprzez ustawienie zbliżone do$2,$1
.Teraz mamy już pierwszą liczbę wymaganego wyjścia w ciągu (jak również poprzednią, którą będziemy musieli pozbyć się później). Ta zamiana dodaje teraz inną liczbę jako sumę dwóch ostatnich liczb podczas pobierania
1
zN
. Ponieważ mamy już jeden numer, chcemy, aby tak się stałoN-1
. Robimy to, upewniając się\B
, że nadal jest co najmniej;11
na końcu łańcucha. Jeśli nazywamy dwie ostatnie wartości sekwencjiC
iD
, a następnie przechwytuje regexC
w grupie 1 oraz,D
w grupie drugiej. Odpisujemy je za pomocą$1$2
. Następnie piszemy,$2$1
co tłumaczy,D+C
. Pamiętaj, że nie odpisujemy singla, do1
którego pasowaliśmyN
, zmniejszając go.Na koniec musimy pozbyć się -1-szego elementu sekwencji, a także resztek
;1
zN
, co robimy po prostu dopasowując jeden z nich i zastępując go pustym ciągiem.źródło
Python 2,
9387676160 bajtówPobiera dane wejściowe (jako dosłowną listę python
[8,10,13]
)Wypracowuje 0 kadencję
Następnie drukuje sekwencję dodawania, aż do osiągnięcia długości
źródło
for _ in[1]*l:
jest to nieco krótszeexec"stuff;"*l
for _ in[1]*l:stuff
zexec"stuff;"*l
. @xnor nie umieścił części rzeczy w pętli for. Lubfor _ in[1]*l:
doexec";"*l
j>=i
zj/i
. Właśnie to odkryłem! (Ponieważ możesz założyć, że A, B i N są zawsze dodatnimi liczbami całkowitymi )CJam,
2623 bajtówDzięki Dennis za oszczędność 3 bajtów.
Pobiera dane wejściowe w kolejności
N B A
(oddzielone dowolną białą spacją). Wyświetla wynik jako listę oddzieloną znakiem nowej linii i kończy się z błędem .Sprawdź to tutaj.
Wyjaśnienie
To idzie o krok dalej, gdy znajduje się 0 element. Oznacza to, że kończy się, gdy jedna z wartości jest ujemna.
źródło
q~{_@\-_g)}g\@{_@+_p}*t
(N B A
) zapisuje trzy bajty.B>A
to sprawdzić,B not smaller than A
czy coś, ale nie mogę wymyślić, jak to zrobić w CJam. EDYCJA: Rozwiązanie Dennisa drukuje prawidłowe dane wyjściowe.<!
zamiast>
.!
. Po prostu dodałem jeden, aby działał;)Labirynt ,
5854494644 bajtówPodziękowania dla Sp3000 za sugerowanie zastosowania bitowej negacji, co pozwoliło zaoszczędzić dwa bajty.
Format wejściowy to
B A N
. Dane wyjściowe to lista rozdzielona znakiem nowej linii.Wyjaśnienie
(Nieco przestarzałe. Podstawowa idea jest nadal taka sama, ale układ kodu jest teraz inny).
Wykorzystuje to ten sam pomysł, co moja odpowiedź na CJam (więc kredyty wciąż trafiają do Dennisa): podczas cofania sekwencji nie zatrzymujemy się, dopóki nie otrzymamy wartości ujemnej (która pozostawia nam -1-ty i -2-ty element sekwencji). Następnie zaczynamy je dodawać przed wydrukowaniem pierwszej wartości.
Wykorzystuje kilka fajnych sztuczek golfowych z Labiryntu. Przejrzyjmy kod w sekcjach:
Adres IP zaczyna się od
?
prawej strony (która czytaA
). Na"
(no-op) trafia w ślepy zaułek, więc odwraca się, wykonując?
ponownie (czytanieB
). Na koniec}
przechodziB
do stosu pomocniczego. Ślepy zaułek oszczędza bajt naiwnemuTeraz pętla, która znajduje początek sekwencji:
Opcja
)(
(inkrement-dekrementacja) nie działa, ale należy upewnić się, że górna część stosu jest dodatnia na skrzyżowaniu (tak, że IP skręca na wschód).:
duplikatyA
,{
przemieszcza sięB
z powrotem do głównego stosu,-
obliczaA-B
. To, czego naprawdę chcemyB-A
, to`
neguje wartość.Jest to teraz skrzyżowanie czterokierunkowe. Aby uzyskać negatywne wyniki, adres IP skręca w lewo w kierunku
?
, czytającN
i przechodząc do następnej części programu. Jeśli wynik wynosi zero, IP przesuwa się na południe, skręca w rogu i pozostaje w pętli. Jeśli wynik jest pozytywny, IP skręca w prawo (na zachód), skręca w rogu i wykonuje kolejny skręt w prawo (ponownie na zachód), więc również pozostaje w pętli. Myślę, że może to stać się powszechnym wzorcem w celu odróżnienia wartości ujemnych od nieujemnych (lub dodatnich od nie dodatnich):Przynajmniej nie udało mi się znaleźć bardziej kompaktowego / przydatnego układu dla tej skrzynki.
W każdym razie, choć
A
nie jest ujemna, pętla trwa,}
przechodziA
do stosu pomocniczego i=
zamieniaA
iB
.Raz
A
jest ujemny,?
czytaN
i przechodzimy do drugiej pętli:Wiemy, że
N
jest to pozytywne, więc możemy polegać na IP skręcającym w lewo (na północ). Korpus pętli jest teraz po prostu:Słownie: porusza się zarówno
N
iA
na stos pomocniczy. DuplikujB
, zamień kopię za pomocąA
i dodajA
do drugiej kopiiB
. Powtórz go ponownie, aby wydrukować bieżącą wartośćB
. Wydrukuj nowy wiersz. PrzesuńB
iN
powrót do głównego stosu i ubytkuN
.Chociaż
N
jest dodatni, adres IP skręca w prawo (na północ), kontynuując pętlę. GdyN
osiągnie zero, kod kończy się w dość fantazyjny sposób:IP porusza się prosto (na zachód). W
?
próbuje odczytać inną liczbę całkowitą, ale już osiągnął EOF, więc faktycznie popycha0
zamiast.`
próbuje to zanegować, ale to wciąż zero. Tak więc adres IP nadal przesuwa się na zachód, skręca w rogu, a następnie przesuwa się w dół w kierunku tego,@
który kończy program.Zastanawiam się, czy mogę umieść
@
w jeszcze niższej pozycji (obecnie kosztuje 3 białe znaki) obracając trzy"
wokół osób`
w związku no-ops (jak)(
), ale nie byłem w stanie zrobić jeszcze tej pracy.źródło
C,
105102100 bajtówDzięki @ C0deH4cker za grę w golfa przy 2 bajtach!
Wypróbuj online na Ideone .
źródło
Matlab / Octave, 115
125bajtówFunkcja powinna zostać wywołana jako
f([8 13],10)
.Przykład (Matlab):
Lub wypróbuj online (Octave) .
źródło
f([a b],n)
powinno być dozwolone.x=f(x,n)
w funkcji liczy się nagłówek ...Haskell,
67 6556 bajtówDzięki @nimi za sugestie
Definiuje to potrójną funkcję infix
%
, która jest wywoływana w formacie(n%a)b
, na przykład:Wyjaśnienie
Binarna funkcja infiks
#
zdefiniowanym w pierwszym wierszu, odbywa się w dwóch liczba
ib
i zwraca nieskończonej Fibonacciego jak sekwencja gdziea
ib
występuje w kolejnych elementów.Funkcja
%
po prostu bierze pierwszen
elementya#b
.źródło
let f=a:scanl(+)(a+b)f in f
(-> full#
:a#b|a>b=let f=a:scanl(+)(a+b)f in f|1>0=(b-a)#a
i zapisać dwa bajty.> <>,
3331 + 1 dla -v = 32 bajtówDane wejściowe muszą być wypychane na stos za pomocą -v, ponieważ parsowanie liczb dziesiętnych nie jest trywialne w> <>.
Objaśnienie:
Przedstawię stos po każdej (grupie) operacji. Zaczyna się od [F (n), F (n + 1), N]
Pierwsze wiersze przechodzą w dół serii do 0 kadencji:
Druga linia przechodzi w górę serii, dopóki nie wydrukuje N terminów:
źródło
00.
w pierwszym wierszu na&
. Teoretycznie!
powinien działać, ale myślę, że> <> wypełnia szerokość linii, aby dopasować ją do szerokości najdłuższej (edytuj: właśnie dlatego, jak sądzę, miałeś00.
na pierwszym miejscu).!
lub?
(na końcu linii), jeśli znajduje się na najdłuższej linii. Możesz spróbować z czymś takim1n!
, a wystąpi błąd, ale jeśli pod nim jest linia z czymś dłuższym, na przykładlorumipsum
nie.Java,
1137876 bajtówPodziękowania dla ETHproduction za dostarczenie algorytmu, którego używam w tej odpowiedzi.
Spróbuj tutaj .
Wyjaśnienie:
Oryginalne podejście,
11393 bajtyWygląda bardziej golfowo;)
Wypróbuj tutaj .
Wyjaśnienie:
źródło
b=b-a
dob-=a
i to samo za=b+a
. Zaoszczędzi 2 bajtyJavaScript (ES6),
837363 bajtyTo mogło być gra w golfa na maksa. Zobaczymy.
Nie golfowany:
źródło
Mathematica 112
W końcu to golf
źródło
CJam, 40 bajtów
Dziecięce kroki. To mój pierwszy program CJam, więc jestem dumny, że w ogóle działa.
Pobiera dane wejściowe w takiej samej formie jak w przykładach.
Widziałem teraz, że mogę zredukować go do 33 bajtów za pomocą
{ ... }*
konstruktu.Mógłbym nawet zmniejszyć go o jeszcze jeden, używając operatora potrójnego do czyszczenia stosu i generowania błędu.
źródło
Rubin, 141 bajtów
Wykonanie
Funkcja f generuje pożądany wynik, nazwy argumentów pasują do nazw zmiennych z pytania
Nic sprytnego:
źródło
Mathematica, 59 bajtów
źródło
Ruby,
817573Skrócono o 6 bajtów przy zamianie pętli for na range.map
Zaoszczędzono kolejne 2 bajty, przenosząc instrukcję print
źródło
Pyke, 24 bajty (niekonkurujące)
Wypróbuj tutaj!
źródło
Galaretka , 14 bajtów
Wypróbuj online!
źródło
Common Lisp, 91 bajtów
Wypróbuj online!
źródło