Multiplizieren oder dividieren Sie mit n

Nov 26 2020

Hier ist eine einfache Herausforderung, so dass hoffentlich viele Sprachen teilnehmen können.

Bei einer positiven ganzen Zahl \$n\$, Ausgabe \$A076039(n)\$von der OEIS .

Beginnen Sie also mit \$a(1)=1\$. Dann für \$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. $$

Testfälle:

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

Weitere Testfälle finden Sie auf der OEIS-Seite.

Gemäß den üblichen Sequenzregeln können Sie auf allgemein akzeptierte Weise eingeben und ausgeben: 1- oder 0-basierte Indizierung, Ausgabe einer unendlichen Sequenz, Ausgabe des ersten \$n\$Werte, geben Sie nur die \ aus$n^\text{th}\$ Wert und so weiter, aber geben Sie dies in Ihrer Antwort an.

Dies ist Code-Golf , also gewinnt der kürzeste Code in Bytes in jeder Sprache!

Antworten

15 JonathanAllan Nov 26 2020 at 01:35

Gelee , 6 Bytes

R×:<?/

Ein monadischer Link, der eine positive ganze Zahl akzeptiert, \$n\$, was eine positive ganze Zahl ergibt, \$a(n)\$.

Probieren Sie es online aus! Oder sehen Sie sich die Testsuite an .

Wie?

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

Geben Sie die Sequenz bis zu \ aus$a(n)\$ mit:

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

Scratch 3.0, 29 27 Blöcke / 234 167 Bytes

Als SB-Syntax:

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)

Versuchen Sie es von Grund auf neu

Ich bin mir bei einigen Eingabe- / Ausgabemethoden ein wenig unsicher, daher dachte ich, ich wäre sicher und würde es einfach zu einem vollständigen Programm mit einer Hilfsfunktion machen.

Durch die Beantwortung dieser Frage konnte mein Konto von "neu" auf "Standard" hochgestuft werden. Das macht also immer Spaß.

-67 Bytes dank @att

13 RobinRyder Nov 26 2020 at 05:21

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

Probieren Sie es online aus!

Gibt die unendliche Liste aus. Beachten Sie jedoch, dass es kein Trennzeichen zwischen den Ausgabewerten gibt, sodass die Ausgabe etwas schwer lesbar ist.

Mein bester Versuch, ein Trennzeichen (ein Null-Byte) hinzuzufügen, ist wie folgt

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

Probieren Sie es online aus!

11 Noodle9 Nov 26 2020 at 01:51

Python 2 , 47 43 39 Bytes

4 Bytes dank xnor gespeichert !!!
4 Bytes dank Neil gespart !!!

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

Probieren Sie es online aus!

Druckt \$\{a(n)\mid n \in \mathbb{N}\}\$ als unendliche Folge.

10 RobinRyder Nov 26 2020 at 00:55

R , 43 39 Bytes

-4 Bytes dank Giuseppe.

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

Probieren Sie es online aus!

Gibt das \ aus$n\$th Term, 1-indexiert.

Initialisieren der Sequenz mit \$a(0)=1\$funktioniert auch, da die Formel dann \ gibt$a(1)=1\$wie gewünscht. Die Variable Twird zur Ganzzahl gezwungen 1, und wir wenden wiederholt eine kompaktere Version der Formel an:

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

(mit \$\mathbb I\$die Anzeigefunktion). Dies umfasst beide Fälle der ursprünglichen Definition.

8 user Nov 26 2020 at 00:20

APL (Dyalog Unicode) , 18 Bytes (SBCS)

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

Probieren Sie es online aus!

Eine kaum Golf, aber sichere Funktion, die das n-te Element der Sequenz ausgibt.


APL (Dyalog Unicode) , 15 bis 14 Byte (SBCS)

1 Byte dank @ Adám gespeichert

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

Probieren Sie es online aus!

Gibt das n-te Element der Sequenz aus. Ich habe gerade festgestellt, dass dies nicht funktioniert, wenn \$n = a(n-1)\$weil es n zur Potenz von \ erhebt$n - a(n-1)\$und multipliziert das mit \$a\$, soweit ich das beurteilen kann , funktioniert diese Funktion bis mindestens 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..]

Probieren Sie es online aus!

  • Gibt eine unendliche Reihenfolge aus.

Der Infix-Operator # berechnet den nächsten Term. Wir verwenden ihn, um alle positiven ganzen Zahlen [1 ..] zu falten, verwenden jedoch stattdessen scanl1, wodurch wir alle Schritte erhalten.

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

Probieren Sie es online aus!

Ich zwang mich, Robin Ryder's R-Antwort nicht anzusehen , bevor ich es versuchte. Glücklicherweise haben wir uns unterschiedliche Herangehensweisen ausgedacht, obwohl beide (bisher) genau die gleiche Länge in Bytes zu haben scheinen, leider ist seine jetzt 2 Bytes kürzer ...

7 ErikF Nov 26 2020 at 08:42

