Multiplique ou divida por n

Nov 26 2020

Este é um desafio simples, portanto, espero que muitos idiomas possam participar.

Dado um número inteiro positivo \$n\$, saída \$A076039(n)\$do OEIS .

Ou seja, comece com \$a(1)=1\$. Então, para \$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. $$

Casos de teste:

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

Mais casos de teste podem ser encontrados na página OEIS.

De acordo com as regras de sequência usuais , você pode inserir e enviar de uma maneira geralmente aceita: indexação baseada em 1 ou 0, saída de uma sequência infinita, saída da primeira \$n\$valores, imprima apenas o \$n^\text{th}\$ valor e assim por diante, mas especifique isso em sua resposta.

Este é o código-golfe , então o código mais curto em bytes em cada idioma vence!

Respostas

15 JonathanAllan Nov 26 2020 at 01:35

Gelatina , 6 bytes

R×:<?/

Um Link monádico aceitando um número inteiro positivo, \$n\$, o que produz um número inteiro positivo, \$a(n)\$.

Experimente online! Ou veja o conjunto de testes .

Como?

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

Produza a sequência até \$a(n)\$ com:

R×:<?\
14 Lyxal Nov 26 2020 at 06:16

Scratch 3.0, 29 27 blocos / 234 167 bytes

Como Sintaxe 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)

Experimente no zero

Estou um pouco inseguro sobre alguns métodos de entrada / saída, então pensei que estaria seguro e apenas torná-lo um programa completo com uma função auxiliar.

Responder a isso permitiu que minha conta fosse promovida de "nova" para "padrão", o que é sempre divertido.

-67 bytes graças a @att

13 RobinRyder Nov 26 2020 at 05:21

Linguagem de programação de Shakespeare , 221 bytes

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

Experimente online!

Produz a lista infinita. Observe, entretanto, que não há separador entre os valores de saída, portanto, a saída é um tanto difícil de ler.

Minha melhor tentativa de adicionar um separador (um byte nulo) chega a

Linguagem de programação de Shakespeare , 297 bytes

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

Experimente online!

11 Noodle9 Nov 26 2020 at 01:51

Python 2 , 47 43 39 bytes

Economizei 4 bytes graças ao xnor !!!
Economizei 4 bytes graças ao Neil !!!

r=i=1
while 1:r=r/i or r*i;print r;i+=1

Experimente online!

Impressões \$\{a(n)\mid n \in \mathbb{N}\}\$ como uma sequência infinita.

10 RobinRyder Nov 26 2020 at 00:55

R , 43 39 bytes

-4 bytes graças a Giuseppe.

for(i in 1:scan())T=T%/%i^(2*(i<T)-1);T

Experimente online!

Produz o \$n\$º termo, indexado em 1.

Inicializando a sequência com \$a(0)=1\$também funciona, pois a fórmula fornece \$a(1)=1\$como desejado. A variável Té forçada ao número inteiro 1, e aplicamos repetidamente uma versão mais compacta da fórmula:

$$a(n)=\left\lfloor \frac{a(n-1)}{n^{2\mathbb{I_{n<a(n-1)}} -1}}\right\rfloor $$

(com \$\mathbb I\$função do indicador). Isso cobre os dois casos da definição original.

8 user Nov 26 2020 at 00:20

APL (Dyalog Unicode) , 18 bytes (SBCS)

{⍺>⍵:⍺×⍵⋄⌊⍵÷⍺}/⌽ö⍳

Experimente online!

Uma função quase segura, mas segura, que produz o enésimo elemento da sequência.


APL (Dyalog Unicode) , 15 14 bytes (SBCS)

Salvo 1 byte graças a @ Adám

(⌊⊢×⊣*∘×-)/⌽ö⍳

Experimente online!

Produz o enésimo elemento da sequência. Acabei de perceber que isso não funcionará se \$n = a(n-1)\$porque eleva n à potência de \$n - a(n-1)\$e multiplica isso por \$a\$, embora , pelo que eu saiba , essa função funciona até pelo menos 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 bytes

