순차적 곱셈


12

당신의 목표는 입력을 취하고 함께 연결될 때 N"순차 곱셈"을 수행 하는 프로그램을 작성하는 것입니다 . 순차적 곱셈이란 무엇입니까? a다음과 같이 정의 된 시드가있는 시퀀스입니다 .

f(0) = a
f(n+1) = f(n)*(f(n)-1)

따라서 a = 5. 따라서, f(0) = 5, f(1) = f(0)*(f(0)-1) = 5*4 = 20,와 f(2) = f(1)*(f(1)-1) = 20*19 = 380.

만약 당신의 프로그램이 있다면 ABC, ABC입력 a과 출력을 가져와야 f(1)합니다. 프로그램 ABCABC출력 f(2)등. 프로그램 시리즈는 한 번만 입력하고 한 번만 출력해야합니다.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다. 표준 허점은 금지되어 있습니다.

답변:


13

젤리, 3 바이트

×’$

온라인으로 사용해보십시오!

작동 원리

×’$    Main link (or part thereof). Argument (initially input): n

 ’     Compute n - 1.
×      Multiply n by (n - 1).
  $    Combine the previous two atoms into a monadic quicklink.

니핏 반복 N 배는 실행할 N 원하는 출력 결과 번.


4

정말 4 바이트

,;D*

설명:

,;D*
,     push input (NOP once input is exhausted)
 ;D   dupe and push n-1
   *  multiply
      (implicit output at EOF)

Dennis의 Jelly answer 에서처럼 이 프로그램 n시간을 반복하면 실행 시간이 발생합니다 n. 그것은 명령형 스택 기반 언어의 많은 장점 중 하나입니다.

온라인으로 사용해보십시오!


4

MATL, 3 바이트

tq*

당신은 할 수 있습니다 온라인으로보십시오! 기본적으로 심각하고 젤리 답변과 유사합니다. 먼저, 스택의 상단을 복제합니다 (스택이 비면 처음 입력하십시오). 스택의 상단을 줄이고 두 요소를 곱하여 다음 입력 또는 결과를 제공합니다.


4

파이썬 3, 56 바이트

+1if 0else 0
try:n
except:n=int(input())
n*=n-1
print(n)

출력 덮어 쓰기 속임수가없는 솔루션을 원했습니다. 후행 줄 바꿈이없는 것이 중요합니다.


첫 줄은 모두 1 번호입니까?
Seadrus

이 히트 할 때 숫자를 파싱 중지 @Seadrus 아니 파이썬 파서 일치되지 라이터 구, ifelse.
xnor

이것은 파이썬 2에서 더 짧을 것 입니다.
mbomb007

@ mbomb007 그것은 작동하지 않습니다, 인쇄가 제대로 처리되지 않으며 적어도 한 번 연결하면 추가 출력을 얻습니다.
FryAmTheEggman

아, 이것이 추가 출력이었습니다.
mbomb007

3

CJam, 5 바이트

