Multiplier ou diviser par n
Voici un défi simple, alors j'espère que de nombreuses langues pourront participer.
Étant donné un entier positif \$n\$, sortie \$A076039(n)\$de l' OEIS .
Autrement dit, commencez par \$a(1)=1\$. Puis pour \$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. $$
Cas de test:
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
D'autres cas de test peuvent être trouvés sur la page OEIS.
Selon les règles de séquence habituelles , vous pouvez entrer et sortir d'une manière généralement acceptée: indexation basée sur 1 ou 0, sortie d'une séquence infinie, sortie du premier \$n\$valeurs, affiche uniquement les \$n^\text{th}\$ valeur, et ainsi de suite, mais précisez-le dans votre réponse.
C'est du code-golf , donc le code le plus court en octets dans chaque langue gagne!
Réponses
Gelée , 6 octets
R×:<?/
Un lien monadique acceptant un entier positif, \$n\$, ce qui donne un entier positif, \$a(n)\$.
Essayez-le en ligne! Ou voir la suite de tests .
Comment?
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
Sortie de la séquence jusqu'à \$a(n)\$ avec:
R×:<?\
Scratch 3.0, 29 27 blocs / 234 167 octets

En tant que syntaxe 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)
Essayez-le à zéro
Je ne suis pas sûr de certaines méthodes d'entrée / sortie, alors j'ai pensé que je serais en sécurité et en ferais simplement un programme complet avec une fonction d'assistance.
Répondre à cela a permis à mon compte d'être promu de "nouveau" à "standard", donc c'est toujours amusant.
-67 octets grâce à @att
Langage de programmation Shakespeare , 221 octets
,.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.
Essayez-le en ligne!
Sort la liste infinie. Notez cependant qu'il n'y a pas de séparateur entre les valeurs de sortie, donc la sortie est quelque peu difficile à lire.
Ma meilleure tentative pour ajouter un séparateur (un octet nul) se résume à
Langage de programmation Shakespeare , 297 octets
,.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.
Essayez-le en ligne!
Python 2 , 47 43 39 octets
Sauvegardé 4 octets grâce à xnor !!!
Sauvé 4 octets grâce à Neil !!!
r=i=1
while 1:r=r/i or r*i;print r;i+=1
Essayez-le en ligne!
Impressions \$\{a(n)\mid n \in \mathbb{N}\}\$ comme une séquence infinie.
R , 43 39 octets
-4 octets grâce à Giuseppe.
for(i in 1:scan())T=T%/%i^(2*(i<T)-1);T
Essayez-le en ligne!
Sort le \$n\$e terme, indexé en 1.
Initialisation de la séquence avec \$a(0)=1\$fonctionne également, car la formule donne alors \$a(1)=1\$comme voulu. La variable T
est forcée à l'entier 1
, et nous appliquons à plusieurs reprises une version plus compacte de la formule:
$$a(n)=\left\lfloor \frac{a(n-1)}{n^{2\mathbb{I_{n<a(n-1)}} -1}}\right\rfloor $$
(avec \$\mathbb I\$la fonction indicateur). Cela couvre les deux cas de la définition originale.
APL (Dyalog Unicode) , 18 octets (SBCS)
{⍺>⍵:⍺×⍵⋄⌊⍵÷⍺}/⌽ö⍳
Essayez-le en ligne!
Une fonction à peine jouée mais sûre qui produit le nième élément de la séquence.
APL (Dyalog Unicode) , 15 14 octets (SBCS)
1 octet enregistré grâce à @ Adám
(⌊⊢×⊣*∘×-)/⌽ö⍳
Essayez-le en ligne!
Sort le nième élément de la séquence. Je viens de réaliser que cela ne fonctionnera pas si \$n = a(n-1)\$car il élève n à la puissance de \$n - a(n-1)\$et multiplie cela par \$a\$, bien que pour autant que je sache , cette fonction fonctionne jusqu'à au moins 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 octets
a#n|n>a=a*n|1>0=a`div`n
a=scanl1(#)[1..]
Essayez-le en ligne!
- Sort une séquence infinie.
L'opérateur infixe # calcule le terme suivant, nous l'utilisons pour plier tous les entiers positifs [1 ..] mais en utilisant scanl1 à la place ce qui nous donne toutes les étapes.
R , 41 octets
for(m in 1:scan())T=`if`(m>T,T*m,T%/%m);T
Essayez-le en ligne!
Je me suis forcé à ne pas regarder la réponse R de Robin Ryder avant de me lancer. Heureusement, nous avons trouvé des approches différentes l'une de l'autre, bien que les deux semblent (jusqu'à présent) avoir exactement la même longueur en octets, malheureusement pour moi, la sienne est maintenant de 2 octets plus courte ...
C (gcc) , 35 octets
Prend un index de départ basé sur 1 et renvoie la nième valeur de séquence.
f(i,j){i=i?i>(j=f(i-1))?j*i:j/i:1;}
Essayez-le en ligne!
Forth (gforth) , 82 octets
: f 2dup 2dup > if * else swap / then dup . swap drop swap 1+ swap recurse ;
1 1 f
Essayez-le en ligne!
Produit une séquence infinie, séparée par des espaces.
Perl 5 -Minteger
-061
, 36 , 27 octets
-9 octets grâce à @Abigail et @Sisyphus.
produit une séquence infinie
say$/while$/=$//++$i||$/*$i
Essayez-le en ligne!
Python 3.8+ , 45 39 octets
-2 grâce à xnor ( while print(...)!=0:
→ while[print(...)]:
)
-4 grâce à Neil ( [a*n,a//n][a>n]
→ a//n or a*n
)
a=n=1
while[print(a:=a//n or a*n)]:n+=1
Un programme complet qui imprime \$a(n)\$ pour tous les nombres naturels.
Essayez-le en ligne!
En tant que fonction récursive, 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 octets
Sauvegardé 3 octets grâce à @Neil
Renvoie le \$n\$-ème terme, indexé 1.
f=(n,k=i=1n)=>i++<n?f(n,k/i||k*i):k
Essayez-le en ligne!
Facteur , 45 octets
[ [1,b] 1 [ 2dup < [ * ] [ /i ] if ] reduce ]
Essayez-le en ligne!
Réduction simple. Prend un index basé sur 1 et renvoie le n-ième terme.
[ ! 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
]
Husk , 11 octets
Fμ?*`÷<¹³)ḣ
Essayez-le en ligne!
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 octets
map$.=$_>$.?$.*$_:$./$_,2..$_;$_=$.
Essayez-le en ligne!
Prend n
comme entrée et imprime l' n
th
élément dans la liste.
05AB1E , 12 10 octets
Imprime la séquence infinie.
λN>₁N›i÷ë*
Essayez-le en ligne!
Commenté :
λ # 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 octets
{_x*(1%y;y)y>x}/1+!:
Essayez-le en ligne!
Plutôt que d'utiliser $[y>x;y;1%y]
, les indexes dans la liste en (1%y;y)
utilisant la condition booléenne y>x
pour enregistrer quelques octets.
Forth (gforth) , 51 octets
: f 1+ 1 tuck ?do i 2dup <= if * else / then loop ;
Essayez-le en ligne!
Explication du code
: 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 octets
n->{int i,a=i=1;for(;i++<n;)a=i>a?i*a:a/i;return a;}
Essayez-le en ligne!
Remarque: Merci @RedwolfPrograms pour -1 octet et @user pour -10 (?) Octets.
Gelée , 11 octets
1’ß×:>@?$Ị?
Essayez-le en ligne!
Comment ça fonctionne
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 octets
⟦₁{÷ℕ₁|×}ˡ
Essayez-le en ligne!
Donne la liste des singleton [1]
au lieu de 1
pour n = 1, mais rien d'extraordinaire autrement.
ˡ Reduce
⟦₁ 1 .. n
{ } by:
÷ integer division
ℕ₁ if the result is 1 or greater,
|× multiplication if not.
Gaia , 9 octets
┅⟪<₌×/?⟫⊢
Essayez-le en ligne!
Fondamentalement, la même chose que la réponse Jelly plus courte. 1-indexed, imprime a(n)
, mais ⊢
pourrait être échangé avec ⊣
pour obtenir les premiers n
éléments à la place.
# 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
Rétine , 58 octets
K`_ _
"$+"+L$`(^_+|_)(?<=(\1)+) (\1)+
_$`$1 $#3*$#2*
r`_\G
Essayez-le en ligne! Aucune suite de tests à cause de la manière dont le script utilise l'historique. Explication:
K`_ _
Remplacez l'entrée par une paire de 1 (en unaire). Le premier est l'indice de boucle tandis que le second est la sortie.
"$+"+
n
Temps de boucle .
L$`(^_+|_)(?<=(\1)+) (\1)+
Divisez à la fois la sortie et l'index de boucle par l'index de boucle, ou par 1 si la division serait égale à zéro.
_$`$1 $#3*$#2*
Incrémentez l'indice de boucle et multipliez les deux quotients ensemble. Cela se traduit par output/index*index/index
ou output/1*index/1
respectivement.
r`_\G
Convertissez la sortie finale en décimal.
PHP , 57 octets
function a($n){return$n?($n>$x=a($n-1))?$x*$n:$x/$n|0:1;}
Essayez-le en ligne!
cQuents , 14 octets
=1:$>Z?$Z:Z_/$
Essayez-le en ligne!
Explication
=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
Raquette , 66 octets
(λ(n)(foldl(λ(x y)((if(< y x)* quotient)y x))1(range 1(+ 1 n))))
Essayez-le en ligne!
Wolfram Language (Mathematica) , 40 octets
a@1=1;a@n_:=If[#<n,n#,⌊#/n⌋]&@a[n-1]
Essayez-le en ligne!
-2 octets de @att
J , 21 octets
[:(]<.@*[^*@-)/1+i.@-
Essayez-le en ligne!
Un port J de la solution APL de @user - n'oubliez pas de voter pour!
MathGolf , 11 9 octets
1k{î`<¿*/
-2 octets grâce à @ovs .
Sort le \$n^{th}\$ valeur.
Essayez-le en ligne.
Explication:
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)