7 , 31 ตัวอักษร, คะแนน 30, ปลอดภัย แต่อาจหักได้หรือไม่
โดยปกติแล้วโปรแกรม 7 เป็นเพียงตัวเลข แต่มันสามารถมีช่องว่างแยกออกเป็นหลาย ๆ หมายเลขได้ ดังนั้นการส่งนี้ประกอบด้วยตัวเลขสองตัว (ซึ่งมีการเชื่อมต่อกันอย่างชัดเจนโดยล่าม 7 ตัว) และโปรแกรมก็ใช้ตัวเลขสองตัวเป็นอินพุตโดยใช้อินพุตมาตรฐาน ("31 ตัวอักษร" ในส่วนหัวคือความยาวทั้งหมดของตัวเลขสองตัวบวกหนึ่งตัวคั่นช่องว่างตัวเลขที่ประกอบเป็นตัวเลขจะถูกตีความว่าเป็นฐานแปดเมื่อใช้เป็นโปรแกรม แต่เป็นทศนิยมเมื่อใช้เป็นอินพุตและ เป็นตัวเลขที่เหมือนกันในสองกรณีไม่ใช่ตัวเลขจริงโปรดทราบว่ามันไม่เกี่ยวข้องอย่างใดอย่างหนึ่งเมื่อถือว่าเป็นโปรแกรมหรือเมื่อถือว่าเป็นข้อมูลเข้าไม่ว่าคุณจะแยกพวกเขาด้วยช่องว่างหรือขึ้นบรรทัดใหม่ฉันหวังว่ามันจะไม่ ไม่ทำให้การส่งเป็นโมฆะ)
ผลลัพธ์ที่คาดหวังคือตัวเลขต่อไปนี้ (แสดงที่นี่เป็นทศนิยมเนื่องจากเป็นรูปแบบเอาต์พุตที่ล่าม 7 รายใช้):
238363505302130098723162537059
โปรดทราบว่าล่าม 7 ตัวที่เชื่อมโยงจาก Esolang wiki เก็บหมายเลขไว้ภายในเป็นเอกภาพหมายความว่าคุณมีหน่วยความจำไม่เพียงพอที่จะเรียกใช้โปรแกรมได้ด้วยตัวเองเพื่อดูว่ามันทำอะไร ฉันตรวจสอบโปรแกรมผ่านการทำงานตามพฤติกรรมของตนเองและทดสอบในอินพุตขนาดเล็กเพื่อตรวจสอบว่ามันทำในสิ่งที่ฉันคาดไว้ อีกวิธีหนึ่งคือการเขียนล่ามที่ใช้วิธีการจัดเก็บตัวเลขที่มีประสิทธิภาพมากขึ้น
การหลีกเลี่ยงการแตกร้าวที่นี่เป็นสิ่งที่เจ็บปวด แต่ในที่สุดตอนนี้ฉันก็พอใจแล้วว่าไม่มีตัวเลขสองตัวที่นอกเหนือจากที่อยู่ในโปรแกรมสามารถสร้าง 238363505302130098723162537059 เป็นผลลัพธ์ ( แก้ไข 1 สัปดาห์ต่อมา: ฉันอาจจะผิดขึ้นอยู่กับว่าคุณตีความคำถามนั้นอย่างไรดูด้านล่าง )
สารละลาย
โปรแกรมเดิมคือ:
711170237403706
111723603700633
โปรแกรมนี้ใช้ตัวเลขสองตัวxและYและคำนวณผลลัพธ์ของนิพจน์3 x y- y- 2 (เช่นY( 3 x - 1 ) - 2 ) ถ้าเราดำเนินการคำนวณนี้ที่x = 711170237403706และY= 111723603700633 , เราได้รับผลจากการ238363505302130098723162537059ตามที่ต้องการ
มันตั้งใจที่จะไม่มีการป้อนข้อมูลอื่นจะให้ผลลัพธ์ที่ต้องการเพราะ:
อินพุตต้องถูกเลือกเช่นY( 3 x - 1 ) - 2 = 238363505302130098723162537059เช่นY( 3 x - 1 ) = 238363505302130098723162537061 (เพิ่ม 2 ทั้งสองด้าน) ตัวเลขนี้เป็นตัวเลข semiprime ที่มีเพียงสองปัจจัย: 111723603700633และ21335107122111172133510712211117มีเพียงหนึ่งในตัวเลขเหล่านี้2133510712211117เท่านั้นที่สามารถแสดงในรูปแบบ3 x - 1 (ให้( 3 × 711170237403706 ) - 1 = 2133510712211117 ) ดังนั้นเราสามารถระบุได้ว่าหมายเลขใดคือxและYซึ่งหมายความว่าอินพุตเดียวใช้ได้
อย่างไรก็ตามขึ้นอยู่กับวิธีที่คุณตีความคำถามอาจมีอินพุตที่สองที่สร้างเอาต์พุตที่ต้องการ (ดังนั้นการทำให้โซลูชันนี้ไม่ถูกต้อง):
น่าเสียดายที่มีพาร์ติชัน multiplicative ของ semiprime เป็นสองปัจจัยคือหนึ่งแบ่งเป็นสองปัจจัยหลัก แต่อีกพาร์ติชั่นหนึ่งคือพาร์ทิชันเล็ก ๆ ที่ประกอบด้วย1และจำนวนของมันเอง 1ไม่สามารถเขียนในรูปแบบ3 x - 1มีจำนวนเต็มxแต่เอาต์พุตที่ต้องการสามารถเป็นได้; จึงมีศักยภาพเมตาแตกเกี่ยวข้องกับการให้การป้อนข้อมูลที่เป็น79454501767376699574387512354และ11อย่างไรก็ตามตัวเลขแรกที่นี่เกี่ยวข้องกับอักขระ ( 8และ9) ซึ่งไม่ได้อยู่ในชุดอักขระสำหรับ 7 โปรแกรม ดังนั้นหากอินพุตถูก จำกัด ให้อยู่ในชุดอักขระเดียวกันกับโปรแกรมโซลูชันนี้จะใช้ได้ แต่ถ้าอนุญาตให้ป้อนข้อมูลด้วยอักขระจากภายนอกชุดอักขระของโปรแกรมโซลูชันนี้จะไม่ถูกต้อง
คำอธิบาย
นี่คือวิธีที่โซลูชันที่ตั้งใจทำงาน:
711170237403706 111723603700633
7 7 7 ตัวแยกองค์ประกอบสแต็ก
111 023 403706 111723603700633 องค์ประกอบสแต็กเริ่มต้น
111 หมายเลข 3 ด้วยกัน
023 I / O DSL สำหรับ "ใส่ตัวเลข"
403706 111723603700633 โปรแกรมหลัก
(โดยนัย: ดำเนินการสำเนาขององค์ประกอบหลักของโปรแกรมโดยเก็บรักษาต้นฉบับ)
40 สลับ {023} ด้านบน {โปรแกรม} หนีออกมา
3 I / O ใช้ {023} หรือไม่ ป๊อป {โปรแกรม}
0 I / O: ตัวเลข
23 ป้อนหมายเลขคัดลอก {111} หลายครั้ง
706 ต่อท้าย "6" ไปยังหมายเลข (ลดค่าลง)
11 ดันองค์ประกอบสแต็กสองอันที่ว่างเปล่า
17236 กดองค์ประกอบสแต็ก "23" (ไม่ใช้ Escape)
0 Escape {23} ใช้องค์ประกอบที่ว่างเปล่า
3 I / O ใช้ {23} หรือไม่ ป๊อป {องค์ประกอบด้านล่าง}
23 คัดลอกด้านบนของอินพุตสแต็กหลายครั้ง
7006 ต่อท้าย "66" (เช่นลบ 2)
3 เอาท์พุท {เป็นตัวเลข}
3 ออกจากโปรแกรม (เนื่องจากสแต็คเหลือน้อย)
7 ชั้นนำและ 3 ต่อท้ายไม่จำเป็นสำหรับการทำงานของโปรแกรมพวกเขาอยู่ที่นั่นเพียงเพื่อให้ได้ปัจจัยสำคัญของผลลัพธ์ที่ถูกต้อง ช่วยในการติดตามโปรแกรมนี้หากคุณเข้าใจรูปแบบตัวเลข ตัวเลขจะถูกเก็บไว้ในตัวแปรเอกที่1
และ7
เพิ่มมูลค่าโดยที่ 1 และ0
และ6
ลดค่าโดยที่ 1 (จึงผนวก66
ลดค่าลง 2, การทำซ้ำจำนวนคูณมัน, และอื่น ๆ ) อินพุตทำโดยการทำซ้ำองค์ประกอบสแต็ก (ดังนั้นหากองค์ประกอบสแต็กคือ12345
และอินพุตคือ3องค์ประกอบสแต็กใหม่จะเป็น123451234512345 )