Zdefiniujmy f n (k) jako sumę pierwszych k wyrazów liczb naturalnych [1, ∞), gdzie każda liczba jest powtarzana n razy.
k | 0 1 2 3 4 5 6 7 8 9
--------+-------------------------------------------------
f_1(k) | 0 1 3 6 10 15 21 28 36 45
deltas | +1 +2 +3 +4 +5 +6 +7 +8 +9
--------+-------------------------------------------------
f_2(k) | 0 1 2 4 6 9 12 16 20 25
deltas | +1 +1 +2 +2 +3 +3 +4 +4 +5
--------+-------------------------------------------------
f_3(k) | 0 1 2 3 5 7 9 12 15 18
deltas | +1 +1 +1 +2 +2 +2 +3 +3 +3
Przeciw-przekątne tego jako kwadratowy układ są podobne do sekwencji OEIS A134546 .
Wyzwanie
Napisz program / funkcję, która przyjmuje dwie nieujemne liczby całkowite n i k oraz wyjścia f n (k) .
Dane techniczne
- Zasady Standard I / O zastosowania .
- Standardowe luki są zabronione .
- Twoje rozwiązanie może mieć indeks 0 lub indeks 1 dla n i / lub k, ale proszę podać, które.
- 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, które obliczają tę sekwencję są dozwolone, ale zalecane jest rozwiązanie, które nie polega na wbudowanym.
- Zachęca się do wyjaśnień, nawet w przypadku „praktycznych” języków .
Przypadki testowe
W tych przypadkach testowych n ma indeks 1, a k indeks 0.
n k fn(k)
1 2 3
2 11 36
11 14 17
14 21 28
21 24 27
24 31 38
31 0 0
W kilku lepszych formatach:
1 2
2 11
11 14
14 21
21 24
24 31
31 0
1, 2
2, 11
11, 14
14, 21
21, 24
24, 31
31, 0
Realizacja referencyjna
To jest napisane w Haskell .
f n k = sum $ take k $ replicate n =<< [1..]
f_n(0) = 0
dlak
indeksowania 0?k
terminy z listy powtarzających się liczb naturalnych, a nie pierwszen*k
.Odpowiedzi:
Rubin ,
32 2823 bajtówWypróbuj online!
Wyjaśnienie
Wyobraźmy sobie sumę jako pole trójkąta, na przykład n = 3 i k = 10:
Następnie sumują przez kolumnę zamiast rzędu: pierwsza kolumna
k
, a następniek-n
,k-2n
i tak dalej.źródło
Python 2 ,
3428 bajtówWypróbuj online!
Dzięki Martin Ender, Neil i Mr Xcoder za pomoc.
źródło
k/n
Zresztą i tak nie potrzebujesz -k-(k/n)*n
jest po prostuk%n
. Zobacz moją odpowiedź partii.Łuska , 4 bajty
Wypróbuj online!
Wyjaśnienie
To właśnie kończy się bezpośrednim tłumaczeniem implementacji referencyjnej w wyzwaniu:
źródło
APL (Dyalog) ,
12108 bajtówWypróbuj online!
n
po lewej stroniek
(0 indeksowanych) po prawej stronie.źródło
Mathematica, 40 bajtów
Wypróbuj online!
Wypróbuj online!
Mathematica, 18 bajtów
autor: Martin Ender
Wypróbuj online!
Wypróbuj online!
źródło
Tr@Range[#2,0,-#]&
lubn~Sum~{n,#2,0,-#}&
korzystając ze sztuczki z odpowiedzi Ruby GB.MATL ,
1211 bajtówWypróbuj online!
k
jest indeksowany na 0. Pobiera dane wejściowe w odwrotnej kolejności.Zapisano 1 bajt dzięki @Giuseppe
źródło
Galaretka , 5 bajtów
Jeszcze jeden bajt niż rozwiązanie Jelly @ Mr.Xcodera, ale to moje pierwsze zgłoszenie w Jelly i wciąż jestem zdezorientowany, jak milczenie Jelly wybiera operandy, więc nadal jestem zadowolony. Zwróć uwagę na kolejność wejściach są
k
następnien
.Wyjaśnienie
Wypróbuj online!
źródło
Galaretka , 4 bajty
1-indeksowany
Wypróbuj online! lub zobacz zestaw testowy .
źródło
Ḷ:S
również działaJavaScript (ES6),
2421 bajtówPobiera dane wejściowe w składni curry
(n)(k)
. Zwracafalse
zamiast0
.Przypadki testowe
Pokaż fragment kodu
W jaki sposób?
Jest to podobne do odpowiedzi Ruby @ GB .
Wyzwanie opisuje, jak budować „schody” od lewej do prawej, podczas gdy ta funkcja rekurencyjna buduje je od dołu do góry. Przy n = 2 i k = 11 :
źródło
Partia, 34 bajty
Znalazłem formułę zamkniętą. Pierwszy argument
n
ma indeks 1, drugi argumentk
ma indeks 0.źródło
Python 2 , 29 bajtów
Wypróbuj online!
Dzięki totalnie ludzkiemu za -3 bajty!
Python 2 , 30 bajtów
Wypróbuj online!
źródło
Haskell , 28 bajtów
Wypróbuj online!
Podejście to znalazłem po prostu, używając pewnych parametrów zakresu. Zdecydowanie nie najkrótszy, ale całkiem fajnie, że istnieje tak wiele różnych podejść.
źródło
C,
3834 bajtówDefinicja rekurencyjna.
-4 bajty dzięki Steadybox .
Wypróbuj online!
32 bajty autorstwa pana Xcodera , GB
Wypróbuj online!
źródło
f(n,k){return k--?1+f(n,k)+k/n:0;}
Wypróbuj online!R ,
373331 bajtów-6 bajtów dzięki Giuseppe
Wypróbuj online!
Nic fajnego.
Te[0:k]
uchwyty przypadku, gdy k = 0.źródło
rep.default
, możesz się ich pozbyć[0:k]
za pomocą,rep(1:k,,k,n)
ale wtedy twoja odpowiedź jest w zasadzie rturnbull, ale z podstawową R zamiastR + pryr
{}
C ++, 53 bajty
Po prostu użyj formuły.
n
ma indeks 1 i indeksk
0.Wypróbuj online!
źródło
~
operatora.[](int n,int k){return-k/n*~(k/n)/2*n-k%n*~(k/n);};
J , 13 bajtów
Jak to działa:
Lewy argument to n, prawy to k.
i.
generuje listę 0..k-11+
dodaje jeden do każdej liczby na liście, yealding 1,2, ..., k#
tworzy haczyk z powyższym, więc n kopii każdego elementu listy jest kopiowane.]{.
weź pierwszy n z nich1#.
znajdź ich sumę według przelicznika podstawowego.Wypróbuj online!
źródło
Retina ,
2926 bajtówWypróbuj online! Link zawiera przypadki testowe i nagłówek, aby sformatować je zgodnie z preferowanym wejściem (
k
najpierw 0-indeksowane , 1-indeksowanen
drugie). Zainspirowała mnie odpowiedź Ruby @ GB. Wyjaśnienie:Konwertuj na unary.
Dopasuj każdy ciąg znaków
n
wewnątrzk
i zamień dopasowanie na wszystko po meczu. Tok-n
,k-2n
,k-3n
, alen
również po meczu, więc maszk
,k-n
,k-2n
itd. To również meczen
, które jest po prostu usunięte (nie jest to już potrzebne).Zsumuj wyniki i przelicz z powrotem na dziesiętne.
źródło
Pyth , 5 bajtów
Wypróbuj tutaj!
Odpowiedź Ruby na port GB. Port mojej galaretki miałby 6 bajtów:
+s/Rvz
źródło
Perl 6 , 39 bajtów
Sprawdź to
n i k są oparte na 1
Rozszerzony:
źródło
Kotlin , 40 bajtów
Wypróbuj online!
źródło
Java (OpenJDK 8) , 23 bajty
Wypróbuj online!
Port w Python 2 GB odpowiedzi .
źródło
05AB1E , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 , 44 bajty
Wypróbuj online!
źródło
Python 2 , 38 bajtów
Wypróbuj online!
źródło
Clojure, 54 bajty
Drugi argument
k
ma indeks 0, podobnie jak(f 14 20)
28.źródło
APL + WIN, 13 bajtów
Monity o wprowadzenie ekranu dla n, a następnie dla k. Początek indeksu = 1.
źródło
Brain-Flak , 78 bajtów
Wypróbuj online!
Jestem pewien, że można to zrobić lepiej, ale to początek.
źródło
Japt ,
76 bajtówPierwotnie zainspirowany przez rozwiązaniem GB i przekształcił się w port!
Pobiera
k
jako pierwsze wejście in
jako drugie.Spróbuj
Wyjaśnienie
Domniemane wprowadzanie liczb całkowitych
U=k
iV=n
. Wygeneruj tablicę liczb całkowitych (õ
) od1
doU
z krokiemV
negated (n
) i zmniejsz ją przez dodanie (x
).źródło
R , 27 bajtów
Anonimowa funkcja, która przyjmuje
k
iwn
tej kolejności. Tworzy listę długościk
(trzeci argumentrep
), który składa się z1
przezk
(pierwszy argumentrep
), każdy element powtarzalnyn
razy (czwarty parametrrep
). Następnie pobiera sumę tej listy.n
ma indeks 1 i indeksk
0. Zwraca błąd dlan<1
.Wypróbuj online!
źródło
Befunge, 27 bajtów
Wypróbuj online
Pobiera k, a następnie n jako dane wejściowe. Wykorzystuje odpowiedź GB jako podstawę matematyczną.
źródło