n으로 곱하거나 나누기

Nov 26 2020

여기 간단한 도전이 있습니다. 많은 언어가 참여할 수 있기를 바랍니다.

양의 정수 \$n\$, 출력 \$A076039(n)\$로부터 OEIS .

즉, \로 시작합니다.$a(1)=1\$. 그런 다음 \$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. $$

테스트 사례 :

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

더 많은 테스트 케이스는 OEIS 페이지에서 찾을 수 있습니다.

일반적인 시퀀스 규칙에 따라 일반적으로 허용되는 방식으로 입력 및 출력 할 수 있습니다. 1- 또는 0 기반 인덱싱, 무한 시퀀스 출력, 첫 번째 \ 출력$n\$값, 출력 만 \$n^\text{th}\$ 값 등이 있지만 답변에 명시하십시오.

이것은 code-golf 이므로 각 언어에서 바이트 단위의 가장 짧은 코드가 이깁니다!

답변

15 JonathanAllan Nov 26 2020 at 01:35

젤리 , 6 바이트

R×:<?/

양의 정수를 받아들이는 모나 딕 링크, \$n\$, 양의 정수 \$a(n)\$.

온라인으로 시도하십시오! 또는 테스트 스위트를 참조하십시오.

어떻게?

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

최대 \ 까지 시퀀스 출력$a(n)\$ 와:

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

스크래치 3.0 29 개 27 블록 / 234 167 바이트

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)

처음부터 시도

일부 입력 / 출력 방법이 확실하지 않아서 안전하다고 생각하고 도우미 기능이있는 완전한 프로그램으로 만들었습니다.

이에 응답하여 내 계정이 "신규"에서 "표준"으로 승격 될 수 있었으므로 항상 재미 있습니다.

@att 덕분에 -67 바이트

13 RobinRyder Nov 26 2020 at 05:21

셰익스피어 프로그래밍 언어 , 221 바이트

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

온라인으로 시도하십시오!

무한 목록을 출력합니다. 그러나 출력 값 사이에는 구분 기호가 없으므로 출력을 읽기가 다소 어렵습니다.

구분 기호 (널 바이트)를 추가하려는 최선의 시도는 다음과 같습니다.

셰익스피어 프로그래밍 언어 , 297 바이트

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

온라인으로 시도하십시오!

11 Noodle9 Nov 26 2020 at 01:51

Python 2 , 47 43 39 바이트

xnor 덕분에 4 바이트 절약 !!! Neil
덕분에 4 바이트 절약 !!!

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

온라인으로 시도하십시오!

인쇄 \$\{a(n)\mid n \in \mathbb{N}\}\$ 무한 시퀀스로.

10 RobinRyder Nov 26 2020 at 00:55

R , 43 39 바이트

Giuseppe 덕분에 -4 바이트.

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

온라인으로 시도하십시오!

출력 \$n\$제 1 항, 1 인덱싱.

\로 시퀀스 초기화$a(0)=1\$또한 공식이 \$a(1)=1\$바라는대로. 변수 T는 integer로 강제 변환되며, 1더 간결한 공식 버전을 반복적으로 적용합니다.

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

( \$\mathbb I\$표시기 기능). 이것은 원래 정의의 두 경우를 모두 포함합니다.

8 user Nov 26 2020 at 00:20

APL (Dyalog Unicode) , 18 바이트 (SBCS)

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

온라인으로 시도하십시오!

시퀀스의 n 번째 요소를 출력하는 겨우 골프를 쳤지 만 안전한 함수입니다.


APL (Dyalog Unicode) , 15 14 바이트 (SBCS)

@ Adám 덕분에 1 바이트 절약

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

온라인으로 시도하십시오!

시퀀스의 n 번째 요소를 출력합니다. 난 그냥이 경우 작동하지 않습니다 실현 \$n = a(n-1)\$n을 \ 의 거듭 제곱하기 때문에$n - a(n-1)\$여기에 \를 곱합니다.$a\$, 내가 말할 수있는 한 ,이 함수는 적어도 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 바이트

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

온라인으로 시도하십시오!

  • 무한 시퀀스를 출력합니다.

중위 연산자 #는 다음 항을 계산합니다. 모든 양의 정수 [1 ..]를 접는 데 사용하지만 대신 scanl1을 사용하여 모든 단계를 제공합니다.

7 DominicvanEssen Nov 26 2020 at 03:00

R , 41 바이트

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

온라인으로 시도하십시오!

이 문제를 해결 하기 전에 Robin Ryder의 R 답변 을 보지 않도록 강요 했습니다. 다행히도 우리는 서로 다른 접근 방식을 생각해 냈습니다. 비록 둘 다 (지금까지) 정확히 같은 길이 인 것처럼 보이지만 슬프게도 그의 하나는 이제 2 바이트 더 짧습니다 ...

