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];
Çevrimiçi deneyin!
Rutger'i tekrar kullanmamın zamanı geldi. Maalesef, görev için en iyi dil olmayabilir, çünküeval
beni dört if ifadesi kullanmaya zorluyor
Nasıl çalışır
Rutger nasıl çalışır?
Dilin nasıl işlediğine dair kısa bir önsöz: Her şey bir ödev veya bir işlevdir ve her işlev tam olarak bir argüman alır. Birden fazla argüman gerektiren işlemler için (örneğin çarpma), ilk çağrı , ikinci argümanla tekrar çağrıldığında beklenen sonucu veren kısmi bir işlev döndürür. Örneğin:
left = Times[5];
Print[left[6]];
30 yazdıracak: Çevrimiçi deneyin!. Bu genellikle normal alternatiften daha uzun olsa da, örneğin bir zaman çizelgesi yazdırırken bir işlev sürekli olarak bir sabit argümanla ve bir değişken argümanla çağrıldığında, baytları kaydedebilir.
Bu bir argüman kuralı, döngüler ve koşullamalar dahil, sabit veya değişken olmayan her şeye uygulanır. Ancak, döngüler ve koşul ( For
, Each
, While
, DoWhile
, If
ve IfElse
) olan yapılabilir aslında onları çalıştırmak için, yani Do
işlevi çağrılmalıdır (yanıtında son satırına bakınız). Yine, bu, aynı döngüyü tekrar tekrar çalıştırırken baytları kaydedebilir veya döngülerin tanımı ve çalışması arasında rasgele kod çalıştırmanıza izin verebilir.
Son olarak, tümü bu programda kullanılan değişkenlere atıfta bulunmanın üç yolu vardır. Bunlardan ilki, değişken isminin bir sembolle birlikte bulunduğu doğrudan referanstır$
. Bu doğrudan değişkenin değerine erişir ve onu döndürür. İkincisi, ön ek karakterine sahip olmayan işlevsel referanslamadır . Bu, kodun değişkenlere atanmış (potansiyel olarak kısmi) fonksiyonlarla belirli bir değer içeren gerçek değişkenler arasında ayrım yapmasını sağlar. Son olarak, bir sembolle önceden eklenmiş dolaylı referanslama , @
bir değişken yaratır (eğer mevcut değilse) ve değişken nesnesini belirli bir kapsam dahilinde döndürür. Bu, bir döngü değişkeni oluşturmanıza olanak sağlar (örn i
.for i in range(...)
).
Gerçek çözüm nasıl çalışır?
İşte kodlanmamış kod:
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];
Çevrimiçi deneyin!
Görüldüğü gibi, bu üç değişken atayarak başlar n
, e
ve a
sırasıyla her bir yeni elemanı için giriş, sırayla değişen elemanı ve modifikasyon sayısını temsil eder, hangi. Daha sonra bir süre döngüsü yaratırız:
w=While[{m=Modulo[$e];Not[m[1]];}];
Parantezler ( {
ve }
) bir kod bloğu tanımlar ; burada bloktaki son ifade, while döngüsü için koşuldur. Bu durumda, ikinci bir argüman alacak, kısmi bir modulo işlevi tanımlayarak başlıyoruz m
ve geri dönüyoruz e % m
. Daha sonra bu kısmi işlevi şöyle adlandırırız:1 ikinci argüman olarak, dönen 0tamsayılar ve değişkenler için sıfır olmayan bir tamsayı. Daha sonra bunun mantıksal değil, eşlemesini hesaplıyoruz0 → 1 ve n → 0 , n ≠ 0.
Sonra while döngüsünün vücudundan oluşan mutlak canavarlığa geliyoruz:
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];}];
Bu döngünün birincil kısmı yinelenen bir for döngüsüdür 4while döngüsünün her yinelemesinde, yinelemeli değişkene sahiptir x
ve şunlardan oluşur:
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]];
İlk ifade, değiştirilmeden önce dizinin her yinelemesini yazdırır. Daha sonra loop değişkeniyle eşitliği kontrol etmek için kısmi bir fonksiyon yaratır x
ve if if ifadeleriyle karşılaşırız. Her ifade eder, eğer x
, sırasıyla 1, 2, 3 ya da 4'e eşit, ve daha sonra temlik k
her bir fonksiyon için *
, +
, -
ve /
daha sonra kısmi işlev yapar, e
bağımsız değişken olarak. Son olarak, atamak e
için k
birlikte çalışacak a
ikinci argüman ve artıma göre a
.