Nhân hoặc Chia cho n

Nov 26 2020

Đây là một thử thách đơn giản, vì vậy hy vọng rằng nhiều ngôn ngữ sẽ có thể tham gia.

Cho một số nguyên dương \$n\$, đầu ra \$A076039(n)\$từ OEIS .

Đó là, bắt đầu bằng \$a(1)=1\$. Sau đó cho \$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. $$

Các trường hợp kiểm tra:

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

Có thể tìm thấy nhiều trường hợp thử nghiệm hơn trên trang OEIS.

Theo quy tắc trình tự thông thường , bạn có thể nhập và xuất theo cách thường được chấp nhận: lập chỉ mục dựa trên 1- hoặc 0, xuất một chuỗi vô hạn, xuất đầu tiên \$n\$giá trị, chỉ xuất ra \$n^\text{th}\$ giá trị, v.v., nhưng hãy chỉ định điều đó trong câu trả lời của bạn.

Đây là mã-gôn , vì vậy mã ngắn nhất tính bằng byte trong mỗi ngôn ngữ sẽ thắng!

Trả lời

15 JonathanAllan Nov 26 2020 at 01:35

Thạch , 6 byte

R×:<?/

Một liên kết đơn nguyên chấp nhận một số nguyên dương, \$n\$, mang lại một số nguyên dương, \$a(n)\$.

Hãy thử nó trực tuyến! Hoặc xem bộ thử nghiệm .

Làm sao?

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

Xuất trình tự lên đến \$a(n)\$ với:

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

Scratch 3.0, 29 27 khối / 234 167 byte

Như SB Cú pháp:

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)

Hãy thử nó trên đầu

Tôi hơi không chắc chắn về một số phương thức nhập / xuất, vì vậy tôi nghĩ mình sẽ an toàn và chỉ cần biến nó thành một chương trình đầy đủ với chức năng trợ giúp.

Trả lời được điều này cho phép tài khoản của tôi được thăng hạng từ "mới" lên "tiêu chuẩn", vì vậy điều đó luôn thú vị.

-67 byte nhờ @att

13 RobinRyder Nov 26 2020 at 05:21

Ngôn ngữ lập trình Shakespeare , 221 byte

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

Hãy thử nó trực tuyến!

Xuất ra danh sách vô hạn. Tuy nhiên, lưu ý rằng không có dấu phân cách giữa các giá trị đầu ra, vì vậy đầu ra hơi khó đọc.

Nỗ lực tốt nhất của tôi trong việc thêm dấu phân tách (byte rỗng) xuất hiện dưới dạng

Ngôn ngữ lập trình Shakespeare , 297 byte

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

Hãy thử nó trực tuyến!

11 Noodle9 Nov 26 2020 at 01:51

Python 2 , 47 43 39 byte

Đã tiết kiệm 4 byte nhờ xnor !!!
Đã tiết kiệm 4 byte nhờ Neil !!!

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

Hãy thử nó trực tuyến!

Bản in \$\{a(n)\mid n \in \mathbb{N}\}\$ như một chuỗi vô hạn.

10 RobinRyder Nov 26 2020 at 00:55

R , 43 39 byte

-4 byte cảm ơn Giuseppe.

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

Hãy thử nó trực tuyến!

Xuất ra \$n\$thuật ngữ thứ, được lập chỉ mục 1.

Khởi tạo chuỗi bằng \$a(0)=1\$cũng hoạt động, vì công thức sau đó cho \$a(1)=1\$như mong muốn. Biến Tbị ép buộc với số nguyên 1và chúng tôi áp dụng lặp lại một phiên bản nhỏ gọn hơn của công thức:

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

(với \$\mathbb I\$chức năng chỉ báo). Điều này bao gồm cả hai trường hợp của định nghĩa ban đầu.

8 user Nov 26 2020 at 00:20

APL (Dyalog Unicode) , 18 byte (SBCS)

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

Hãy thử nó trực tuyến!

Một hàm vừa đủ nhưng an toàn, xuất ra phần tử thứ n của dãy.


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

Đã lưu 1 byte nhờ @ Adám

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

Hãy thử nó trực tuyến!

Xuất ra phần tử thứ n của dãy. Tôi chỉ nhận ra rằng điều này sẽ không hoạt động nếu \$n = a(n-1)\$bởi vì nó nâng n lên thành sức mạnh của \$n - a(n-1)\$và nhân nó với \$a\$, mặc dù theo như tôi có thể nói , chức năng này hoạt động cho đến ít nhất 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 byte

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

Hãy thử nó trực tuyến!

  • Đầu ra chuỗi vô hạn.

Toán tử infix # tính toán số hạng tiếp theo, chúng tôi sử dụng nó để gấp tất cả các số nguyên dương [1 ..] nhưng sử dụng scanl1 để thay thế cho chúng tôi tất cả các bước.

7 DominicvanEssen Nov 26 2020 at 03:00

R , 41 byte

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

Hãy thử nó trực tuyến!

Buộc bản thân mình không nhìn vào câu trả lời R của Robin Ryder trước khi bắt đầu. Thật hạnh phúc là chúng tôi đã đưa ra các cách tiếp cận khác nhau cho nhau, mặc dù cả hai dường như (cho đến nay) đều có cùng độ dài tính bằng byte thật đáng tiếc đối với tôi thì cái của anh ấy giờ ngắn hơn 2 byte ...

