Pomnóż lub podziel przez n

Nov 26 2020

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

15 JonathanAllan Nov 26 2020 at 01:35

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

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)

Wypróbuj na zera

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

13 RobinRyder Nov 26 2020 at 05:21

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.

Wypróbuj online!

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.

Wypróbuj online!

11 Noodle9 Nov 26 2020 at 01:51

Python 2 , 47 43 39 bajtów

Zapisano 4 bajty dzięki xnor !!!
Zapisano 4 bajty dzięki Neilowi !!!

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

Wypróbuj online!

Wydruki \$\{a(n)\mid n \in \mathbb{N}\}\$ jako nieskończona sekwencja.

10 RobinRyder Nov 26 2020 at 00:55

R , 43 39 bajtów

-4 bajty dzięki Giuseppe.

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

Wypróbuj online!

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 Tjest przekształcana na liczbę całkowitą 1i 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.

8 user Nov 26 2020 at 00:20

APL (Dyalog Unicode) , 18 bajtów (SBCS)

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

Wypróbuj online!

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

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

Wypróbuj online!

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

Haskell , 40 bajtów

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

Wypróbuj online!

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

7 DominicvanEssen Nov 26 2020 at 03:00

R , 41 bajtów

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

Wypróbuj online!

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

7 ErikF Nov 26 2020 at 08:42

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;}

Wypróbuj online!

7 Razetime Nov 26 2020 at 10:53

Forth (gforth) , 82 bajty

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

Wypróbuj online!

Wyprowadza nieskończoną sekwencję oddzieloną spacjami.

7 NahuelFouilleul Nov 26 2020 at 00:02

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

Wypróbuj online!

7 JonathanAllan Nov 26 2020 at 02:15

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.

Wypróbuj online!


Jako funkcja rekurencyjna 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 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

Wypróbuj online!

6 Bubbler Nov 26 2020 at 13:49

Współczynnik , 45 bajtów

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

Wypróbuj online!

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

Łuska , 11 bajtów

Fμ?*`÷<¹³)ḣ

Wypróbuj 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 bajtów

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

Wypróbuj online!

Przyjmuje njako dane wejściowe i drukuje nthelement na liście.

5 ovs Nov 26 2020 at 04:58

05AB1E , 12 10 bajtów

Wyświetla nieskończoną sekwencję.

λN>₁N›i÷ë*

Wypróbuj online!

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

K (oK) , 22 20 bajtów

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

Wypróbuj online!

Zamiast używać $[y>x;y;1%y], indeksuje listę (1%y;y)przy użyciu warunku logicznego, y>xaby zaoszczędzić kilka bajtów.

5 reffu Nov 27 2020 at 22:44

Forth (gforth) , 51 bajtów

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

Wypróbuj online!

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

Java (JDK) , 52 bajty

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

Wypróbuj online!

Uwaga: dziękujemy @RedwolfPrograms za -1 bajt i @user za -10 (?) Bajtów.

4 cairdcoinheringaahing Nov 26 2020 at 00:39

Galaretka , 11 bajtów

1’ß×:>@?$Ị?

Wypróbuj online!

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

Brachylog , 10 bajtów

⟦₁{÷ℕ₁|×}ˡ

Wypróbuj online!

Podaje listę singletonów [1]zamiast 1for n = 1, ale poza tym nic niezwykłego.

         ˡ    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 bajtów

┅⟪<₌×/?⟫⊢

Wypróbuj online!

Zasadniczo to samo, co krótsza odpowiedź Jelly. Wydruki indeksowane 1 a(n), chociaż można je zamienić, aby nzamiast 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
4 Neil Nov 26 2020 at 03:00

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.

"$+"+

nCzasy 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/indexlub output/1*index/1.

r`_\G

Zamień ostateczne dane wyjściowe na dziesiętne.

4 640KB Nov 26 2020 at 03:19

PHP , 57 bajtów

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

Wypróbuj online!

4 Stephen Nov 26 2020 at 03:32

cQuents , 14 bajtów

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

Wypróbuj online!

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

Rakieta , 66 bajtów

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

Wypróbuj online!

4 J42161217 Nov 26 2020 at 03:40

Język Wolfram (Mathematica) , 40 bajtów

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

Wypróbuj online!

-2 bajty z @att

4 GalenIvanov Nov 26 2020 at 18:39

J , 21 bajtów

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

Wypróbuj online!

A J portowym @user „s rozwiązanie APL - nie zapomnij go upvote!

4 KevinCruijssen Nov 27 2020 at 15:51

MathGolf , 11 9 bajtów

1k{î`<¿*/

-2 bajty dzięki @ovs .

Wyświetla \$n^{th}\$ wartość.

Wypróbuj online.

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)