Pure Sourcery - สร้างโปรแกรมที่ส่งออกตัวเลข 0 ถึง 9


21

นี่คือตัวอักษรแบบพิกเซล 5 คูณ 7 สำหรับตัวเลข 0 ถึง 9:

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(แบบอักษรนี้และหน้านี้อาจจะดูดีขึ้นหากคุณเรียกใช้รหัส JavaScipt นี้ในคอนโซลเบราว์เซอร์ของคุณหรือในแถบ URL นำหน้าด้วยjavascript:: $('#question pre,.answer pre').css('line-height',1).)

เขียนบล็อกสี่เหลี่ยมที่มีขนาดเท่ากันสองอันหนึ่งอันเพื่อเป็นตัวแทนของช่องว่าง ( .) ในแบบอักษรด้านบนและอีกอันหนึ่งเพื่อเป็นตัวแทนของช่องว่างที่เต็มไป ( )

เมื่อบล็อกข้อความทั้งสองนี้ถูกจัดเรียงในรูปแบบ 5 × 7 เดียวกับหนึ่งในตัวเลขข้างต้นบล็อกข้อความขนาดใหญ่ที่ได้ควรเป็นโปรแกรมที่พิมพ์ตัวเลขนั้นเป็น stdout สิ่งนี้น่าจะใช้ได้กับเลข 10 หลักทั้งหมด

ตัวอย่างเช่นหาก.บล็อกข้อความของคุณเป็น

