Wprowadzenie
Oczywiście mamy wiele wyzwań sekwencyjnych , więc oto kolejne.
Sekwencja Kimberling ( A007063 ) wygląda następująco:
1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...
Powstaje to przez tasowanie normalnej iteracji:
[1] 2 3 4 5 6 7 8
Pierwszy termin sekwencji to 1
. Następnie przetasujemy sekwencję, aż zostaną użyte wszystkie terminy po lewej stronie. Tasowanie ma wzór right - left - right - left - ...
. Ponieważ po lewej stronie nie ma żadnych terminów 1
, nie ma tasowania. Otrzymujemy następujące:
2 [3] 4 5 6 7 8 9
Na í th iteracji możemy odrzucić í th element i umieścić, że w naszym sekwencji. Jest to druga iteracja, więc odrzucamy drugi element. Sekwencja postać: 1, 3
. W naszej następnej iteracji pomieszamy bieżącą iterację z powyższym wzorem. Bierzemy pierwszy nieużywany przedmiot po prawej stronie i- tego przedmiotu. Tak się dzieje 4
. Dołączymy to do naszej nowej iteracji:
4
Teraz weźmiemy pierwszy nieużywany przedmiot po lewej stronie i- tego przedmiotu. Jest 2
. Dołączymy to do naszej nowej iteracji:
4 2
Ponieważ po lewej stronie i- tego elementu nie pozostały żadne elementy , dodamy resztę sekwencji do nowej iteracji:
4 2 [5] 6 7 8 9 10 11 ...
To jest nasza trzecia iteracja, więc odrzucimy trzeci przedmiot, którym jest 5
. To jest trzeci element w naszej sekwencji:
1, 3, 5
Aby uzyskać następną iterację, po prostu powtórz proces. Zrobiłem gif, jeśli nie jest jasne:
Gif zajął mi więcej czasu niż napisanie prawdziwego posta
Zadanie
- Biorąc pod uwagę nieujemną liczbę całkowitą n , wypisz pierwsze n składników sekwencji
- Możesz podać funkcję lub program
- To jest golf golfowy , więc wygrywanie z najmniejszą ilością bajtów wygrywa!
Przypadki testowe:
Input: 4
Output: 1, 3, 5, 4
Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8
Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28
Uwaga: Przecinki na wyjściu nie są konieczne. Możesz na przykład użyć znaku nowej linii lub wydrukować listę itp.
Odpowiedzi:
Pyth, 22 bajty
Wypróbuj online: Demonstracja
Po prostu wykonuje technikę tasowania opisaną w OP.
Wyjaśnienie:
źródło
Julia,
7871 bajtówJest to funkcja bez nazwy, która akceptuje liczbę całkowitą i zwraca tablicę liczb całkowitych. Aby go wywołać, przypisz go do zmiennej.
Podejście tutaj jest takie samo, jak opisane w OEIS.
Nie golfowany:
Zaoszczędź 7 bajtów dzięki Maurisowi!
źródło
Matematyka 130 bajtów
Zaczynamy od listy składającej się z zakresu od
1
do3x
, gdziex
jest pożądana liczba terminów sekwencji Kimberling.Na każdym kroku
n
,TakeDrop
przerywa bieżącą listę do przodu listy2n+1
terminów (gdzie praca jest wykonywana) i tylnej (listy, które zostaną później połączone z przerobione listy przodu). Pierwsza lista jest dopasowana do następującego wzoru,{t___,z,r___}
gdzie z to termin Kimberling na środku pierwszej listy.r
jestRiffle
oznaczony na odwrocie,t
a następnie dołączana jest tylna lista.z
jest usuwany i dołączany do (AppendTo
) rosnącej sekwencji Kimberling.n
jest zwiększany o,1
a bieżąca lista jest przetwarzana przez tę samą funkcję przezNest.
Przykład
źródło
Python 2, 76 bajtów
Wyjaśnienie
To jest wzór OEIS po wielu transformacjach golf-y! Udało się pięknie . Oryginalny kod był
Najpierw się go pozbyłem
i
, zastępując goa+1
wszędzie i rozszerzając wyrażenia:Następnie przepisano
b<2*a-1
jako,-~b<2*a
aby zapisać bajt białych znaków i przeniesiono+1
do zaznaczenia, podziału przez 2 i negacji:Więc
-b-1
jest po prostu~b
, żebyśmy mogli pisać(b,~b)[b%2]
. Jest to równoważne zb^0 if b%2 else b^-1
użyciem operatora XOR lub alternatywnieb^b%-2
.źródło
Pyth,
2925 bajtówJakube zapisał 4 bajty, ale nie mam już pojęcia, jak odczytać kod.
Oto stare rozwiązanie:
Tłumaczenie mojej odpowiedzi w języku Python. Nie jestem zbyt dobry w Pyth, więc może nadal istnieją sposoby na skrócenie tego.
źródło
.W
do golfa off 4 bajtów:VQ+.W<hHyN-~tN/x%Z_2Z2hNN
..W
ma postać:.W<condition><apply><start-value>
. Użyłem wartości początkowejhN
, tak jak tyKhN
..W
zmienia tę wartość, dopóki<condition>
jest to prawda. Użyłem tego samego warunku co ty<hHyN
. Warunkiem jest funkcja lambda z parametremH
, więc bieżąca wartość (w kodzieK
) toH
. I ja również tego samego<apply>
komunikatu, jak ty, ja tylko otrzymujeK
zZ
, ponieważ<apply>
oświadczenie jest lambda-funkcja z parametremZ
. Możemy zignorować=K
,.W
radzi sobie z tym. Zastępuje starą wartość obliczoną. Na końcu wydruk+...N
APL,
5644 bajtówJest to nienazwany pociąg monadyczny, który przyjmuje liczbę całkowitą po prawej i zwraca tablicę. To w przybliżeniu to samo podejście, co moja odpowiedź Julii .
Najbardziej wewnętrzna funkcja to rekurencyjna funkcja dyadyczna, która zwraca n- ty termin w sekwencji Kimberlinga, podając n jako identyczne argumenty lewy i prawy.
Dzięki temu jesteśmy w stanie uzyskać indywidualne warunki sekwencji. Problemem jest jednak to, że jest to funkcja dyadyczna , co oznacza, że wymaga argumentów po obu stronach. Wpisz
⍨
operatora! Biorąc pod uwagę funkcjęf
oraz wejściex
,f⍨x
jest taki sam jakx f x
. Tak więc w naszym przypadku, odnosząc się do wyżej wspomnianej funkcji jakof
, możemy zbudować następujący ciąg monadyczny:Aplikujemy
f
do każdej liczby całkowitej od 1 do wejścia, uzyskując tablicę.Zaoszczędź 12 bajtów dzięki Dennis!
źródło