罗格,310字节
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
,迫使我使用四个if语句
怎么运行的
罗格如何运作
关于语言如何工作的简短前言:一切都是赋值或函数,并且每个函数仅带有一个参数。对于需要多个参数(例如乘法)的操作,第一个调用返回一个部分函数,当再次使用第二个参数调用时,该函数返回预期的结果。例如:
left = Times[5];
Print[left[6]];
将打印出30:在线尝试!。尽管通常这比通常的方法更长,但是如果重复使用一个常量参数和一个更改参数(例如在打印时间表时)重复调用某个函数,则有时可以节省字节。
这个参数规则适用于所有不是常数或变量的事物,包括循环和条件。然而,循环和条件(For
,Each
,While
,DoWhile
,If
和IfElse
)是可行的,这意味着为了实际运行它们,该Do
函数必须被调用(见答案的最后一行)。同样,这可以在重复运行同一循环时节省字节,或者允许您在循环的定义和运行之间运行任意代码。
最后,有三种引用变量的方式,本程序都使用了所有这些方式。第一个是直接引用,其中变量名称以$
符号为前缀。这将直接访问变量的值并返回它。第二个是函数引用,它没有前缀字符。这使代码可以区分分配给变量的(可能是部分的)函数和包含特定值的实际变量。最后,以符号为前缀的间接引用@
会创建一个变量(如果尚不存在),并在给定范围内返回变量对象。这使您可以创建循环变量(例如i
中的for i in range(...)
)。
实际解决方案的工作原理
这是未启动的代码:
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
1个00 → 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
,并遇到四个if语句。每个语句检查是否x
分别等于1,2,3或4,且然后分配k
给每个功能*
,+
,-
和/
,然后使得它成为一个部分功能与e
作为其参数。最后,我们指定以为e
其k
运行a
的第二个参数,并增加a
。