n=e=$Input;
a=0;
w=While[{m=Modulo[$e];Not[m[1]];}];
w=w[{f=For[4];f=f[@x];f=f[{Print[$e];q=Equal[$x];i=If[{q[1];}];i=i[{k=Times[$e];}];Do[$i];i=If[{q[2];}];i=i[{k=Add[$e];}];Do[$i];i=If[{q[3];}];i=i[{k=Subtract[$e];}];Do[$i];i=If[{q[4];}];i=i[{k=Divide[$e];}];Do[$i];e=k[a=Increment[$a]];}];Do[$f];}];
Do[$w];
온라인으로 사용해보십시오!
Rutger를 다시 사용한 시간입니다. 불행히도, 형식이 없으므로 작업에 가장 적합한 언어가 아닐 수 eval
있으므로 4 개의 if 문을 사용해야합니다.
작동 원리
Rutger 작동 방식
언어의 작동 방식에 대한 간략한 서문 : 모든 것이 할당 또는 함수이며 모든 함수는 정확히 하나의 인수를 갖습니다. 둘 이상의 인수가 필요한 연산 (예 : 곱하기)의 경우 첫 번째 호출은 부분 함수를 반환하며 , 두 번째 인수로 다시 호출하면 예상 결과가 반환됩니다. 예를 들면 다음과 같습니다.
left = Times[5];
Print[left[6]];
30을 출력합니다 : 온라인으로 사용해보십시오! . 일반적으로 이것은 일반적인 대안보다 길지만 함수가 하나의 상수 인수와 하나의 변경 인수로 반복적으로 호출되는 경우 (예 : 시간 테이블을 인쇄 할 때) 바이트를 절약 할 수 있습니다.
이 하나의 인수 규칙은 루프 및 조건을 포함하여 상수 또는 변수가 아닌 모든 항목에 적용됩니다. 그러나, 루프와 조건문이 ( For
, Each
, While
, DoWhile
, If
과 IfElse
)이다 행할 실제로 실행하기 위해, 즉, Do
함수가 호출되어야합니다 (대답의 마지막 줄 참조). 다시 말하지만, 동일한 루프를 반복해서 실행할 때 바이트를 절약하거나 루프 정의와 실행 사이에 임의의 코드를 실행할 수 있습니다.
마지막으로, 변수를 참조하는 세 가지 방법이 있으며,이 방법은 모두이 프로그램에서 사용됩니다. 첫 번째는 직접 참조 이며 여기서 변수 이름 앞에 $
기호 가 붙습니다 . 변수의 값에 직접 액세스하여 반환합니다. 두 번째는 기능 참조 이며 접두사 문자가 없습니다. 이를 통해 코드는 변수에 할당 된 (잠재적으로 부분적인) 함수와 특정 값을 포함하는 실제 변수를 구별 할 수 있습니다. 마지막으로, 기호가 앞에 붙은 간접 참조@
는 변수가 존재하지 않는 경우 변수를 만들고 지정된 범위 내에서 변수 개체를 반환합니다. 이를 통해 루프 변수를 만들 수 있습니다 (예 : i
in for i in range(...)
).
실제 솔루션 작동 방식
ungolfed 코드는 다음과 같습니다.
n = elem = $Input;
var = 0;
while = While[{
mod = Modulo[$elem];
Not[mod[1]];
}];
while = while[{
for = For[4];
for = for[@index];
for = for[{
Print[$elem];
equal = Equal[$index];
if = If[{ equal[1]; }];
if = if[{ func = Times[$elem]; }];
Do[$if];
if = If[{ equal[2];}];
if = if[{ func = Add[$elem];}];
Do[$if];
if = If[{ equal[3];}];
if = if[{ func = Subtract[$elem];}];
Do[$if];
if=If[{ equal[4];}];
if=if[{ func = Divide[$elem];}];
Do[$if];
elem = func[var = Increment[$var]];
}];
Do[$for];
}];
Do[$while];
온라인으로 사용해보십시오!
보는 바와 같이, 상기 세 개의 변수를 할당함으로써 시작 n
, e
및 a
각각 각각의 새로운 요소는 입력 시퀀스 내의 변화 요소 및 변형을 나타낼 수있는. 그런 다음 while 루프를 만듭니다.
w=While[{m=Modulo[$e];Not[m[1]];}];
{
}
m
e % m
100 → 1n → 0 , n ≠ 0
다음으로 while 루프의 몸체로 구성된 절대적 괴물에 도달합니다 :
w=w[{f=For[4];f=f[@x];f=f[{Print[$e];q=Equal[$x];i=If[{q[1];}];i=i[{k=Times[$e];}];Do[$i];i=If[{q[2];}];i=i[{k=Add[$e];}];Do[$i];i=If[{q[3];}];i=i[{k=Subtract[$e];}];Do[$i];i=If[{q[4];}];i=i[{k=Divide[$e];}];Do[$i];e=k[a=Increment[$a]];}];Do[$f];}];
4x
Print[$e];
q=Equal[$x];
i=If[{q[1];}];i=i[{k=Times[$e] ;}];Do[$i];
i=If[{q[2];}];i=i[{k=Add[$e] ;}];Do[$i];
i=If[{q[3];}];i=i[{k=Subtract[$e] ;}];Do[$i];
i=If[{q[4];}];i=i[{k=Divide[$e] ;}];Do[$i];
e=k[a=Increment[$a]];
첫 번째 문장은 수정하기 전에 시퀀스의 각 반복을 인쇄합니다. 그런 다음 루프 변수와의 동등성을 검사 x
하고 4 개의 if 문을 발견 하는 부분 함수를 만듭니다 . 각 문장의 경우는 검사 x
되고, 각각 1, 2, 3 또는 4와 동일하고 양수인 k
각 기능에 *
, +
, -
및 /
다음으로 부분적으로 기능하게, e
인수로서. 마지막으로, 우리는 지정 e
하는 k
실행 a
두 번째 인자 및 증가로 a
.