Multiplier ou diviser par n

Nov 26 2020

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

15 JonathanAllan Nov 26 2020 at 01:35

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×:<?\
14 Lyxal Nov 26 2020 at 06:16

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

13 RobinRyder Nov 26 2020 at 05:21

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!

11 Noodle9 Nov 26 2020 at 01:51

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.

10 RobinRyder Nov 26 2020 at 00:55

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 Test 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.

8 user Nov 26 2020 at 00:20

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
8 AZTECCO Nov 26 2020 at 06:11

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.

7 DominicvanEssen Nov 26 2020 at 03:00

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

7 ErikF Nov 26 2020 at 08:42

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!

7 Razetime Nov 26 2020 at 10:53

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.

7 NahuelFouilleul Nov 26 2020 at 00:02

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!

7 JonathanAllan Nov 26 2020 at 02:15

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)
6 Arnauld Nov 26 2020 at 00:12

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!

6 Bubbler Nov 26 2020 at 13:49

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
]
5 DominicvanEssen Nov 26 2020 at 03:33

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
5 Xcali Nov 26 2020 at 04:51

Perl 5 -Minteger -p , 35 octets

map$.=$_>$.?$.*$_:$./$_,2..$_;$_=$.

Essayez-le en ligne!

Prend ncomme entrée et imprime l' nthélément dans la liste.

5 ovs Nov 26 2020 at 04:58

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
5 coltim Nov 26 2020 at 03:27

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>xpour enregistrer quelques octets.

5 reffu Nov 27 2020 at 22:44

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
5 DMiddendorf Nov 30 2020 at 22:45

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.

4 cairdcoinheringaahing Nov 26 2020 at 00:39

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)
4 UnrelatedString Nov 26 2020 at 01:56

Brachylog , 10 octets

⟦₁{÷ℕ₁|×}ˡ

Essayez-le en ligne!

Donne la liste des singleton [1]au lieu de 1pour n = 1, mais rien d'extraordinaire autrement.

         ˡ    Reduce
⟦₁            1 .. n
  {     }     by:
   ÷          integer division
    ℕ₁        if the result is 1 or greater,
      |×      multiplication if not.
4 Giuseppe Nov 26 2020 at 02:07

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
4 Neil Nov 26 2020 at 03:00

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.

"$+"+

nTemps 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/indexou output/1*index/1respectivement.

r`_\G

Convertissez la sortie finale en décimal.

4 640KB Nov 26 2020 at 03:19

PHP , 57 octets

function a($n){return$n?($n>$x=a($n-1))?$x*$n:$x/$n|0:1;}

Essayez-le en ligne!

4 Stephen Nov 26 2020 at 03:32

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
4 GalenIvanov Nov 26 2020 at 15:19

Raquette , 66 octets

(λ(n)(foldl(λ(x y)((if(< y x)* quotient)y x))1(range 1(+ 1 n))))

Essayez-le en ligne!

4 J42161217 Nov 26 2020 at 03:40

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

4 GalenIvanov Nov 26 2020 at 18:39

J , 21 octets

[:(]<.@*[^*@-)/1+i.@-

Essayez-le en ligne!

Un port J de la solution APL de @user - n'oubliez pas de voter pour!

4 KevinCruijssen Nov 27 2020 at 15:51

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)