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ステートメントを使用する必要があります
使い方
ラトガーの仕組み
言語がどのように機能するかについての簡単な序文:すべては代入または関数のいずれかであり、すべての関数は引数を1つだけ受け取ります。複数の引数を必要とする演算(乗算など)の場合、最初の呼び出しは部分関数を返し、2番目の引数で再度呼び出されると、期待される結果を返します。例えば:
left = Times[5];
Print[left[6]];
30を印刷します:オンラインで試してください!。通常、これは通常の代替手段よりも長いですが、たとえば時間テーブルを出力するときなど、1つの定数引数と1つの変更引数で関数が繰り返し呼び出されると、バイトを節約できる場合があります。
この1つの引数の規則は、ループや条件を含む、定数でも変数でもないすべてのものに適用されます。しかし、ループと条件は(For
、Each
、While
、DoWhile
、If
及びIfElse
)ですなんとか実際にそれらを実行するためには、つまり、Do
関数は(答えの最後の行を参照)を呼び出さなければなりません。繰り返しますが、これは同じループを繰り返し実行するときにバイトを節約したり、定義とループの実行の間で任意のコードを実行できるようにします。
最後に、変数を参照する3つの方法があり、そのすべてがこのプログラムで使用されます。1つは直接参照で、変数名の前に$
記号が付きます。これは変数の値に直接アクセスし、それを返します。2つ目は、機能参照です。これには、プレフィックス文字がありません。これにより、コードは変数に割り当てられた(潜在的に部分的な)関数と、特定の値を含む実際の変数を区別できます。最後に、シンボルを接頭辞とする間接参照@
は、変数を作成し(まだ存在しない場合)、特定のスコープ内の変数オブジェクトを返します。これは、(例えば、あなたがループ変数を作成することができます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];
オンラインでお試しください!
ご覧のとおり、入力、シーケンス内の変化する要素、新しい要素ごとの修正番号をそれぞれ表す3つの変数n
、e
およびを割り当てることから始めa
ます。次に、whileループを作成します。
w=While[{m=Modulo[$e];Not[m[1]];}];
中括弧({
および}
)はコードブロックを定義します。ブロック内の最後のステートメントは、whileループの条件です。この場合、部分モジュロ関数を定義することから始めます。これは、2番目の引数を受け取りm
、を返しe % m
ます。次に、この部分関数を呼び出します1 2番目の引数として、 0整数の場合、浮動小数点数の場合はゼロ以外の整数。次に、この論理ではなく、マッピングを計算します0 → 1 そして n → 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];}];
このループの主要な部分はforループで、反復します 4whileループの各反復の時間は、次の反復変数を持ち、それらx
で構成されます:
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
、ISは、それぞれ1、2、3または4に等しく、そして次に割り当てをk
各関数に*
、+
、-
そして/
次いで部分関数にそれを行い、e
引数として。最後に、私たちは、割り当てるe
ためにk
使用して実行a
2番目の引数、および増分としてa
。