n으로 곱하거나 나누기
여기 간단한 도전이 있습니다. 많은 언어가 참여할 수 있기를 바랍니다.
양의 정수 \$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 이므로 각 언어에서 바이트 단위의 가장 짧은 코드가 이깁니다!
답변
젤리 , 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×:<?\
스크래치 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 바이트
셰익스피어 프로그래밍 언어 , 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.
온라인으로 시도하십시오!
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}\}\$ 무한 시퀀스로.
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\$표시기 기능). 이것은 원래 정의의 두 경우를 모두 포함합니다.
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
Haskell , 40 바이트
a#n|n>a=a*n|1>0=a`div`n
a=scanl1(#)[1..]
온라인으로 시도하십시오!
- 무한 시퀀스를 출력합니다.
중위 연산자 #는 다음 항을 계산합니다. 모든 양의 정수 [1 ..]를 접는 데 사용하지만 대신 scanl1을 사용하여 모든 단계를 제공합니다.
R , 41 바이트
for(m in 1:scan())T=`if`(m>T,T*m,T%/%m);T
온라인으로 시도하십시오!
이 문제를 해결 하기 전에 Robin Ryder의 R 답변 을 보지 않도록 강요 했습니다. 다행히도 우리는 서로 다른 접근 방식을 생각해 냈습니다. 비록 둘 다 (지금까지) 정확히 같은 길이 인 것처럼 보이지만 슬프게도 그의 하나는 이제 2 바이트 더 짧습니다 ...
C (gcc) , 35 바이트
1부터 시작하는 시작 인덱스를 취하고 n 번째 시퀀스 값을 반환합니다.
f(i,j){i=i?i>(j=f(i-1))?j*i:j/i:1;}
온라인으로 시도하십시오!
Forth (gforth) , 82 바이트
: f 2dup 2dup > if * else swap / then dup . swap drop swap 1+ swap recurse ;
1 1 f
온라인으로 시도하십시오!
공백으로 구분 된 무한 시퀀스를 출력합니다.
Perl 5 -Minteger
-061
, 36 , 27 바이트
@Abigail 및 @Sisyphus 덕분에 -9 바이트.
무한 시퀀스를 출력
say$/while$/=$//++$i||$/*$i
온라인으로 시도하십시오!
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)
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
온라인으로 시도하십시오!
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
]
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
Perl 5 -Minteger -p
, 35 바이트
map$.=$_>$.?$.*$_:$./$_,2..$_;$_=$.
온라인으로 시도하십시오!
소요 n
입력으로하고, 인쇄 n
th
목록에서 항목을 선택합니다.
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
K (oK) , 22 20 바이트
{_x*(1%y;y)y>x}/1+!:
온라인으로 시도하십시오!
를 사용하는 대신 부울 조건 을 사용하여 $[y>x;y;1%y]
목록 (1%y;y)
을 색인화 y>x
하여 몇 바이트를 절약합니다.
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
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에게 감사드립니다.
젤리 , 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)
Brachylog , 10 바이트
⟦₁{÷ℕ₁|×}ˡ
온라인으로 시도하십시오!
n = 1 [1]
대신 싱글 톤 목록을 제공 1
하지만 그렇지 않으면 평범하지 않습니다.
ˡ Reduce
⟦₁ 1 .. n
{ } by:
÷ integer division
ℕ₁ if the result is 1 or greater,
|× multiplication if not.
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
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 진수로 변환합니다.
PHP , 57 바이트
function a($n){return$n?($n>$x=a($n-1))?$x*$n:$x/$n|0:1;}
온라인으로 시도하십시오!
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
라켓 , 66 바이트
(λ(n)(foldl(λ(x y)((if(< y x)* quotient)y x))1(range 1(+ 1 n))))
온라인으로 시도하십시오!
Wolfram 언어 (Mathematica) , 40 바이트
a@1=1;a@n_:=If[#<n,n#,⌊#/n⌋]&@a[n-1]
온라인으로 시도하십시오!
@att에서 -2 바이트
J , 21 바이트
[:(]<.@*[^*@-)/1+i.@-
온라인으로 시도하십시오!
@user의 APL 솔루션 의 J 포트-upvote 하는 것을 잊지 마세요!
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)