Cubix, 33 32 ไบต์
u*.$s.!(.01I^<W%NW!;<,;;q+p@Opus
รูปแบบสุทธิ:
u * .
$ s .
! ( .
0 1 I ^ < W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
ลองออนไลน์!
หมายเหตุ
- ทำงานร่วมกับอินพุตถึงและรวมถึง 170 อินพุตที่สูงขึ้นส่งผลให้เกิดการวนซ้ำไม่สิ้นสุดเนื่องจากแฟคทอเรียลให้ผลกับ
Infinity
ตัวเลข (ในทางเทคนิคแล้วมันเป็นคุณสมบัติที่ไม่สามารถเขียนได้เขียนได้ไม่นับไม่ได้
- ความแม่นยำจะหายไปสำหรับอินพุต 19 และสูงกว่าเนื่องจากตัวเลขที่สูงกว่า 2 53 (= 9 007 199 254 740 992) ไม่สามารถจัดเก็บใน JavaScript ได้อย่างถูกต้อง
คำอธิบาย
โปรแกรมนี้ประกอบด้วยสองลูป ตัวแรกจะคำนวณแฟคทอเรียลของอินพุตส่วนอีกอันจะแยกผลลัพธ์ออกเป็นตัวเลขและรวมเข้าด้วยกัน จากนั้นผลรวมจะถูกพิมพ์และโปรแกรมจะเสร็จสิ้น
เริ่มต้น
อันดับแรกเราต้องเตรียมสแต็ก สำหรับส่วนนั้นเราใช้สามคำสั่งแรก IP เริ่มต้นที่บรรทัดที่สี่ชี้ไปทางทิศตะวันออก สแต็กว่างเปล่า
. . .
. . .
. . .
0 1 I . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
เราจะเก็บผลรวมไว้ที่ด้านล่างสุดของสแต็กดังนั้นเราต้องเริ่มต้นด้วย0
การหาผลรวมโดยจัดเก็บที่ด้านล่างของสแต็ก จากนั้นเราจำเป็นต้องกด a 1
เนื่องจากอินพุตจะถูกคูณด้วยหมายเลขก่อนหน้านั้น หากนี่เป็นศูนย์แฟคทอเรียลจะให้ผลเป็นศูนย์เสมอ สุดท้ายเราอ่านอินพุตเป็นจำนวนเต็ม
ตอนนี้สแต็คคือ[0, 1, input]
และ IP อยู่ที่บรรทัดที่สี่คอลัมน์ที่สี่ชี้ไปทางทิศตะวันออก
ห่วงแฟคทอเรียล
นี่คือลูปแบบง่ายที่คูณสององค์ประกอบบนสุดของสแต็ก (ผลลัพธ์ของลูปก่อนหน้าและอินพุต - n และจากนั้นจะลดอินพุตมันจะแตกเมื่ออินพุตถึง 0 $
คำสั่งจะทำให้ IP ข้ามu
- เทิร์นวนลูปเป็นส่วนต่อไปนี้ของคิวบ์ IP เริ่มที่บรรทัดที่สี่คอลัมน์ที่สี่
u * .
$ s .
! ( .
. . . ^ < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
เนื่องจาก^
ตัวละคร IP เริ่มเคลื่อนที่ไปทางเหนือทันที จากนั้นu
จะหมุน IP ไปรอบ ๆ และเลื่อนไปทางขวา ที่ด้านล่างมีลูกศรอื่น: ชี้กลับเข้าไปในทรัพย์สินทางปัญญา<
^
สแต็กเริ่มต้น[previousresult, input-n]
โดยที่n
จำนวนของการวนซ้ำ อักขระต่อไปนี้ถูกดำเนินการในลูป:
*s(
* # Multiply the top two items
# Stack: [previousresult, input-n, newresult]
s # Swap the top two items
# Stack: [previousresult, newresult, input-n]
( # Decrement the top item
# Stack: [previousresult, newresult, input-n-1]
จากนั้นด้านบนของสแต็ค (ลดลงการป้อนข้อมูล) จะตรวจสอบกับ0
โดย!
การเรียนการสอนและถ้ามันเป็น0
ที่u
ตัวละครข้าม
รวมตัวเลข
IP ล้อมรอบลูกบาศก์จบลงด้วยอักขระตัวสุดท้ายในบรรทัดที่สี่โดยเริ่มจากชี้ไปทางทิศตะวันตก ลูปต่อไปนี้ประกอบด้วยอักขระที่เหลืออยู่ทั้งหมด:
. . .
. . .
. . .
. . . . . W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
การวนซ้ำจะลบรายการบนสุดออกจากสแต็ก (ซึ่งเป็นอย่างใดอย่างหนึ่ง10
หรือ0
) จากนั้นตรวจสอบสิ่งที่เหลืออยู่ของผลลัพธ์ของแฟคทอเรียล หากสิ่งนั้นถูกลดขนาดลงไป0
ด้านล่างของสแต็ก (ผลรวม) จะถูกพิมพ์และโปรแกรมจะหยุด มิฉะนั้นคำแนะนำต่อไปนี้จะได้รับการดำเนินการ (สแต็คเริ่มต้นเป็น[oldsum, ..., factorial]
):
N%p+q;;,s;
N # Push 10
# Stack: [oldsum, ..., factorial, 10]
% # Push factorial % 10
# Stack: [oldsum, ..., factorial, 10, factorial % 10]
p # Take the sum to the top
# Stack: [..., factorial, 10, factorial % 10, oldsum]
+ # Add top items together
# Stack: [..., factorial, 10, factorial % 10, oldsum, newsum]
q # Send that to the bottom
# Stack: [newsum, ..., factorial, 10, factorial % 10, oldsum]
;; # Delete top two items
# Stack: [newsum, ..., factorial, 10]
, # Integer divide top two items
# Stack: [newsum, ..., factorial, 10, factorial/10]
s; # Delete the second item
# Stack: [newsum, ..., factorial, factorial/10]
และลูปเริ่มต้นอีกครั้งจนกระทั่งfactorial/10
เท่ากับ 0
n>21