C (gcc) , 35 Bytes

Nimmt einen 1-basierten Startindex und gibt den n-ten Sequenzwert zurück.

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

Probieren Sie es online aus!

7 Razetime Nov 26 2020 at 10:53

Forth (gforth) , 82 Bytes

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

Probieren Sie es online aus!

Gibt eine unendliche Folge aus, die durch Leerzeichen getrennt ist.

7 NahuelFouilleul Nov 26 2020 at 00:02

Perl 5 -Minteger -061 , 36 , 27 Bytes

-9 Bytes dank @Abigail und @Sisyphus.

gibt eine unendliche Folge aus

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

Probieren Sie es online aus!

7 JonathanAllan Nov 26 2020 at 02:15

Python 3.8+ ,  45  39 Bytes

-2 danke an xnor ( while print(...)!=0:while[print(...)]:)
-4 danke an 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

Ein vollständiges Programm, das \ druckt$a(n)\$ für alle natürlichen Zahlen.

Probieren Sie es online aus!


Als rekursive Funktion 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 Byte

3 Bytes dank @Neil gespeichert

Gibt das \ zurück$n\$-th term, 1-indexiert.

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

Probieren Sie es online aus!

6 Bubbler Nov 26 2020 at 13:49

Faktor 45 Bytes

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

Probieren Sie es online aus!

Einfache Reduzierung. Nimmt einen 1-basierten Index und gibt den n-ten Term zurück.

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

Schale , 11 Bytes

Fμ?*`÷<¹³)ḣ

Probieren Sie es online aus!

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..$_;$_=$.

Probieren Sie es online aus!

Nimmt nals Eingabe und druckt das nthElement in der Liste.

5 ovs Nov 26 2020 at 04:58

05AB1E , 12 10 Bytes

Druckt die unendliche Sequenz.

λN>₁N›i÷ë*

Probieren Sie es online aus!

Kommentiert :

λ              # 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 bis 20 Bytes

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

Probieren Sie es online aus!

Anstatt zu verwenden $[y>x;y;1%y], werden Indizes (1%y;y)mit der booleschen Bedingung in die Liste aufgenommen y>x, um ein paar Bytes zu speichern.

5 reffu Nov 27 2020 at 22:44

Forth (gforth) , 51 Bytes

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

Probieren Sie es online aus!

Code Erklärung

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

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

Probieren Sie es online aus!

Hinweis: Vielen Dank an @RedwolfPrograms für -1 Byte und @user für -10 (?) Bytes.

4 cairdcoinheringaahing Nov 26 2020 at 00:39

Gelee , 11 Bytes

1’ß×:>@?$Ị?

Probieren Sie es online aus!

Wie es funktioniert

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

⟦₁{÷ℕ₁|×}ˡ

Probieren Sie es online aus!

Gibt die Singleton-Liste [1]anstelle von 1n = 1 an, aber sonst nichts Außergewöhnliches.

         ˡ    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

┅⟪<₌×/?⟫⊢

Probieren Sie es online aus!

Grundsätzlich das gleiche wie die kürzere Jelly-Antwort. 1-indiziert, Druck a(n), obwohl mit getauscht werden könnte , die ersten bekommen nElemente statt.

		# 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

Netzhaut , 58 Bytes

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

Probieren Sie es online aus! Keine Testsuite, da das Skript den Verlauf verwendet. Erläuterung:

K`_ _

Ersetzen Sie den Eingang durch ein Paar von 1s (unär). Der erste ist der Schleifenindex, während der zweite die Ausgabe ist.

"$+"+

Schleifenzeiten n.

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

Teilen Sie sowohl den Ausgabe- als auch den Schleifenindex durch den Schleifenindex oder durch 1, wenn die Division Null wäre.

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

Erhöhen Sie den Schleifenindex und multiplizieren Sie die beiden Quotienten miteinander. Dies führt zu output/index*index/indexoder output/1*index/1jeweils.

r`_\G

Konvertieren Sie die endgültige Ausgabe in eine Dezimalzahl.

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

Probieren Sie es online aus!

4 Stephen Nov 26 2020 at 03:32

cQuents , 14 Bytes

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

Probieren Sie es online aus!

Erläuterung

=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

Schläger , 66 Bytes

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

Probieren Sie es online aus!

4 J42161217 Nov 26 2020 at 03:40

Wolfram Language (Mathematica) , 40 Bytes

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

Probieren Sie es online aus!

-2 Bytes von @att

4 GalenIvanov Nov 26 2020 at 18:39

J , 21 Bytes

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

Probieren Sie es online aus!

Ein J- Port der APL-Lösung von @user - vergessen Sie nicht, sie zu verbessern!

4 KevinCruijssen Nov 27 2020 at 15:51

MathGolf , 11 9 Bytes

1k{î`<¿*/

-2 Bytes dank @ovs .

Gibt das \ aus$n^{th}\$ Wert.

Probieren Sie es online aus.

Erläuterung:

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)