Haskell ma tę zgrabną (wyglądającą) funkcję, w której możesz nadać jej trzy liczby i może wywnioskować z nich sekwencję arytmetyczną. Na przykład [1, 3..27]
jest równoważne z [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]
.
To fajne, a wszystkie sekwencje arytmetyczne są dość ograniczone. Dodawanie, pfft . Mnożenie jest tam, gdzie jest. Czy nie byłoby fajniej, gdyby sekwencje geometryczne przypominały [1, 3..27]
powrót [1, 3, 9, 27]
?
Wyzwanie
Napisz program / funkcję, która przyjmuje trzy dodatnie liczby całkowite a , b i c, i wyprowadza, gdzie x jest największą liczbą całkowitą ≤ c, którą można przedstawić jako gdzie n jest liczbą całkowitą dodatnią.[a, b, b × (b ÷ a), b × (b ÷ a)2, ..., x]
b × (b ÷ a)n
Oznacza to, że wynik powinien mieć wartość r , tak aby:
r0 = a
r1 = b
rn = b × (b ÷ a)n-1
rlast = greatest integer ≤ c that can be represented as b × (b ÷ a)n
where n is a positive integer
Dane techniczne
- Zasady Standard I / O zastosowania .
- Standardowe luki są zabronione .
- b zawsze będzie podzielne przez a .
- a < b ≤ c
- Wyzwanie to nie polega na znalezieniu najkrótszego podejścia we wszystkich językach, chodzi raczej o znalezienie najkrótszego podejścia w każdym języku .
- Twój kod będzie oceniany w bajtach , zwykle w kodowaniu UTF-8, chyba że określono inaczej.
- Wbudowane funkcje (Mathematica może mieć jeden: P), które obliczają tę sekwencję są dozwolone, ale zalecane jest uwzględnienie rozwiązania, które nie opiera się na wbudowanej.
- Zachęca się do wyjaśnień, nawet w przypadku „praktycznych” języków .
Przypadki testowe
a b c r
1 2 11 [1, 2, 4, 8]
2 6 100 [2, 6, 18, 54]
3 12 57 [3, 12, 48]
4 20 253 [4, 20, 100]
5 25 625 [5, 25, 125, 625]
6 42 42 [6, 42]
W kilku lepszych formatach:
1 2 11
2 6 100
3 12 57
4 20 253
5 25 625
6 42 42
1, 2, 11
2, 6, 100
3, 12, 57
4, 20, 253
5, 25, 625
6, 42, 42
Odpowiedzi:
Łuska , 8 bajtów
Dane wejściowe są w kolejności b, c, a . Wypróbuj online!
Wyjaśnienie
Przepływ sterowania w tym programie jest nieco trudny do naśladowania. Po pierwsze, b jest podawane na prawo
/
, tworząc funkcję,/b
która dzieli przez b . Następnie~
dzieli pozostałą programu na trzy części:~(↑)(≤)(Ṡ¡o//b)
. This pasze c do≤
i się i łączy wyniki z . Wynikiem jest funkcja, która sprawdza, czy jej argument ma co najwyżej c , i przyjmuje najdłuższy prefiks elementów, dla których to się utrzymuje.Ṡ¡o//b
↑
≤c
↑≤c
Pozostaje pokazać, jak
(Ṡ¡o//b)a
ewaluuje do pożądanej listy nieskończonej. Część w nawiasach jest podzielona naṠ(¡)(o//b)
. NastępnieṠ
zasila się , podaje wynik , a następnie daje do drugiego argumentu. Wyrażenie podaje funkcję, która przyjmuje liczbę i dzieli ją przez a / b , i iteruje tę funkcję na drugim argumencie, którym jest a .o//b
¡
(o//b)a
¡
Oto seria transformacji, które wizualizują wyjaśnienie:
Alternatywne rozwiązanie wykorzystujące zmienne jawne w kolejności a, b, c :
źródło
Python 2 , 42 bajty
Wypróbuj online!
Podejście rekurencyjne,
4241 bajtów-1 bajt dzięki ovs
Wypróbuj online!
źródło
Proton , 35 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
4137 bajtówZaoszczędź 4 bajty dzięki @Neil
Pobiera dane wejściowe jako
(b,c)(a)
.Przypadki testowe
Pokaż fragment kodu
Skomentował
źródło
(b,c)=>g=a=>a>c?[]:[a,...g(b,b*=b/a)]
.Pari / GP , 38 bajtów
Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 22 bajty
Wypróbuj online!
źródło
Python 3,
93907473 bajtyWypróbuj online
Podziękowania dla Rod i user202729 za pomoc w zmniejszeniu całkiem sporo bajtów!
źródło
def + return -> lambda
. Wskazówki dotyczące Pythona.import*
.while i<=c:i++
(zamiast listowania + dziennika), aby zaoszczędzić dużo bajtówOktawa ,
3835 bajtówWypróbuj online!
Okazuje się, że podejście MATL @ LuisMendo pozwala również zaoszczędzić 3 bajty w Octave, pomimo
log
trzykrotnego powtórzenia .źródło
Perl 6 ,
2624 bajtówWypróbuj online!
Operator sekwencji w Perlu 6
...
może natywnie wnioskować o szeregach geometrycznych.Aktualizacja: ... Może , ale w tej sytuacji nie wnioskowanie jest nieco krótsze.
źródło
05AB1E , 12 bajtów
Wprowadź w kolejności
c,b,a
Wypróbuj online!
Wyjaśnienie
źródło
MATL , 17 bajtów
Wypróbuj online!
Tylko po to, żeby piłka toczyła się w MATL. Nie mogę sobie wyobrazić, że nie ma mniej pełnego sposobu rozwiązania tego problemu.
źródło
Haskell, 35 bajtów
Wypróbuj online!
źródło
exp<$>[...]
)MATL , 12 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
a
ic
(mam wiele nieudanych prób, zaczynając ody/i
), ale stosując tę metodę, starannie utrzymujesz wszystko razem.Perl, 38 bajtów
Dołącz
+3
do-n
(use 5.10.0
aby odblokować funkcje Perla 5.10 jest bezpłatne)Następnie uruchom jako:
źródło
Czerwony , 50 bajtów
Wypróbuj online!
źródło
Japt , 14 bajtów
Spróbuj
Wyjaśnienie
źródło
Czysty , 63 bajty
Wypróbuj online!
źródło
TI-BASIC, 31 bajtów
Pobiera dane wejściowe od użytkownika i dane wyjściowe w
Ans
. Rozwiązałem dla nw c = b n / a n-1 , otrzymując n = 1 + ln (c / b) / ln (b / a). To to samo co n = 1 + log b / a (c / b). Na potrzeby gry w golfa rozpoczynam sekwencję od -1, a kończę od n-1 zamiast od 0 do n.źródło
APL (Dyalog Unicode) , 38 bajtów
Wypróbuj online!
Prefiks Dfn. Pobiera dane wejściowe w kolejności
a b c
i używa⎕IO←0
( I ndex O rigin)Dzięki @ErikTheOutgolfer za golenie 6 bajtów z tego, zanim jeszcze opublikowałem.
W jaki sposób?
źródło
Stax , 14 bajtów CP437
16 bajtów po rozpakowaniu,
Uruchom i debuguj online!
Pobiera dane wejściowe w postaci
[b, a, c]
.Jestem pewien, że @recursive ma lepsze rozwiązania.
Wyjaśnienie
źródło
SILOS , 73 bajty
Wypróbuj online!
Czytamy trzy liczby. Obliczyć wspólny współczynnik przez drugą liczbę / pierwszą. Następnie przeglądamy serię, aż osiągniemy wartość wyższą niż górna granica.
źródło
C (gcc), 82 bajty
Wypróbuj online!
Oblicza i drukuje
r_n = b^n/a^(n-1)
dor_n > c
.Musi zostać skompilowany
-lm
!źródło
n;f(a,b,c){for(float r=n=0;r=pow(b/a,n++)*a,r<=c&&printf("%f ",r););}
APL (Dyalog) , 23 bajty ( SBCS )
To bierze argumenty ab po lewej i c po prawej,
Wypróbuj online!
Prawdopodobnie jest krótsza droga, ale tak myślałem
÷\
to urocze.Wyjaśniono:
{...}
Anonimowa funkcja ⍺ jesta b
,⍵
jestc
. Powiedzmya b c = 2 6 100
⌽⍺
Rewers⍺
:6 2
⍵⍴
Powtórz⍵
czasy:6 2 6 2 6 2 6 2 ...
÷\
Zmniejsz przez podział na prefiksy:6 (6÷2) (6÷(2÷6)) (6÷(2÷(6÷2))).. = 6 3 18 9 54 ..
⍺,
Przygotuj⍺
:2 6 6 3 18 9 54 27 162 81 ...
⊣/⍵2⍴
Uzyskaj co drugi element (plus kilka powtórzeń końcowych):⍵2⍴
Zrób⍵
wiersz,2
macierz kolumny z2 6 6 3 18 9 54 ...
⊣/
Zdobądź pierwszą kolumnę⊆⊢
Podziel tablicę na bloki gdzie⍵∘≥
⍵
jest większy lub równy wszystkim elementom⊃
Weź pierwszy taki blokźródło