---
'''

และบล็อคข้อความของคุณคือ

ABC
123

จากนั้นโปรแกรม

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

0เอาท์พุทควร ในทำนองเดียวกันโปรแกรม

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

ควรส่งออก1และอื่น ๆ จนถึงโปรแกรมสำหรับ9ขึ้นอยู่กับโปรแกรมสำหรับ

คุณสามารถใช้ส่วนย่อยสแต็คนี้เพื่อสร้างโปรแกรมที่มีรูปร่างหลัก:

<style>textarea{font-family:monospace;}</style><script>function go(){var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");for(var e=document.getElementById("empty").value.split("\n"),n=document.getElementById("filled").value.split("\n"),l=[],o=0;o<7*e.length;o++){l[o]="";for(var d=0;5>d;d++)l[o]+=font[t][Math.floor(o/e.length)][d]?n[o%n.length]:e[o%e.length]}document.getElementById("output").value=l.join("\n")}font=[[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,0,1,0,0],[1,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,0,0,1,0],[1,0,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,0,1,0]],[[1,1,1,1,1],[1,0,0,0,0],[1,0,0,0,0],[0,1,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]]]</script><textarea id='empty' rows='8' cols='32' placeholder='empty space text block...'></textarea><textarea id='filled' rows='8' cols='32' placeholder='filled space text block...'></textarea><br>Digit <input id='digit' type='text' value='0'> <button type='button' onclick='go()'>Generate</button><br><br><textarea id='output' rows='16' cols='64' placeholder='output...' style='background-color: #eee;' readonly></textarea>

รายละเอียด

  • ไม่มีโปรแกรมบล็อกข้อความขนาดใหญ่ 10 รายการที่ควรมีการป้อนข้อมูล ออกเฉพาะตัวเลขหลักเดียวบวกกับขึ้นบรรทัดใหม่ที่เป็นตัวเลือก ส่งออกไปยัง stdout หรือทางเลือกที่คล้ายกัน
  • ไม่มีโปรแกรมใดที่สามารถอ่านหรือเข้าถึงซอร์สโค้ดของตนเองได้ รักษาเช่นนี้อย่างเคร่งครัดควินท้าทาย
  • บล็อคข้อความอาจไม่เหมือนกันและต้องมีขนาดที่ไม่ใช่ศูนย์
  • บล็อกข้อความอาจจะมีตัวอักษรใด ๆ ยกเว้นจุดสิ้นสุดบรรทัด
  • โปรแกรม 10 โปรแกรมนั้นต้องเป็นโปรแกรมที่เขียนด้วยภาษาเดียวกันไม่ใช่โปรแกรมตัวอย่างของREPL คุณสามารถเลือกที่จะเพิ่มการขึ้นบรรทัดใหม่ต่อท้ายทั้งหมดหรือไม่ก็ได้

เกณฑ์การให้คะแนน

คะแนนของคุณคือพื้นที่ (ความสูงคูณความกว้าง) ของหนึ่งในบล็อคข้อความของคุณ (มีขนาดเท่ากันดังนั้นจึงไม่มีจุดในการนับทั้งสองช่วง) พื้นที่ของตัวอย่างคือ 3 คูณ 2 สำหรับคะแนน 6

คะแนนต่ำสุดชนะ ในกรณีที่มีความสัมพันธ์กันคำตอบที่ได้รับคะแนนสูงสุดจะเป็นผู้ชนะ


ในรหัสของคุณคุณสามารถปรับปรุงได้มาก var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");สามารถเขียนเป็นvar t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");ซึ่งเหมือนกัน แต่สั้นกว่า มีอีกสองสามสิ่งที่คุณสามารถปรับปรุงได้ แต่มันก็ดูดี!
Ismael Miguel

4
@IsmaelMiguel TBH ฉันใส่มันผ่าน minifier JS เพื่อรับมันในหนึ่งบรรทัด มันไม่เคยตั้งใจจะตีกอล์ฟ
งานอดิเรกของ Calvin

โอ้เพื่อน ... นั่นขี้เกียจนิดหน่อย ... ในคำถามเกี่ยวกับการเล่นกอล์ฟคุณโพสต์รหัสที่ไม่ใช่กอล์ฟ ... แต่เดี๋ยวก่อนฉันเข้าใจแล้วและฉันเพิ่งพูดถึงสิ่งนี้ คุณไม่ต้องทำตามสิ่งที่ฉันพูด แต่มันเป็นสิ่งที่ดีที่จะทำ
Ismael Miguel

6
@IsmaelMiguel ฉันโพสต์รหัสโปรแกรมอรรถประโยชน์ ungolfed ซึ่งเนื้อหาควรจะอ่านได้มากที่สุดเพื่อให้จุดบกพร่องง่ายต่อการมองเห็น แต่จริงๆแล้วตราบใดที่มันใช้งานได้ขนาดของโค้ดสแต็กจะมีผลเป็นศูนย์อย่างแท้จริงต่อผลลัพธ์ของการท้าทาย
งานอดิเรกของ Calvin

3
text blocks may not be identicalจริงๆ? ฉันต้องการเห็นใครบางคนทำผิดกฎนี้โดยให้ codeblocks ที่เหมือนกันสองตัวซึ่งส่งกลับตัวเลขที่แตกต่างกันอย่างน่าอัศจรรย์เมื่อทุก ๆ หมายเลขนั้นเป็นรหัสเดียวกัน ^^
Falco

คำตอบ:


13

CJam, 20 18 14 13 12 * 1 = 12

ลองออนไลน์: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

บล็อกว่างเปล่า

];BG*K+ :BD%

บล็อกทึบ

];B9+33%:B4/

คำอธิบาย

ฉันใช้กลยุทธ์ที่คล้ายคลึงกับโซลูชันของ Sp3000ซึ่งแต่ละบล็อกทำการคูณการบวกและการปฏิบัติการแบบโมดูโลบนตัวแปรและบันทึกค่ากลับ เพื่อหาทางออกที่ดีที่สุดฉันใช้กำลังดุร้ายอันเก่า ฉันเขียนโปรแกรมที่ค้นหาพื้นที่ของค่าเริ่มต้นที่เป็นไปได้ทั้งหมด (ค่าเริ่มต้นของตัวแปร CJam) และฟังก์ชั่นการแปลงคู่ที่เป็นไปได้หลายล้านคู่เช่นผลลัพธ์สำหรับรูปแบบตัวเลขทุกรูปแบบนั้นไม่ซ้ำกัน จากนั้นฉันกรองผลลัพธ์สำหรับแบบที่ผลลัพธ์สุดท้ายสำหรับแบบฟอร์มหลักที่ลงท้ายด้วยบล็อกว่างซึ่งมี 8 สามารถแมปกลับไปยังผลลัพธ์ที่ถูกต้องผ่านสูตรคูณเพิ่มและโมดูโลอื่นได้

หลังจากสองสามวันของเวลา CPU ในการค้นหาผลลัพธ์ที่ดีที่สุดจนถึงขนาด 12! การแก้ปัญหานี้เริ่มต้นด้วยค่าของ11ฟังก์ชั่นการเปลี่ยนแปลงบล็อกที่ว่างเปล่าเป็นx * 16 + 20ฟังก์ชั่นผลบล็อกที่ว่างเปล่าเป็นx % 13ฟังก์ชั่นการเปลี่ยนแปลงบล็อกที่เป็นของแข็งและฟังก์ชั่นที่มั่นคงผลบล็อก(x + 9) % 33x / 4


23

> <> (ปลา) 5 * 10 = 50

บล็อกว่างเปล่า

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

บล็อกทึบ

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

รหัสนี้ไม่มีตรรกะหรือเลขคณิตเพียงใช้การเปลี่ยนเส้นทางแบบคงที่ของตัวชี้คำสั่ง 2D (IP) กับ <'> ของ' กับ 'มิเรอร์' ( /และ\) และ 'ลูกศร' สองตัว ( <และv ) อีกตัวควบคุมการไหลอื่น ๆ คือ 'trampoline' ( !) ซึ่งกระโดดผ่านตัวละครถัดไป

IP เริ่มจากมุมบนซ้ายมุ่งหน้าไปทางทิศตะวันออก หลังจากการเปลี่ยนเส้นทางไปถึงตัวเลขจะถูกส่งไปยังสแต็กและพิมพ์ออกมาพร้อมกับnโปรแกรมสิ้นสุดลงด้วย;และสิ้นสุดโปรแกรมด้วย

โปรแกรมโฟลว์

บล็อก 'รับรู้' สถานะปัจจุบันของโปรแกรมจากข้อเท็จจริงที่ว่าจุดใดที่ IP เข้ามาและขึ้นอยู่กับสถานะที่จะตัดสินใจว่าทิศทางใดที่มันควรจะปล่อยให้ตัวชี้ (บล็อกที่ควรจะดำเนินการต่อไป) และตำแหน่งที่แน่นอน ตัวชี้ควรจะไปทางซ้าย (ซึ่งจะเป็นสถานะใหม่) แน่นอนว่าบล็อคไม่ได้ใช้ตรรกะใด ๆ พฤติกรรมทั้งหมดนี้มาจากตัวเปลี่ยนเส้นทาง


ฉันหวังว่าจะได้รับคำตอบเช่นนี้ เวทมนต์บริสุทธิ์
EagleV_Attnam

11

CJam, 23 22 19 * 1 = 19

บล็อกว่างเปล่า:

];G)B%:G"73860594"=

บล็อกของแข็ง:

];GW*B+3*D%:G    7-

ลองมันออนไลน์

ฉันพยายามที่จะโชคดีกับความบังเอิญทางคณิตศาสตร์และความล้มเหลวดังนั้นนี่เป็นวิธีที่แตกต่างกันเล็กน้อยในการทำแผนที่ที่เป็นเอกลักษณ์จากโซลูชันของ Martin

เริ่มต้นด้วย 16. บล็อกว่างเปล่าเพิ่ม 1 และนำโมดูโล 11 บล็อกทึบคูณด้วย -1, เพิ่ม 11, คูณด้วย 3 แล้วใช้โมดูโล 13 แล้วแผนที่อันน่าอัศจรรย์นี้03456789(ตัวเลขที่ลงท้ายด้วยบล็อกว่างเปล่า) ไป41753026ซึ่งเราใช้การจัดทำดัชนี เพื่อให้ถูกต้อง 12แผนที่เรียบร้อย89ซึ่งเราสามารถแก้ไขได้โดยการลบ 7


7

CJam, 28 27 x 1 = 27

นี่คือจุดเริ่มต้น

บล็อกว่างเปล่า

U):U;                       

บล็อกทึบ

];U):UW+:WF%"1302986_7_54"=

ทดสอบที่นี่ฉันไม่สามารถให้โค้ด Permalink แก่คุณได้เนื่องจากรหัสนั้นยาวเกินไปดังนั้นคุณจะต้องคัดลอกโค้ดด้วยตนเองจากข้อมูลโค้ดในการท้าทาย

ความคิดคือการแฮชรูปร่างดังต่อไปนี้:

  • สำหรับแต่ละ "พิกเซล" เพิ่มเคาน์เตอร์ Uเพิ่มเคาน์เตอร์
  • สำหรับ "พิกเซล" สีดำแต่ละอันUให้รวมเป็นยอดรวมW(ซึ่งเริ่มต้นที่-1) ในตอนท้ายเราใช้โมดูโล่นี้15ซึ่งเกิดขึ้นเพื่อให้ผลลัพธ์ที่ไม่ซ้ำกันซึ่งใช้เพื่อจัดทำดัชนีลงในสตริงการค้นหา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.