7 ErikF Nov 26 2020 at 08:42

C (gcc) , 35 byte

Lấy chỉ số bắt đầu dựa trên 1 và trả về giá trị thứ n.

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

Hãy thử nó trực tuyến!

7 Razetime Nov 26 2020 at 10:53

Forth (gforth) , 82 byte

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

Hãy thử nó trực tuyến!

Xuất ra một chuỗi vô hạn, được phân tách bằng dấu cách.

7 NahuelFouilleul Nov 26 2020 at 00:02

Perl 5 -Minteger -061 , 36 , 27 byte

-9 byte nhờ @Abigail và @Sisyphus.

xuất ra một chuỗi vô hạn

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

Hãy thử nó trực tuyến!

7 JonathanAllan Nov 26 2020 at 02:15

Python 3.8+ ,  45  39 byte

-2 cảm ơn xnor ( while print(...)!=0:while[print(...)]:)
-4 cảm ơn 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

Một chương trình đầy đủ sẽ in \$a(n)\$ cho mọi số tự nhiên.

Hãy thử nó trực tuyến!


Là một hàm đệ quy, 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

Đã tiết kiệm được 3 byte nhờ @Neil

Trả về \$n\$-thứ hạn, 1-indexed.

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

Hãy thử nó trực tuyến!

6 Bubbler Nov 26 2020 at 13:49

Hệ số , 45 byte

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

Hãy thử nó trực tuyến!

Giảm thẳng. Lấy chỉ mục dựa trên 1 và trả về số hạng thứ n.

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

Fμ?*`÷<¹³)ḣ

Hãy thử nó trực tuyến!

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 byte

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

Hãy thử nó trực tuyến!

Làm nđầu vào và in nthmục trong danh sách.

5 ovs Nov 26 2020 at 04:58

05AB1E , 12 10 byte

In chuỗi vô hạn.

λN>₁N›i÷ë*

Hãy thử nó trực tuyến!

Đã nhận xét :

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

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

Hãy thử nó trực tuyến!

Thay vì sử dụng $[y>x;y;1%y], lập chỉ mục vào danh sách (1%y;y)bằng cách sử dụng điều kiện boolean y>xđể lưu một vài byte.

5 reffu Nov 27 2020 at 22:44

Forth (gforth) , 51 byte

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

Hãy thử nó trực tuyến!

Giải thích mã

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

Hãy thử nó trực tuyến!

Lưu ý: Cảm ơn @RedwolfPrograms cho -1 Byte và @user cho -10 (?) Byte.

4 cairdcoinheringaahing Nov 26 2020 at 00:39

Thạch , 11 byte

1’ß×:>@?$Ị?

Hãy thử nó trực tuyến!

Làm thế nào nó hoạt động

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 byte

⟦₁{÷ℕ₁|×}ˡ

Hãy thử nó trực tuyến!

Cung cấp danh sách singleton [1]thay vì 1cho n = 1, nhưng không có gì khác thường.

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

┅⟪<₌×/?⟫⊢

Hãy thử nó trực tuyến!

Về cơ bản giống với câu trả lời Jelly ngắn hơn. 1-indexed, các bản in a(n), mặc dù có thể được hoán đổi với để lấy các nphần tử đầu tiên .

		# 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 byte

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

Hãy thử nó trực tuyến! Không có bộ thử nghiệm vì cách tập lệnh sử dụng lịch sử. Giải trình:

K`_ _

Thay thế đầu vào bằng một cặp số 1 (theo đơn vị). Đầu tiên là chỉ số vòng lặp trong khi thứ hai là đầu ra.

"$+"+

Số nlần lặp lại .

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

Chia cả đầu ra và chỉ số vòng lặp cho chỉ số vòng lặp hoặc cho 1 nếu phép chia là 0.

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

Tăng chỉ số vòng lặp và nhân hai thương số với nhau. Điều này dẫn đến output/index*index/indexhoặc output/1*index/1tương ứng.

r`_\G

Chuyển đầu ra cuối cùng thành số thập phân.

4 640KB Nov 26 2020 at 03:19

PHP , 57 byte

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

Hãy thử nó trực tuyến!

4 Stephen Nov 26 2020 at 03:32

cQuents , 14 byte

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

Hãy thử nó trực tuyến!

Giải trình

=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

Cốt vợt , 66 byte

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

Hãy thử nó trực tuyến!

4 J42161217 Nov 26 2020 at 03:40

Ngôn ngữ Wolfram (Mathematica) , 40 byte

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

Hãy thử nó trực tuyến!

-2 byte từ @att

4 GalenIvanov Nov 26 2020 at 18:39

J , 21 byte

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

Hãy thử nó trực tuyến!

Một cổng J của giải pháp APL của @user - đừng quên ủng hộ nó!

4 KevinCruijssen Nov 27 2020 at 15:51

MathGolf , 11 9 byte

1k{î`<¿*/

-2 byte nhờ @ovs .

Xuất ra \$n^{th}\$ giá trị.

Hãy thử nó trực tuyến.

Giải trình:

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)