a#n|n>a=a*n|1>0=a`div`n
a=scanl1(#)[1..]

Experimente online!

  • Gera sequência infinita.

O operador Infix # calcula o próximo termo, nós o usamos para dobrar todos os inteiros positivos [1 ..], mas usando scanl1 em vez disso, o que nos dá todas as etapas.

7 DominicvanEssen Nov 26 2020 at 03:00

R , 41 bytes

for(m in 1:scan())T=`if`(m>T,T*m,T%/%m);T

Experimente online!

Obriguei-me a não olhar para a resposta R de Robin Ryder antes de tentar. Felizmente, criamos abordagens diferentes um para o outro, embora ambos pareçam (até agora) ter exatamente o mesmo comprimento em bytes, infelizmente para mim o seu agora está 2 bytes a menos ...

7 ErikF Nov 26 2020 at 08:42

C (gcc) , 35 bytes

Obtém um índice inicial baseado em 1 e retorna o enésimo valor da sequência.

f(i,j){i=i?i>(j=f(i-1))?j*i:j/i:1;}

Experimente online!

7 Razetime Nov 26 2020 at 10:53

Adiante (gforth) , 82 bytes

: f 2dup 2dup > if * else swap / then dup . swap drop swap 1+ swap recurse ;
1 1 f

Experimente online!

Produz uma sequência infinita, separada por espaços.

7 NahuelFouilleul Nov 26 2020 at 00:02

Perl 5 -Minteger -061 , 36 , 27 bytes

-9 bytes graças a @Abigail e @Sisyphus.

produz uma sequência infinita

say$/while$/=$//++$i||$/*$i

Experimente online!

7 JonathanAllan Nov 26 2020 at 02:15

Python 3.8+ ,  45  39 bytes

-2 graças a xnor ( while print(...)!=0:while[print(...)]:)
-4 graças a 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

Um programa completo que imprime \$a(n)\$ para todos os números naturais.

Experimente online!


Como uma função recursiva, 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 bytes

Economizou 3 bytes graças a @Neil

Retorna o \$n\$-ésimo termo, indexado em 1.

f=(n,k=i=1n)=>i++<n?f(n,k/i||k*i):k

Experimente online!

6 Bubbler Nov 26 2020 at 13:49

Fator , 45 bytes

[ [1,b] 1 [ 2dup < [ * ] [ /i ] if ] reduce ]

Experimente online!

Redução direta. Obtém um índice baseado em 1 e retorna o enésimo termo.

[                         ! 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 bytes

Fμ?*`÷<¹³)ḣ

Experimente online!

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 bytes

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

Experimente online!

Aceita ncomo entrada e imprime o nthitem da lista.

5 ovs Nov 26 2020 at 04:58

05AB1E , 12 10 bytes

Imprime a seqüência infinita.

λN>₁N›i÷ë*

Experimente online!

Comentado :

λ              # 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 bytes

{_x*(1%y;y)y>x}/1+!:

Experimente online!

Em vez de usar $[y>x;y;1%y], os índices na lista (1%y;y)usam a condição booleana y>xpara salvar alguns bytes.

5 reffu Nov 27 2020 at 22:44

Adiante (gforth) , 51 bytes

: f 1+ 1 tuck ?do i 2dup <= if * else / then loop ;

Experimente online!

Explicação do código

: 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 bytes

n->{int i,a=i=1;for(;i++<n;)a=i>a?i*a:a/i;return a;}

Experimente online!

Nota: Obrigado @RedwolfPrograms por -1 Byte e @user por -10 (?) Bytes.

4 cairdcoinheringaahing Nov 26 2020 at 00:39

Jelly , 11 bytes

1’ß×:>@?$Ị?

Experimente online!

Como funciona

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 bytes

⟦₁{÷ℕ₁|×}ˡ

Experimente online!

Fornece a lista singleton em [1]vez de 1n = 1, mas nada fora do comum de outra forma.

         ˡ    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 bytes

┅⟪<₌×/?⟫⊢

Experimente online!

Basicamente o mesmo que a resposta Jelly mais curta. Com índice 1, impressões a(n), embora possam ser trocados para obter os primeiros nelementos.

		# 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

Retina , 58 bytes

K`_ _
"$+"+L$`(^_+|_)(?<=(\1)+) (\1)+
_$`$1 $#3*$#2*
r`_\G

Experimente online! Sem suíte de teste devido à maneira como o script usa o histórico. Explicação:

K`_ _

Substitua a entrada por um par de 1s (em unário). O primeiro é o índice do loop, enquanto o segundo é a saída.

"$+"+

nTempos de loop .

L$`(^_+|_)(?<=(\1)+) (\1)+

Divida a saída e o índice do loop pelo índice do loop ou por 1 se a divisão for zero.

_$`$1 $#3*$#2*

Incremente o índice do loop e multiplique os dois quocientes. Isso resulta em output/index*index/indexou output/1*index/1respectivamente.

r`_\G

Converta a saída final em decimal.

4 640KB Nov 26 2020 at 03:19

PHP , 57 bytes

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

Experimente online!

4 Stephen Nov 26 2020 at 03:32

cQuents , 14 bytes

=1:$>Z?$Z:Z_/$

Experimente online!

Explicação

=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

Raquete , 66 bytes

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

Experimente online!

4 J42161217 Nov 26 2020 at 03:40

Linguagem Wolfram (Mathematica) , 40 bytes

a@1=1;a@n_:=If[#<n,n#,⌊#/n⌋]&@a[n-1]

Experimente online!

-2 bytes de @att

4 GalenIvanov Nov 26 2020 at 18:39

J , 21 bytes

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

Experimente online!

Uma porta J da solução APL do @user - não se esqueça de votar a favor!

4 KevinCruijssen Nov 27 2020 at 15:51

MathGolf , 11 9 bytes

1k{î`<¿*/

-2 bytes graças a @ovs .

Produz o \$n^{th}\$ valor.

Experimente online.

Explicação:

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)