fajna, bez tytułu sekwencja

19

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 lukizabronione .
  • 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..]

Wypróbuj online!

To wyzwanie zostało piaskownicy.

całkowicie ludzki
źródło
Czy uważasz, że moja edycja poprawia formatowanie, czy jest to tylko moja przeglądarka?
user202729,
@ user202729 Heh ... wygląda to źle w mojej przeglądarce, ale wątpię, by moje formatowanie wyglądało dobrze w większości przeglądarek ... Po prostu zachowam to w ten sposób, nie straci żadnego znaczenia. Po prostu wygląda dziwnie. : P
totalnie ludzki,
Czy musimy obsłużyć sprawę f_n(0) = 0dla kindeksowania 0?
Cinaski
9
Fajna, bez tytułu sekwencja ” Lol, nie jestem jedynym, który ma trudności z wymyślaniem nazw sekwencji, które wymyśliłem, widzę ..;)
Kevin Cruijssen
3
@Fabian Nie, sumujesz tylko pierwsze kterminy z listy powtarzających się liczb naturalnych, a nie pierwsze n*k.
Martin Ender

Odpowiedzi:

12

Rubin , 32 28 23 bajtów

->n,k{k.step(0,-n).sum}

Wypró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ępnie k-n, k-2ni tak dalej.

GB
źródło
8

Python 2 , 34 28 bajtów

lambda n,k:(k+k%n)*(k/n+1)/2

Wypróbuj online!

Dzięki Martin Ender, Neil i Mr Xcoder za pomoc.

GB
źródło
1
k/nZresztą i tak nie potrzebujesz - k-(k/n)*njest po prostu k%n. Zobacz moją odpowiedź partii.
Neil
28 bajtów
Mr. Xcoder,
Dzięki. Nie sądziłem, że to może być takie proste.
GB
8

Łuska , 4 bajty

Σ↑ṘN

Wypróbuj online!

Wyjaśnienie

To właśnie kończy się bezpośrednim tłumaczeniem implementacji referencyjnej w wyzwaniu:

   N  Start from the infinite sequence of all natural numbers.
  Ṙ   Replicate each element n times.
 ↑    Take the first k values.
Σ     Sum them.
Martin Ender
źródło
5

APL (Dyalog) , 12 10 8 bajtów

+/∘⌈÷⍨∘⍳

Wypróbuj online!

npo lewej stronie k(0 indeksowanych) po prawej stronie.

Uriel
źródło
5

Mathematica, 40 bajtów

