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ทำงานกับเป็นอาร์กิวเมนต์ที่สองและที่เพิ่มขึ้นaa