7 ErikF Nov 26 2020 at 08:42

C (gcc) , 35 바이트

1부터 시작하는 시작 인덱스를 취하고 n 번째 시퀀스 값을 반환합니다.

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

온라인으로 시도하십시오!

7 Razetime Nov 26 2020 at 10:53

Forth (gforth) , 82 바이트

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

온라인으로 시도하십시오!

공백으로 구분 된 무한 시퀀스를 출력합니다.

7 NahuelFouilleul Nov 26 2020 at 00:02

Perl 5 -Minteger -061 , 36 , 27 바이트

@Abigail 및 @Sisyphus 덕분에 -9 바이트.

무한 시퀀스를 출력

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

온라인으로 시도하십시오!

7 JonathanAllan Nov 26 2020 at 02:15

Python 3.8 이상 ,  45  39 바이트

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

\ 를 인쇄하는 전체 프로그램$a(n)\$ 모든 자연수에 대해.

온라인으로 시도하십시오!


재귀 함수로서 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 바이트

@Neil 덕분에 3 바이트 절약

\를 반환합니다.$n\$-th term, 1-indexed.

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

온라인으로 시도하십시오!

6 Bubbler Nov 26 2020 at 13:49

Factor , 45 바이트

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

온라인으로 시도하십시오!

간단한 축소. 1부터 시작하는 인덱스를 취하고 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 바이트

Fμ?*`÷<¹³)ḣ

온라인으로 시도하십시오!

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 바이트

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

온라인으로 시도하십시오!

소요 n입력으로하고, 인쇄 nth목록에서 항목을 선택합니다.

5 ovs Nov 26 2020 at 04:58

05AB1E , 12 10 바이트

무한 시퀀스를 인쇄합니다.

λN>₁N›i÷ë*

온라인으로 시도하십시오!

댓글 :

λ              # 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 바이트

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

온라인으로 시도하십시오!

를 사용하는 대신 부울 조건 을 사용하여 $[y>x;y;1%y]목록 (1%y;y)을 색인화 y>x하여 몇 바이트를 절약합니다.

5 reffu Nov 27 2020 at 22:44

Forth (gforth) , 51 바이트

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

온라인으로 시도하십시오!

코드 설명

: 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 바이트

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

온라인으로 시도하십시오!

참고 : -1 바이트에 대해 @RedwolfPrograms에 감사하고 -10 (?) 바이트에 대해 @user에게 감사드립니다.

4 cairdcoinheringaahing Nov 26 2020 at 00:39

젤리 , 11 바이트

1’ß×:>@?$Ị?

온라인으로 시도하십시오!

작동 원리

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 바이트

⟦₁{÷ℕ₁|×}ˡ

온라인으로 시도하십시오!

n = 1 [1]대신 싱글 톤 목록을 제공 1하지만 그렇지 않으면 평범하지 않습니다.

         ˡ    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 바이트

┅⟪<₌×/?⟫⊢

온라인으로 시도하십시오!

기본적으로 짧은 Jelly 답변과 동일합니다. 1 인덱싱, prints a(n), 대신 첫 번째 요소 를 얻기 위해 바꿀 수 있습니다 .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 바이트

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

온라인으로 시도하십시오! 스크립트가 히스토리를 사용하는 방식 때문에 테스트 스위트가 없습니다. 설명:

K`_ _

입력을 1 쌍 (단항)으로 바꿉니다. 첫 번째는 루프 인덱스이고 두 번째는 출력입니다.

"$+"+

루프 n시간.

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

출력과 루프 인덱스를 루프 인덱스로 나눕니다. 나눗셈이 0이면 1로 나눕니다.

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

루프 인덱스를 늘리고 두 몫을 함께 곱하십시오. 결과적으로 output/index*index/index또는 output/1*index/1각각.

r`_\G

최종 출력을 10 진수로 변환합니다.

4 640KB Nov 26 2020 at 03:19

PHP , 57 바이트

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

온라인으로 시도하십시오!

4 Stephen Nov 26 2020 at 03:32

cQuents , 14 바이트

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

온라인으로 시도하십시오!

설명

=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

라켓 , 66 바이트

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

온라인으로 시도하십시오!

4 J42161217 Nov 26 2020 at 03:40

Wolfram 언어 (Mathematica) , 40 바이트

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

온라인으로 시도하십시오!

@att에서 -2 바이트

4 GalenIvanov Nov 26 2020 at 18:39

J , 21 바이트

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

온라인으로 시도하십시오!

@user의 APL 솔루션 의 J 포트-upvote 하는 것을 잊지 마세요!

4 KevinCruijssen Nov 27 2020 at 15:51

MathGolf , 11 9 바이트

1k{î`<¿*/

-2 바이트 덕분에 @ovs .

출력 \$n^{th}\$ 값.

온라인으로 시도하십시오.

설명:

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)