Tr@Sort[Join@@Range@#2~Table~#][[;;#2]]&

Wypróbuj online!

Tr[Range@(s=⌊#2/#⌋)]#+#2~Mod~#(s+1)&

Wypróbuj online!

Mathematica, 18 bajtów

autor: Martin Ender

Tr@Range[#2,0,-#]&

Wypróbuj online!

n~Sum~{n,#2,0,-#}&

Wypróbuj online!

J42161217
źródło
2
Tr@Range[#2,0,-#]&lub n~Sum~{n,#2,0,-#}&korzystając ze sztuczki z odpowiedzi Ruby GB.
Martin Ender
5

MATL , 12 11 bajtów

:iY"Ys0h1G)

Wypróbuj online!

kjest indeksowany na 0. Pobiera dane wejściowe w odwrotnej kolejności.

Zapisano 1 bajt dzięki @Giuseppe

Cinaski
źródło
5

Galaretka , 5 bajtów

Rxḣ³S

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ą knastępnien .

Wyjaśnienie

Rxḣ³S
R           Range: [1,2,...,k]
 x          Times: repeat each element n times: [1,1,1,2,2,2,...,n,n,n]
  ḣ³        Head: take the first k elements. ³ returns the first argument.
    S       Sum

Wypróbuj online!

dylnan
źródło
4

Galaretka , 4 bajty

1-indeksowany

Ḷ:‘S

Wypróbuj online! lub zobacz zestaw testowy .

Pan Xcoder
źródło
Możesz zrobić indeksowanie 0, więc myślę, że Ḷ:Srównież działa
dylnan
@dylnan Właściwie nie sądzę, że to właśnie oznacza tutaj indeksowanie 0.
Wycofałem się
@dylnan Dzielenie przez zero jest błędem.
Erik the Outgolfer
4

JavaScript (ES6),  24  21 bajtów

Pobiera dane wejściowe w składni curry (n)(k). Zwraca falsezamiast0 .

n=>g=k=>k>0&&k+g(k-n)

Przypadki testowe

W jaki sposób?

n =>             // main unamed function taking n
  g = k =>       // g = recursive function taking k
    k > 0 &&     // if k is strictly positive:
      k +        //   add k to the final result
      g(k - n)   //   subtract n from k and do a recursive call

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 :

staircase

Arnauld
źródło
3

Partia, 34 bajty

@cmd/cset/a(%2+%2%%%1)*(%2/%1+1)/2

Znalazłem formułę zamkniętą. Pierwszy argument nma indeks 1, drugi argument kma indeks 0.

Neil
źródło
3

Haskell , 28 bajtów

n#k|m<-k`mod`n=sum[m,m+n..k]

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ść.

całkowicie ludzki
źródło
3

R , 37 33 31 bajtów

-6 bajtów dzięki Giuseppe

function(n,k)sum(rep(1:k,,k,n))

Wypróbuj online!

Nic fajnego. Te [0:k]uchwyty przypadku, gdy k = 0.

Nie dotyczy
źródło
1
Tutaj możesz pozbyć się aparatów ortodontycznych. Jeśli użyjesz argumentów w kolejności 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
Giuseppe
1
Nadal możesz pozbyć się aparatów ortodontycznych! {}
Giuseppe,
podstawienie [0: k] mnie dopadło i zapomniałem o
aparatach
2

C ++, 53 bajty

Po prostu użyj formuły. nma indeks 1 i indeks k0.

[](int n,int k){return k/n*(k/n+1)/2*n+k%n*(k/n+1);};

Wypróbuj online!

Colera Su
źródło
Zaoszczędź kilka bajtów, nadużywając ~operatora. [](int n,int k){return-k/n*~(k/n)/2*n-k%n*~(k/n);};
ceilingcat
2

J , 13 bajtów

1#.]{.(#1+i.)

Jak to działa:

Lewy argument to n, prawy to k.

i. generuje listę 0..k-1

1+ 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 nich

1#. znajdź ich sumę według przelicznika podstawowego.

Wypróbuj online!

Galen Iwanow
źródło
Lubię hak.
cole
2

Retina , 29 26 bajtów

\d+
$*
(?=.*?(1+)$)\1
$'
1

Wypróbuj online! Link zawiera przypadki testowe i nagłówek, aby sformatować je zgodnie z preferowanym wejściem ( knajpierw 0-indeksowane , 1-indeksowane ndrugie). Zainspirowała mnie odpowiedź Ruby @ GB. Wyjaśnienie:

\d+
$*

Konwertuj na unary.

(?=.*?(1+)$)\1
$'

Dopasuj każdy ciąg znaków nwewnątrz ki zamień dopasowanie na wszystko po meczu. To k-n, k-2n, k-3n, ale nrównież po meczu, więc masz k, k-n,k-2n itd. To również mecze n, które jest po prostu usunięte (nie jest to już potrzebne).

1

Zsumuj wyniki i przelicz z powrotem na dziesiętne.

Neil
źródło
2

Pyth , 5 bajtów

s%_ES

Wypróbuj tutaj!

Odpowiedź Ruby na port GB. Port mojej galaretki miałby 6 bajtów:+s/Rvz

Pan Xcoder
źródło
2

Perl 6 , 39 bajtów

->\n,\k{(0,{|($_+1 xx n)}...*)[^k].sum}

Sprawdź to

n i k są oparte na 1

Rozszerzony:

-> \n, \k { # pointy block lambda with two parameters 「n」 and 「k」

  ( # generate the sequence

    0,         # seed the sequence (this is why 「k」 is 1-based)

    {          # bare block lambda with implicit parameter 「$_」
      |(       # slip this into outer sequence
        $_ + 1 # the next number
        xx n   # repeated 「n」 times (this is why 「n」 is 1-based)
      )
    }

    ...        # keep doing that until

    *          # never stop

  )[ ^k ]      # get the first 「k」 values from the sequence
  .sum         # sum them
}
Brad Gilbert b2gills
źródło
1

05AB1E , 9 bajtów

FL`}){I£O

Wypróbuj online!

Wyjaśnienie

F           # n times do
 L`         # pop top of stack (initially k), push 1 ... topOfStack
   }        # end loop
    )       # wrap stack in a list
     {      # sort the list
      I£    # take the first k elements
        O   # sum
Emigna
źródło
1

Clojure, 54 bajty

#(nth(reductions +(for[i(rest(range))j(range %)]i))%2)

Drugi argument kma indeks 0, podobnie jak (f 14 20)28.

NikoNyrh
źródło
1

APL + WIN, 13 bajtów

+/⎕↑(⍳n)/⍳n←⎕

Monity o wprowadzenie ekranu dla n, a następnie dla k. Początek indeksu = 1.

Graham
źródło
1

Brain-Flak , 78 bajtów

(({}<>)<{<>(({})<>){({}[()]<(({}))>)}{}({}[()])}{}<>{}>)({<({}[()])><>{}<>}{})

Wypróbuj online!

Jestem pewien, że można to zrobić lepiej, ale to początek.

Kreator pszenicy
źródło
1

Japt , 7 6 bajtów

Pierwotnie zainspirowany przez rozwiązaniem GB i przekształcił się w port!

Pobiera kjako pierwsze wejście i njako drugie.

õ1Vn)x

Spróbuj


Wyjaśnienie

Domniemane wprowadzanie liczb całkowitych U=ki V=n. Wygeneruj tablicę liczb całkowitych ( õ) od 1do Uz krokiem Vnegated ( n) i zmniejsz ją przez dodanie ( x).

Kudłaty
źródło
1

R , 27 bajtów

Anonimowa funkcja, która przyjmuje kiw ntej kolejności. Tworzy listę długości k(trzeci argument rep), który składa się z 1przez k(pierwszy argument rep), każdy element powtarzalny nrazy (czwarty parametr rep). Następnie pobiera sumę tej listy.

nma indeks 1 i indeks k0. Zwraca błąd dla n<1.

pryr::f(sum(rep(1:k,,k,n)))

Wypróbuj online!

rturnbull
źródło
1

Befunge, 27 bajtów

&::00p&:10p%+00g10g/1+*2/.@

Wypróbuj online

Pobiera k, a następnie n jako dane wejściowe. Wykorzystuje odpowiedź GB jako podstawę matematyczną.

Jo King
źródło