Pomnóż lub podziel przez n
Oto proste wyzwanie, więc miejmy nadzieję, że będzie mogło w nim uczestniczyć wiele języków.
Biorąc pod uwagę dodatnią liczbę całkowitą \$n\$, wyjście \$A076039(n)\$z OEIS .
Oznacza to, że zacznij od \$a(1)=1\$. Wtedy dla \$n>1\$:
$$a(n)=\left\{ \begin{array}{ll} n\cdot a(n-1), & \text{if } n>a(n-1) \\ \lfloor a(n-1)/n \rfloor, & \text{otherwise.}\end{array} \\ \right. $$
Przypadki testowe:
1 -> 1
2 -> 2 (2 > 1, so multiply)
3 -> 6 (3 > 2, so multiply)
4 -> 1 (4 < 6, so divide and take the integer part)
5 -> 5
6 -> 30
17 -> 221
99 -> 12
314 -> 26
Więcej przypadków testowych można znaleźć na stronie OEIS.
Zgodnie ze zwykłymi regułami sekwencji możesz wprowadzać i wyprowadzać w ogólnie przyjęty sposób: indeksowanie oparte na 1 lub 0, wyprowadzanie nieskończonej sekwencji, wypisywanie pierwszego \$n\$wartości, wyprowadzaj tylko \$n^\text{th}\$ wartość i tak dalej, ale określ to w swojej odpowiedzi.
To jest code-golf , więc wygrywa najkrótszy kod w bajtach w każdym języku!
Odpowiedzi
Galaretka , 6 bajtów
R×:<?/
Link monadyczny przyjmujący dodatnią liczbę całkowitą, \$n\$, co daje dodatnią liczbę całkowitą, \$a(n)\$.
Wypróbuj online! Lub zobacz zestaw testów .
W jaki sposób?
R×:<?/ - Link:
R - range -> [1..n]
/ - reduce by (i.e. evaluate f(f(...f(f(f(1,2),3),4),...),n) with this f(a,b):
? - if...
< - ...condition: (a) less than (b)?
× - ...then: multiply -> a×b
: - ...else: integer divide -> a//b
Wyprowadź sekwencję do \$a(n)\$ z:
R×:<?\
Scratch 3.0, 29 27 bloków / 234 167 bajtów

Jako składnia SB:
define f(n)
if<(n)=(1)>then
add(1)to[v v
else
f((n)-(1
set[d v]to(item(length of[v v])of[v v
if<(n)>(d)>then
add((n)*(d))to[v v
else
add([floor v] of ((n)/(d)))to[v v]
end
end
when gf clicked
delete all of [v v
ask()and wait
f(answer)
Jestem trochę niepewny co do niektórych metod wejścia / wyjścia, więc pomyślałem, że będę bezpieczny i po prostu zrobię z tego pełny program z funkcją pomocniczą.
Odpowiedź na to pozwoliła mojemu kontu na awans z „nowego” na „standardowe”, więc to zawsze jest fajne.
-67 bajtów dzięki @att
Szekspirowski język programowania , 221 bajtów
,.Ajax,.Puck,.
Act I:.Scene I:.[Enter Ajax and Puck]
Ajax:You cat.
Scene V:.
Puck:You is the sum ofYou a cat.
Ajax:Open heart.Is I nicer you?If notYou is the quotient betweenyou I.
If soYou is the product ofyou I.Let usScene V.
Wyświetla nieskończoną listę. Należy jednak zauważyć, że nie ma separatora między wartościami wyjściowymi, więc dane wyjściowe są nieco trudne do odczytania.
Moja najlepsza próba dodania separatora (bajtu zerowego) sprowadza się do
Szekspirowski język programowania , 297 bajtów
,.Ajax,.Puck,.Page,.
Act I:.Scene I:.
[Enter Ajax and Puck]
Ajax:You cat.
Scene V:.[Exit Puck][Enter Page]
Ajax:Speak thy.
Page:You is the sum ofYou a cat.
Scene X:.[Exit Page][Enter Puck]
Ajax:Open heart.Is I nicer you?If notYou is the quotient betweenyou I.
If soYou is the product ofyou I.Let usScene V.
R , 43 39 bajtów
-4 bajty dzięki Giuseppe.
for(i in 1:scan())T=T%/%i^(2*(i<T)-1);T
Wyświetla \$n\$termin 1-indeksowany.
Inicjalizacja sekwencji za pomocą \$a(0)=1\$działa również, ponieważ formuła daje wtedy \$a(1)=1\$zgodnie z życzeniem. Zmienna T
jest przekształcana na liczbę całkowitą 1
i wielokrotnie stosujemy bardziej zwartą wersję wzoru:
$$a(n)=\left\lfloor \frac{a(n-1)}{n^{2\mathbb{I_{n<a(n-1)}} -1}}\right\rfloor $$
(z \$\mathbb I\$funkcja wskaźnika). Obejmuje to oba przypadki pierwotnej definicji.
APL (Dyalog Unicode) , 18 bajtów (SBCS)
{⍺>⍵:⍺×⍵⋄⌊⍵÷⍺}/⌽ö⍳
Prawie do gry w golfa, ale bezpieczna funkcja, która generuje n-ty element sekwencji.
APL (Dyalog Unicode) , 15 14 bajtów (SBCS)
Zapisano 1 bajt dzięki @ Adám
(⌊⊢×⊣*∘×-)/⌽ö⍳
Wyprowadza n-ty element sekwencji. Właśnie zdałem sobie sprawę, że to nie zadziała, jeśli \$n = a(n-1)\$ponieważ podnosi n do potęgi \$n - a(n-1)\$i mnoży to przez \$a\$, chociaż o ile wiem , funkcja ta działa przynajmniej do n = 2 000 000.
(⌊⊢×⊣*∘×-)/⌽ö⍳
⍳ ⍝ Make a range to n
⌽ö ⍝ Then reverse it and
(⌊⊢×⊣*∘×-)/ ⍝ reduce it with a train:
× ⍝ Multiply
⊢ ⍝ a(n-1) with
⊣ ⍝ n
*∘× ⍝ to the power of the sign of
- ⍝ n - a(n-1)
⌊ ⍝ Floor it
Haskell , 40 bajtów
a#n|n>a=a*n|1>0=a`div`n
a=scanl1(#)[1..]
- Wyprowadza nieskończoną sekwencję.
Operator wrostka # oblicza następny termin, używamy go do zwinięcia wszystkich dodatnich liczb całkowitych [1 ..], ale zamiast tego używamy scanl1, co daje nam wszystkie kroki.
R , 41 bajtów
for(m in 1:scan())T=`if`(m>T,T*m,T%/%m);T
Zmusiłem się, by nie patrzeć na odpowiedź R Robina Rydera, zanim spróbowałem. Na szczęście wymyśliliśmy różne podejścia do siebie, chociaż oba wydają się (na razie) mieć dokładnie taką samą długość w bajtach, niestety dla mnie jego jedno jest teraz o 2 bajty krótsze ...
C (gcc) , 35 bajtów
Pobiera indeks początkowy o wartości 1 i zwraca n-tą wartość sekwencji.
f(i,j){i=i?i>(j=f(i-1))?j*i:j/i:1;}
Forth (gforth) , 82 bajty
: f 2dup 2dup > if * else swap / then dup . swap drop swap 1+ swap recurse ;
1 1 f
Wyprowadza nieskończoną sekwencję oddzieloną spacjami.
Perl 5 -Minteger
-061
, 36 , 27 bajtów
-9 bajtów dzięki @Abigail i @Sisyphus.
wyświetla nieskończoną sekwencję
say$/while$/=$//++$i||$/*$i
Python 3.8+ , 45 39 bajtów
-2 dzięki xnor ( while print(...)!=0:
→ while[print(...)]:
)
-4 dzięki Neilowi ( [a*n,a//n][a>n]
→ a//n or a*n
)
a=n=1
while[print(a:=a//n or a*n)]:n+=1
Pełny program, który drukuje \$a(n)\$ dla wszystkich liczb naturalnych.
Jako funkcja rekurencyjna 49:
f=lambda v,n=1,a=1:a*(v<n)or f(v,n+1,a//n or a*n)
JavaScript (Node.js) , 38 35 bajtów
Zapisano 3 bajty dzięki @Neil
Zwraca \$n\$-ty termin, indeksowany 1.
f=(n,k=i=1n)=>i++<n?f(n,k/i||k*i):k
Współczynnik , 45 bajtów
[ [1,b] 1 [ 2dup < [ * ] [ /i ] if ] reduce ]
Prosta redukcja. Pobiera indeks od 1 i zwraca n-ty człon.
[ ! anonymous lambda
[1,b] 1 [ ... ] reduce ! reduce {1..n} by the following, starting with 1:
2dup < ! ( an n -- an n an<n)
[ * ] [ /i ] if ! ( a_n+1 ) multiply if an < n, int-divide otherwise
]
Łuska , 11 bajtów
Fμ?*`÷<¹³)ḣ
F # Fold a function over
ḣ # sequence from 1..input;
μ?*`÷<¹³) # function with 2 arguments:
? # if
<¹³ # arg 2 is smaller than arg 1
* # arg 1 times arg 2
`÷ # else arg 1 integer divided by arg 2
Perl 5 -Minteger -p
, 35 bajtów
map$.=$_>$.?$.*$_:$./$_,2..$_;$_=$.
Przyjmuje n
jako dane wejściowe i drukuje n
th
element na liście.
05AB1E , 12 10 bajtów
Wyświetla nieskończoną sekwencję.
λN>₁N›i÷ë*
Skomentował :
λ # infinite list generation
# implicitly push a(n-1) (initially 1)
N> # push n, since N is 0-indexed, this needs to be incremented
₁N› # is a(n-1) > n-1?
i÷ # if this is true, integer divide a(n-1) by n
ë* # else multiply a(n-1) and n
K (oK) , 22 20 bajtów
{_x*(1%y;y)y>x}/1+!:
Zamiast używać $[y>x;y;1%y]
, indeksuje listę (1%y;y)
przy użyciu warunku logicznego, y>x
aby zaoszczędzić kilka bajtów.
Forth (gforth) , 51 bajtów
: f 1+ 1 tuck ?do i 2dup <= if * else / then loop ;
Objaśnienie kodu
: f \ start word definition
1+ \ add 1 to n
1 tuck \ set up accumulator and loop parameters
?do \ loop from 1 to n (if n > 1)
i 2dup \ set up top two stack values and duplicate
<= if \ if a(n-1) <= n
* \ multiply
else \ otherwise
/ \ divide
then \ end if
loop \ end loop
; \ end word definition
Java (JDK) , 52 bajty
n->{int i,a=i=1;for(;i++<n;)a=i>a?i*a:a/i;return a;}
Uwaga: dziękujemy @RedwolfPrograms za -1 bajt i @user za -10 (?) Bajtów.
Galaretka , 11 bajtów
1’ß×:>@?$Ị?
Jak to działa
1’ß×:>@?$Ị? - Main link f(n). Takes n on the left
? - If statement:
Ị - If: n ≤ 1
1 - Then: Yield 1
$ - Else:
’ - n-1
ß - f(n-1)
? - If statement:
>@ - If: n > f(n-1)
× - Then: n × f(n-1)
: - Else: n : f(n-1)
Brachylog , 10 bajtów
⟦₁{÷ℕ₁|×}ˡ
Podaje listę singletonów [1]
zamiast 1
for n = 1, ale poza tym nic niezwykłego.
ˡ Reduce
⟦₁ 1 .. n
{ } by:
÷ integer division
ℕ₁ if the result is 1 or greater,
|× multiplication if not.
Gaia , 9 bajtów
┅⟪<₌×/?⟫⊢
Zasadniczo to samo, co krótsza odpowiedź Jelly. Wydruki indeksowane 1 a(n)
, chociaż ⊢
można je zamienić, ⊣
aby n
zamiast tego uzyskać pierwsze elementy.
# implicit input n
┅ # push 1...n
⟪ ⟫⊢ # reduce the list by the following function:
<₌ # push an extra copy of a(i-1) and i and check if less than?
× ? # if true, then multiply
/ # else integer divide
# implicitly print top of stack
Retina , 58 bajtów
K`_ _
"$+"+L$`(^_+|_)(?<=(\1)+) (\1)+
_$`$1 $#3*$#2*
r`_\G
Wypróbuj online! Brak zestawu testów ze względu na sposób, w jaki skrypt wykorzystuje historię. Wyjaśnienie:
K`_ _
Zastąp wejście parą jedynek (jednoargumentowe). Pierwszy to indeks pętli, a drugi to wyjście.
"$+"+
n
Czasy pętli .
L$`(^_+|_)(?<=(\1)+) (\1)+
Podziel dane wyjściowe i indeks pętli przez indeks pętli lub przez 1, jeśli podział będzie wynosił zero.
_$`$1 $#3*$#2*
Zwiększ indeks pętli i pomnóż razem dwa ilorazy. Powoduje to odpowiednio output/index*index/index
lub output/1*index/1
.
r`_\G
Zamień ostateczne dane wyjściowe na dziesiętne.
cQuents , 14 bajtów
=1:$>Z?$Z:Z_/$
Wyjaśnienie
=1 first term is 1
: mode sequence: given n, output nth term; otherwise, output indefinitely
each term equals:
$>Z? : if n > seq(n - 1) else
$Z n * seq(n - 1)
Z_/$ seq(n - 1) // n
Rakieta , 66 bajtów
(λ(n)(foldl(λ(x y)((if(< y x)* quotient)y x))1(range 1(+ 1 n))))
MathGolf , 11 9 bajtów
1k{î`<¿*/
-2 bajty dzięki @ovs .
Wyświetla \$n^{th}\$ wartość.
Wyjaśnienie:
1 # Push 1
k{ # Loop the input amount of times:
î # Push the 1-based loop index
` # Duplicate the top two items
<¿ # If the current value is smaller than the 1-based loop index: a(n-1)<n:
* # Multiply the value by the 1-based loop index
# Else:
/ # Integer-divide instead
# (after the loop, the entire stack joined together is output implicitly)