r~_(*

온라인으로 사용해보십시오!

작동 원리

r     e# Read a whitespace-separated token from STDIN.
      e# This pushes the input (when called for the first time) or an empty string.
 ~    e# Evaluate.
      e# This turns the input into an integer or discards an empty string.
  _   e# Copy the top of the stack.
   (  e# Decrement.
    * e# Multiply.

3

pl, 5 바이트

_▼•=_

온라인으로 사용해보십시오.

게으르지 않고 "_에 할당"을 구현하지 않으면 4 바이트가됩니다 ...

설명

_▼•=_

_       push _ (input var)
 ▼      decrement last used var (_)
  •     multiply, since it is off by one it auto-adds _ to the arg list
   =_   assign result to _


2

GolfScript, 5 바이트

~.(*`

온라인으로 사용해보십시오.

골퍼 해제 및 댓글 달기 :

~    # Eval the input to turn it from a string into a number.
.    # Duplicate the number.
(    # Decrement one of the copies by one.
*    # Multiply the copies together.
`    # Un-eval the number, turning it back into a string.

GolfScript 인터프리터는 입력을 자동으로 읽고 스택에 배치하지만 숫자가 아닌 문자열로 배치합니다. 따라서을 사용하여 입력을 숫자로 ~바꾸고을 사용하여 다시 문자열 화해야합니다 `. 마지막으로, 인터프리터는 스택에 문자열로 된 숫자를 자동으로 인쇄합니다.

도전이 반복 있었다면 (이제 f(n+1) = f(n)*(-f(n)-1), 내가했던 수있는과에서 4 바이트 ~.~*.이 알아내는 어떻게 그리고 왜 작품 연습으로 남아 있습니다. :)


2

자바 스크립트 REPL, 25 20 바이트

a=prompt();
a*=a-1//

REPL 제거에 노력


이것은 어떻게 출력을 생성합니까?
Dennis

콘솔에서. 나는 그것을 고쳐야한다.
코너 오브라이언

콘솔은 괜찮습니다. js의 유효한 출력을 고려하십시오
Seadrus

오! 환상적인 !!
코너 오브라이언

2
@Seadrus 분명히 메타 컨센서스 ( 실제로 알지 못했던 것)에 따라 REPL 기반 환경은 REPL임을 명시하는 한 괜찮습니다.
Alex A.

2

루아, 35 18 바이트

루아가 한 번만 쉽게 할 수있는 일입니다!

편집 : 나는 이것을 한 이후 루아에서 많은 것을 발견 했으므로 그것을 업데이트하고 있습니다 :)

print(...*(...-1))

...는 압축을 푼 명령 행 인수를 포함하며,이 경우 확장이 불가능하므로 첫 번째 값을 사용하므로 인라인으로 인쇄 n*(n-1)됩니다.


1

Y , 7 바이트

jzC:t*!

여기 사용해보십시오!

작동 방식 j은 숫자 입력입니다. z암시 적 인쇄를 활성화합니다. C새로운 링크를 시작합니다. :스택의 값을 복제하고 t감소시켜 우리에게 남겨 둡니다 [a a-1]. 그런 다음에서 가져 [a*a-a]옵니다 *. !다음 명령을 건너 뜁니다. EOF에서는 아무것도하지 않습니다. 함께 연결되면 입력 명령을 건너 뛰고 프로세스가 다시 시작됩니다.




1

펄, 23 바이트

l;$_|=<>;$_*=~-$_;print

대체 버전, 10 바이트

$_*=~-$_;

-p스위치 가 필요합니다 . 그것이 질문 에서 공정한 게임인지 확실하지 않습니다 .


1

하스켈, 14 11 바이트

(*)=<<pred$

사용 예

Prelude> (*)=<<pred$5
20
Prelude> (*)=<<pred$(*)=<<pred$5
380
Prelude> (*)=<<pred$(*)=<<pred$(*)=<<pred$5
144020

어쩌면 이것은 올바른 기능이 아닐 수도 있습니다. nitpicking하는 경우 (*)=<<pred$id14 바이트 (<-끝에 공백이 있음)를 사용할 수 있습니다.

편집 : @ Zgarb는 monad 함수를 사용하여 함수를 다시 작성하고 3 바이트를 저장했습니다. 감사!


(*)=<<pred$3 바이트를 절약합니다. 또한 이것은 실제로 함수를 정의하는 것이 아니며 입력 값은 함수 바로 뒤에 위치해야합니다.
Zgarb 2019

@ Zgarb : 감사합니다! 추가 id하면 올바른 기능이됩니다. 답변에 메모를했습니다.
nimi


1

TI 기본, 6 5 바이트

TI-83 / 84 계산기에서 실행

:Ans²-Ans

이 프로그램은 프로그램의 마지막 줄에 일반 Done텍스트 대신 표현식이 인쇄되기 때문에 작동 합니다.


1
5 바이트 ::Ans²-Ans
lirtosiast 1

1

Mathcad, 39 "바이트"

여기에 이미지 설명을 입력하십시오

사용자 관점에서 Mathcad는 효과적으로 왼쪽에서 오른쪽으로, 위에서 아래로 평가되는 2D 화이트 보드입니다. Mathcad는 일반적인 "텍스트"입력을 지원하지 않지만 대신 텍스트와 특수 키 / 도구 모음 / 메뉴 항목의 조합을 사용하여 표현식, 텍스트, 플롯 또는 구성 요소를 삽입합니다. 예를 들어 ":"를 입력하여 정의 연산자 (화면에 ": ="로 표시), "["를 사용하여 배열 인덱스를 입력하거나 "ctl-]"을 입력하여 while 루프 연산자를 입력하십시오 ( 통제 조건과 하나의 신체 표현). 위 이미지에서 볼 수있는 것은 사용자 인터페이스에 표시되고 "입력 된"것으로 정확하게 나타납니다.

골프 목적으로 "바이트"수는 식을 입력하는 데 필요한 키보드 조작 수와 같습니다.

내가 더 확실하지 않은 한 가지는 ( "바이트"동등성 관점에서) 새 영역을 만드는 방법 (예 : a : = 5 또는 k : = 0..n-1)입니다. 줄 바꿈과 같은 새 영역으로의 각 이동을 같았으므로 1 바이트 (실제로 마우스를 사용하여 영역을 원하는 곳을 클릭하십시오).

주석은 포함하지 않고 활성 명령문 만 포함했으며 a 및 n 입력에 대해 각각 2 바이트를 포함했지만 값 자체는 포함하지 않았습니다 (예제에서는 5 및 7).


0

하스켈, 72 바이트

이 과제는 Haskell에게 친숙하지 않습니다. 그러나 입력이 단항이고 코드가 GHCI에서 실행되면 다음이 작동합니다.

(\x->if odd x then let y=until((>x).(10^))(+1)0 in y*(y-1)else x*(x-1))$

설명:

단항은 항상 홀수이므로 첫 번째 응용 프로그램은 10 진수로 변환됩니다. x*(x-1)는 항상 짝수이므로 그렇지 않으면 입력이있는 x*(x-1)곳을 반환합니다 x. Haskell은 강력하게 입력되고 '특수'기호는처럼 호출 될 수 없으므로 &1전역 변수 또는 더 이상한 입력 형식을 사용하지 않는 한 Haskell에서이를 완료하는 유일한 방법이라고 생각합니다.


0

C ++ (gcc) , 173/176 바이트

두 버전 모두 끝에 중요한 줄 바꿈이 있습니다.

매크로 버전, 173 바이트

#ifndef M
#define M(a,b)a##b
#define W(z,x)M(z,x)
#define B int W(m,__LINE__)=x++
#include<iostream>
int x,n;int main(){for(std::cin>>n;x--;)n*=n-1;std::cout<<n;}
#endif
B;

온라인으로 사용해보십시오!

템플릿 버전, 176 바이트

다소 C ++ ish :

#ifndef B
#define B template
#include<iostream>
int x,n;B<int N>struct A{static int i;};int main(){for(std::cin>>n;x--;)n*=n-1;std::cout<<n;}
#endif
B<>int A<__LINE__>::i=x++;

온라인으로 사용해보십시오!


0

해 학적 인-5 바이트

J?d?*

blsq ) 5 J?d?*
20
blsq ) 5 J?d?* J?d?*
380
blsq ) 5 J?d?* J?d?* J?d?*
144020
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.