Rutgerขนาด 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
บังคับให้ฉันใช้สี่ข้อความหาก
มันทำงานอย่างไร
Rutger ทำงานอย่างไร
คำนำสั้น ๆ เกี่ยวกับวิธีการทำงานของภาษา: ทุกอย่างเป็นงานที่ได้รับมอบหมายหรือฟังก์ชั่นและทุกฟังก์ชั่นใช้เวลาหนึ่งอาร์กิวเมนต์ที่แน่นอน สำหรับการดำเนินการที่ต้องการอาร์กิวเมนต์มากกว่าหนึ่งตัว (เช่นการคูณ) การเรียกครั้งแรกจะส่งกลับฟังก์ชันบางส่วนซึ่งเมื่อถูกเรียกอีกครั้งด้วยอาร์กิวเมนต์ที่สองจะส่งคืนผลลัพธ์ที่คาดหวัง ตัวอย่างเช่น:
left = Times[5];
Print[left[6]];
จะพิมพ์ออก 30: ลองออนไลน์! . แม้ว่าโดยปกติแล้วจะมีความยาวมากกว่าทางเลือกปกติ แต่บางครั้งก็สามารถบันทึกไบต์ได้หากฟังก์ชันถูกเรียกซ้ำ ๆ ด้วยอาร์กิวเมนต์คงที่หนึ่งรายการและอาร์กิวเมนต์ที่เปลี่ยนแปลงหนึ่งรายการเช่นเมื่อพิมพ์ตารางเวลา
กฎข้อโต้แย้งนี้ใช้กับทุกสิ่งที่ไม่ใช่ค่าคงที่หรือตัวแปรรวมถึงลูปและเงื่อนไข อย่างไรก็ตาม loops และเงื่อนไข ( For
, Each
, While
, DoWhile
, If
และIfElse
) มีความเป็นไปได้ซึ่งหมายความว่าในการทำงานจริงพวกเขาDo
ฟังก์ชั่นจะต้องเรียกว่า (ดูบรรทัดสุดท้ายในคำตอบ) อีกครั้งนี้สามารถบันทึกไบต์เมื่อเรียกใช้วนซ้ำเดียวกันหรืออนุญาตให้คุณเรียกใช้รหัสโดยพลการระหว่างคำจำกัดความและการทำงานของลูป
สุดท้ายมีสามวิธีในการอ้างถึงตัวแปรซึ่งทั้งหมดนี้ใช้ในโปรแกรมนี้ สิ่งแรกคือการอ้างอิงโดยตรงโดยที่ชื่อตัวแปรจะขึ้นต้นด้วย$
สัญลักษณ์ การเข้าถึงค่าของตัวแปรโดยตรงและส่งกลับ ที่สองคือการอ้างอิงการทำงานซึ่งไม่มีตัวอักษรนำหน้า สิ่งนี้อนุญาตให้โค้ดแยกความแตกต่างระหว่างฟังก์ชั่น (อาจเป็นบางส่วน) ที่กำหนดให้กับตัวแปรและตัวแปรจริงที่มีค่าเฉพาะ ในที่สุดการอ้างอิงทางอ้อมนำหน้าด้วย@
สัญลักษณ์สร้างตัวแปร (หากยังไม่มีอยู่) และส่งคืนวัตถุตัวแปรภายในขอบเขตที่กำหนด สิ่งนี้ช่วยให้คุณสร้างตัวแปรลูป (เช่นi
ใน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
ซึ่งเป็นตัวแทนของการป้อนข้อมูลองค์ประกอบการเปลี่ยนแปลงในลำดับและจำนวนการปรับเปลี่ยนสำหรับแต่ละองค์ประกอบใหม่ตามลำดับ จากนั้นเราจะสร้างลูปสักครู่:
w=While[{m=Modulo[$e];Not[m[1]];}];
วงเล็บปีกกา ( {
และ}
) กำหนดบล็อกของรหัสที่คำสั่งสุดท้ายในบล็อกเป็นเงื่อนไขสำหรับห่วงในขณะที่ ในกรณีนี้เราจะเริ่มต้นด้วยการกำหนดฟังก์ชั่นแบบโมดูโลบางส่วนซึ่งจะใช้เวลาในอาร์กิวเมนต์ที่สองและผลตอบแทนm
e % m
จากนั้นเราเรียกฟังก์ชันนี้บางส่วนด้วย1 เป็นอาร์กิวเมนต์ที่สองส่งคืน 0สำหรับจำนวนเต็มและจำนวนเต็มที่ไม่ใช่ศูนย์สำหรับการลอย จากนั้นเราคำนวณตรรกะที่ไม่เกี่ยวกับเรื่องนี้การจับคู่0 → 1 และ n → 0 , n ≠ 0.
ต่อไปเรามาถึงความประหลาดประหลาดที่แน่นอนซึ่งประกอบด้วยร่างกายของ while loop:
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];}];
ส่วนหลักของการวนซ้ำนี้เป็นการวนซ้ำซึ่งวนซ้ำ 4คูณการวนซ้ำของ while loop แต่ละครั้งมีตัวแปรการวนซ้ำของ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
และพบคำสั่งสี่รายการ แต่ละคำสั่งการตรวจสอบหากx
มีค่าเท่ากับ 1, 2, 3 หรือ 4 ตามลำดับและจากนั้นได้รับมอบหมายk
ให้แต่ละฟังก์ชั่นใน*
, +
, -
และ/
แล้วทำให้มันเป็นฟังก์ชั่นบางส่วนกับe
เป็นอาร์กิวเมนต์ของมัน สุดท้ายเรากำหนดe
ที่จะk
ทำงานกับเป็นอาร์กิวเมนต์ที่สองและที่เพิ่มขึ้นa
a