เคล็ดลับการตีกอล์ฟใน 05AB1E


28

คุณมีเคล็ดลับสำหรับการเล่นใน05AB1Eภาษากอล์ฟที่สร้างโดยAdnanหรือไม่?

เคล็ดลับของคุณควรเป็นอย่างน้อยสำหรับ 05AB1E

กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ


2
จากการทบทวน: คำถามเคล็ดลับอยู่ในหัวข้อ
mbomb007

คำตอบ:


20

เนื่องจากมันไม่ได้เป็นส่วนหนึ่งของWiki ในหน้า GitHub ของ 05AB1E (ฉันคิดว่ามันควรจะเป็น) ฉันเพิ่งจะเพิ่มที่นี่เดี๋ยวนี้เพื่อให้ฉันเข้าใจตัวเองดีขึ้น

วิธีใช้พจนานุกรม

05AB1E มีคำต่อไปนี้ไฟล์พจนานุกรม exมีคำทั้งหมดที่รู้ แต่เราจะเข้าถึงคำศัพท์ในพจนานุกรมนี้ได้อย่างไร ลองมาคำ"testing"เป็นตัวอย่าง:

"testing"สามารถพบได้ในแถว 1453 ของไฟล์พจนานุกรม เนื่องจากสองบรรทัดแรกไม่ใช่คำและเราต้องการคำที่มีการจัดทำดัชนี 0 เราจึงลบ 3
ดังนั้นตอนนี้เรามีดัชนี ( 1450) แต่ใช้อย่างไร

เราเปิดและเริ่มสตริงบีบอัดด้วย† จากนั้นเราจะดูที่คอลัมน์ที่สองของไฟล์ info.txt (เช่นคือ 00; คือ 01; ฯลฯ )
ในกรณีของความ"testing"หมายนี้î(14) และ»(50)

"testing"ดังนั้นจึงบีบอัดสตริงสำหรับ: “ ลองออนไลน์ เช่นเดียวกับชิ้นส่วนของรหัส 05AB1E เกือบทั้งหมดการติดตามจะเป็นตัวเลือกหากคุณไม่ได้เข้าถึงสตริงดังนั้นจึงไม่มีงานในกรณีนี้

บางสิ่งที่ควรทราบ:

ตัวละครทุกตัวที่ไม่มีดัชนีในไฟล์ info.txt สามารถใช้งานได้ตามปกติ สิ่งนี้มีประโยชน์สำหรับการเพิ่มการsส่งออกเป็นพหูพจน์แทนคำเอกพจน์หรือใช้เครื่องหมายวรรคตอน,.?!เช่น
ÿ(การแก้ไขสตริง) ยังสามารถใช้เมื่อคุณต้องการแทรกค่าจากสแต็กภายในสตริง
หมายเหตุ: ตัวละครที่หลวมทุกตัวที่ไม่มีดัชนีในไฟล์ info.txt จะนับเป็นคำสำหรับประเภทการบีบอัดด้านล่าง

มีหลายประเภทที่แตกต่างกันของสายการบีบอัดคุณสามารถใช้เป็น:

  • ': ใช้คำที่ถูกบีบอัดเดียวตามที่เป็นอยู่ (ไม่'จำเป็นต้องมีการลาก) - 'î»: "การทดสอบ"
  • : ใช้คำที่ถูกบีบอัดสองคำพร้อมตัวคั่นช่องว่าง (ไม่ต้องต่อท้าย) - „î»î»: "การทดสอบทดสอบ"
  • : ใช้คำที่ถูกบีบอัดสามคำพร้อมตัวคั่นช่องว่าง (ไม่จำเป็นต่อท้าย) - …î»î»î»: "การทดสอบทดสอบทดสอบ"
  • : ใช้สตริงที่บีบอัดด้วยตัวคั่นช่องว่าง - “î»î»“: "การทดสอบทดสอบ"
  • : ใช้สตริงที่บีบอัดตามที่เป็นโดยไม่มีช่องว่างโดยนัย - ’î»î»’: "การทดสอบทดสอบ"
  • : ใช้สตริงที่บีบอัดในหัวเรื่อง - ตัวพิมพ์ด้วยตัวคั่นช่องว่าง - ”î»î»”: "การทดสอบการทดสอบ"
  • : ใช้สตริงที่บีบอัดเป็นตัวพิมพ์ใหญ่แบบเต็มพร้อมตัวคั่นช่องว่าง - ‘î»î»‘: "การทดสอบการทดสอบ"

ต่อไปนี้เป็นโปรแกรมที่มีประโยชน์ในการรับสตริงที่ถูกบีบอัดโดยอิงจากคำที่เว้นวรรคด้วยคำ:

'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,

ลองออนไลน์

โปรแกรมนี้จะ:

  1. ใช้อินพุตเป็นตัวพิมพ์เล็กลบอักขระที่ไม่ใช่ตัวอักษรใด ๆ (ยกเว้นช่องว่าง) แล้วแยกคำด้วยช่องว่าง ( lAð«Ã#) หรือตัดคำในรายการหากมีเพียงคำเดียวที่ป้อนเข้า ( ¸˜)
  2. วนรอบแต่ละคำ ( vyU)
  3. จากนั้นมีลูปด้านในของแต่ละคำที่บีบอัดจากพจนานุกรม ( "€...ï"Dâvy) ซึ่งจะพยายามเรียกใช้เป็นโปรแกรม 05AB1E ( "“ÿ“".V)
  4. และถ้ามันเท่ากับคำปัจจุบันมันจะพิมพ์ออกมาและทำลายวงใน XlQiy?1#

ด้วยการป้อนข้อมูลการส่งออกจึงจะเป็นgood bye world ลองออนไลน์“‚¿Þ¡‚ï“

หมายเหตุ: คุณยังคงต้องดูว่าคำนั้นอยู่ในพจนานุกรมหรือไม่เพื่อให้เครื่องกำเนิดนี้ทำงานได้และจะไม่สนใจอักขระพิเศษหรือคำพหูพจน์ใด ๆ จะพบเฉพาะคำที่เหมือนกันทั้งหมดในพจนานุกรม

นี่คือตัวอย่างที่ฉันใช้…Ÿ™‚ï!สำหรับสตริง "hello world!" และ’‚¿Þ¡ ÿ ‚ï!’สำหรับสตริง "ลาก่อนÿโลก!" โปรดสังเกตว่าการใช้ช่องว่างและเครื่องหมายอัศเจรีย์เป็นอย่างไรเนื่องจากไม่มีดัชนีในไฟล์ info.txt นอกจากนี้ยังใช้ÿเพื่อแทรก "ความโหดร้าย" ที่อยู่ด้านบนสุดของสแต็กซึ่งน่าเสียดายที่ไม่ได้เป็นส่วนหนึ่งของพจนานุกรม (แต่ยังคงถูกบีบอัดโดยใช้วิธีการที่ส่วนด้านล่าง)

จะบีบอัดสตริงที่ไม่ได้เป็นส่วนหนึ่งของพจนานุกรมได้อย่างไร?

แม้ว่าไฟล์ดิกชันนารี word.ex นั้นค่อนข้างใหญ่ (10,000 คำที่แน่นอน) แต่ก็สามารถเกิดขึ้นได้ว่าคุณต้องการคำที่ไม่ได้เป็นส่วนหนึ่งของมันหรือสตริงที่เป็นแค่พูดพล่อยๆธรรมดา ดังนั้นมีวิธีการบีบอัดเหล่านั้นเช่นกัน?
มีแน่นอนคือโดยใช้.•ซึ่งเป็นสตริงที่บีบอัดฐาน 255 ตัวอักษร หมายเหตุ: วิธีนี้สามารถใช้ได้กับตัวละครในตัวอักษรตัวพิมพ์เล็กและช่องว่างเท่านั้น

นี่เป็นโปรแกรมที่มีประโยชน์ในการแปลงคำ / สตริงเป็นสตริงพื้นฐานที่บีบอัด 255 ตัวอักษร:

vAyk})> 27β 255B ".•ÿ•"

ลองออนไลน์ .

สิ่งที่โปรแกรมนี้ทำคือ:

  • vAyk})>: ทำดัชนีตัวอักษร 1 ดัชนีของตัวอักษรแต่ละตัวของอินพุตโดยช่องว่างกลายเป็นดัชนี 0
  • 27β: แปลงดัชนีเหล่านี้จากฐาน 27 เป็นหมายเลขเดียว
  • 255B: แปลงหมายเลขนี้เป็น Base-255 โดยใช้หน้ารหัสของ 05AB1E
  • ".•ÿ•": วางส่วนนำหน้า.•และส่วนท้ายก่อนสตริงการบีบอัดนี้

นี่คือตัวอย่างคำตอบที่@Kaldoใช้.•zíΘ•ในการบีบอัดคำว่า "goose"

วิธีการบีบอัดจำนวนเต็มขนาดใหญ่?

สมมติว่าเราต้องการใช้ตัวเลขจำนวนมากสำหรับบางสิ่ง แต่ไม่สามารถเรียกคืนได้โดยการคำนวณแบบใช้เงิน ตัวอย่างเช่นสมมติว่าเราต้องการเข้าถึงจำนวนเต็มขนาดใหญ่18238098189071058293ด้วยเหตุผลใดก็ตาม

ในกรณีนี้เราสามารถใช้ทั้งชั้นนำและต่อท้ายในการบีบอัดตัวเลขในรูปแบบ จำนวนตัวอย่างข้างต้นจะกลายเป็น ลองออนไลน์ อีกครั้งเช่นเดียวกับสตริงพจนานุกรมอัดท้ายสามารถเลือกที่จะลบออก[1-9][0-9]+
•15Y₁Ò'Θpc•

อีกทางเลือกหนึ่งเมื่อจำนวนเต็มน้อยพอที่จะใช้อักขระที่บีบอัด 2 ตัวเท่านั้นเราสามารถใช้Žแทนได้ซึ่งในกรณีนี้เราไม่จำเป็นต้องใช้ไบต์ต่อท้ายเพื่อปิดมันและจำนวนเต็มจะถูกบีบอัดเป็น 3 ไบต์แทน 4 สำหรับ ตัวอย่างจำนวนเต็ม13562จะส่งผล•rl•ให้ แต่เนื่องจากมันใช้เพียงสองตัวอักษรจึงสามารถŽrlแทน

นอกจากนี้ตัวเลขในช่วง[101, 355]สามารถบีบอัดได้ 2 ไบต์โดยใช้Ƶบวกกับอักขระเพิ่มเติมจากเพจรหัสของ 05AB1E ดังนั้นสำหรับตัวอย่างเช่นสามารถใช้สำหรับจำนวนเต็มƵ– ที่นี่ภาพรวมของตัวเลขที่มีอยู่ทั้งหมด อักขระเหล่านี้ถูกแปลงจาก Base-255 เป็น Base-10 และเพิ่ม 101 แล้ว (เนื่องจากตัวเลขในช่วงนั้นมี 1 หรือ 2 ไบต์แล้ว)250[0,100]

วิธีการเหล่านี้15Y₁Ò'Θpcและrlสร้างอย่างไร ง่ายมากตัวเลขจะถูกแปลงเป็น Base-255 โดยใช้เพจรหัสของ 05AB1E เพื่อให้คุณสามารถใช้โปรแกรมดังต่อไปนี้จะได้รับจำนวนบีบอัดซึ่งก็จะใช้Ƶ., Ž..หรือ•...•ขึ้นอยู่กับขนาดของจำนวนเต็มบีบอัด:

101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"

ลองออนไลน์

นี่คือคำตอบตัวอย่างที่@Emignaใช้สำหรับจำนวนเต็ม•3Èñ•246060

วิธีการบีบอัดรายการจำนวนเต็ม?

บางครั้งคุณต้องการบีบอัดรายการจำนวนเต็มทั้งหมดแทนที่จะเป็นตัวเลขเดียว ตัวอย่างเช่นสมมติว่าเราต้องการรายการ[5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]ด้วยเหตุผลใดก็ตาม ในกรณีนี้เราสามารถใช้สิ่งต่อไปนี้แทน: •4βŸ{©£MG]q‡dZΘp•94в ลองออนไลน์

นี่เป็นโปรแกรมที่มีประโยชน์ในการสร้างทั้งจำนวนที่บีบอัดและฐานที่เราต้องการแปลง:

Z>© β 255B ®s"•ÿ•ÿв"

ลองออนไลน์

สิ่งที่โปรแกรมนี้ทำคือ:

  • Z>: รับจำนวนสูงสุด + 1 ของรายการอินพุต ( ©: และเก็บไว้ในการลงทะเบียน)
  • β: แปลงรายการอินพุตจากฐานmax+1เป็นหมายเลขเดียว
  • 255B: บีบอัดหมายเลขเดียวนี้ (อย่างที่เราทำในส่วนด้านบน)
  • ®s"•ÿ•ÿв": ส่งคืนผลลัพธ์ในรูปแบบ: นำหน้า, จำนวนที่บีบอัด, สูงสุด + 1, การติดตามв

ที่นี่คำตอบตัวอย่างที่ผมใช้ในการบีบอัดรายการ•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в [85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
PS: ในคำตอบนี้•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ôเป็นทางเลือกที่เท่ากับไบต์ (57) เนื่องจากตัวเลขทั้งหมดมีตัวเลขสองหลัก ในบางกรณี (โดยเฉพาะรายการขนาดเล็ก) สิ่งนี้อาจเป็นทางเลือกที่สั้นกว่า

การบีบอัดจำนวนเต็มเทียบกับการบีบอัดรายการจำนวนเต็ม:

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

[44, 59]( ใช้ในคำตอบของ@Emigna นี้ ):

  • •A–•60в คือ 7 ไบต์ (สร้างโดยตัวสร้างรายการจำนวนเต็มที่บีบอัด)
  • •H|•2ôหรือ•H|•2äหรือฮาร์ดโค้ด44 59‚ทั้งหมด 6 ไบต์
  • ŽH|2ôหรือŽH|2äมีขนาดทั้ง 5 ไบต์
  • แต่ในกรณีนี้„,;Çด้วย 4 ไบต์จะเป็นตัวเลือกที่ดีที่สุด (codepoints ของตัวอักษร ',' และ ';')

[2,4,6,0]( ใช้ในคำตอบของ@Emigna นี้ ):

  • •3ā•7в คือ 6 ไบต์ (สร้างโดยตัวสร้างรายการจำนวนเต็มที่บีบอัด)
  • Ž3ā7в คือ 5 ไบต์
  • แต่ในกรณีนี้Ž9¦Sด้วย 4 ไบต์จะเป็นตัวเลือกที่ดีที่สุด (จำนวนเต็มบีบอัด 2460 ไปยังรายการตัวเลข)

10101001100101001( ใช้ในคำตอบของฉัน ):

  • •a½₄Ƶ6®í• คือ 9 ไบต์ (สร้างโดยเครื่องกำเนิดจำนวนเต็มขนาดใหญ่ที่บีบอัด)
  • •1∊}•2вJ คือ 8 ไบต์ (สร้างโดยตัวสร้างรายการจำนวนเต็มแบบบีบอัดพร้อมเพิ่มการรวม)
  • แต่ในกรณีนี้ที่•1∊}•bมี 6 ไบต์จะเป็นตัวเลือกที่ดีที่สุด (รายการจำนวนเต็มที่ถูกบีบอัดด้วย a ถึงไบนารีแทนซึ่งเข้าร่วมโดยปริยาย)

[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]( ใช้ในคำตอบของฉัน ):


12

อินพุตโดยนัย

ย้อนกลับไปในวันที่เปิดตัว 05AB1E การป้อนข้อมูลโดยนัยนั้นค่อนข้างใหม่และแฟนซี ทุกวันนี้ดูเหมือนว่ามีความจำเป็นเพื่อติดตามภาษาแข่งขันอื่น ๆ (เช่น Jelly, MATL, Pyth, ฯลฯ )

ตัวอย่างเช่นเมื่อคุณต้องการเพิ่มตัวเลขสองตัวคุณสามารถทำได้II+:

I    # Input_1.
 I   # Input_2.
  +  # Add them up.

ทดสอบที่นี่


อย่างไรก็ตามการใช้อินพุตโดยปริยายเราสามารถย่อให้เหลือเพียง 1 ไบต์คือ+:

+    # Take two numbers implicitly and add them up.

ทดสอบที่นี่


สิ่งนี้จะเกิดขึ้นเมื่อความยาวของสแต็กน้อยกว่า arity ของผู้ปฏิบัติงาน 3+ตัวอย่างสุดท้ายคือ arity ของ+โอเปอเรเตอร์คือ2ในขณะที่มีเพียง1องค์ประกอบในสแต็ก:

3    # Push the number 3 on top of the stack.
 +   # Request implicit input and add to the 3.

ทดสอบที่นี่


8

สตริง

£เป็นคำสั่งสำหรับการถ่ายครั้งแรกที่ตัวละครของสตริงb อดีต:a
"hello_world"5£ -> "hello"

แต่ถ้าbเป็นรายการดัชนีมันจะแยกสตริงออกเป็นส่วนต่าง ๆ ของ (ไม่เกิน) ขนาดนั้น
อดีต: "hello_world"5L£ -> ['h', 'el', 'lo_', 'worl', 'd']


8

ตัวแปรที่กำหนดไว้ล่วงหน้า

พวกมันถูกซ่อนอยู่ใน 05AB1E เล็กน้อย นี่คือรายการของตัวแปรที่กำหนดไว้ล่วงหน้าทั้งหมด:

  • ¾ผลักดัน0ถ้า counter_variable ไม่เปลี่ยนแปลงก่อนคำสั่งนี้
  • Xผลัก1ถ้าตัวแปร X Uจะไม่มีการเปลี่ยนแปลงก่อนที่คำสั่งนี้กับ
  • Yผลัก2ถ้าตัวแปร Y Vจะไม่มีการเปลี่ยนแปลงก่อนที่คำสั่งนี้กับ
  • ®ผลักถ้าลงทะเบียนจะไม่เปลี่ยนแปลงก่อนที่คำสั่งนี้กับ-1©
  • ¯กด[](อาร์เรย์ว่าง) หากไม่มีการเพิ่มอะไรลงใน global_array ก่อนคำสั่งนี้
  • ¸กด[""]ที่สแต็กเปล่าถ้าไม่มีอินพุต (ขอบคุณ @Emigna สำหรับการค้นหาอันนี้)

24
¾pushes 0 => นั่นเป็นเรื่องเกี่ยวกับความทรงจำที่ไม่ได้รับ
Fatalize

6
@ กระชับ: 0 ก็กด 0 เช่นกัน ¾ผลักดันตัวแปรเคาน์เตอร์ซึ่งจะเริ่มต้นเป็น 0 ถ้าคุณเพียงต้องการที่จะผลักดัน 0, 0 เป็นหลักสูตรที่เป็นธรรมชาติมากขึ้น แต่ถ้าคุณต้องการที่จะผลักดัน5,0,7, 5¾72 5 0 7ไบต์สั้นกว่า
Emigna

7
ย้อนกลับไปในวันของฉัน¾ตั้งใจ.75และฉันเคยเอาชนะ Pyth ด้วยความจริงนั้น ภาษาที่เล่นกอล์ฟที่ขึ้นใหม่เหล่านี้ไม่มีเงื่อนงำเกี่ยวกับความจำ ...
ETHproductions

31
ไม่ทราบว่าคุณกำลังพูดถึงอะไร: p. print(3 / 4)ในหลาม 2 0ให้ฉัน
Adnan

2
ถ้าที่จุดเริ่มต้นผลักดันM -Inf
mbomb007

7

การใช้ Canvas ( Λหรือ)

เนื่องจากมันไม่ได้เป็นส่วนหนึ่งของเอกสารและ@Adnanในขณะนี้ค่อนข้างยุ่งเกินไปที่จะเขียนมันฉันจึงขออนุญาตให้เพิ่มมันเป็นเคล็ดลับที่นี่ตอนนี้

สามารถใช้ฟังก์ชัน Canvas ( Λหรือ) เพื่อวาดเส้น ASCII บนหน้าจอ มันมีสามพารามิเตอร์ที่ต้องการ:

  • a Length: ขนาดของบรรทัด นี่อาจเป็นจำนวนเต็มเดียวหรือรายการจำนวนเต็ม
  • b String: ตัวละครที่เราต้องการแสดง นี่อาจเป็นอักขระตัวเดียวสตริงรายการอักขระหรือรายการสตริง (ในสามกรณีสุดท้ายจะใช้อักขระทั้งหมดทีละตัวรวมถึงการล้อมรอบ)
  • cทิศทาง: ทิศทางที่อักขระบรรทัดควรวาดโดยทั่วไปเรามีตัวเลข[0,7]สำหรับเส้นทางซึ่งเราสามารถใช้หนึ่งหรือหลาย นอกจากนี้ยังมีตัวเลือกพิเศษบางอย่างที่ต้องใช้อักขระบางตัว (เพิ่มเติมเกี่ยวกับเรื่องนั้นในภายหลัง)

[0,7]แผนที่ทิศทางหลักไปยังทิศทางต่อไปนี้:

7   0   1
  ↖ ↑ ↗
6 ← X → 2
  ↙ ↓ ↘
5   4   3

ตัวอย่าง 05AB1E บางคำตอบที่ใช้ Canvas:

ลองทำสิ่งที่คล้ายกันเป็นตัวสุดท้ายดังนั้นให้เราใช้Λฟังก์ชั่นCanvas กับพารามิเตอร์สามตัวต่อไปนี้:

  • a :[3,3,5,5,7,7,9,9]
  • :!@#
  • :[0,2,4,6]

สิ่งนี้จะให้ผลลัพธ์ต่อไปนี้:

  !@#!@#!
  #     @
  @ #!@ #
  ! @ # !
  # ! ! @
  @   @ #
  !#@!# !
        @
@!#@!#@!#

ลองออนไลน์

แล้วมันทำงานอย่างไร ต่อไปนี้เป็นขั้นตอนที่มีอินพุตเหล่านี้ด้านบน:

  1. วาด3ตัวละคร ( !@#) ขึ้นไป (ทิศทาง0)
  2. วาด3-1อักขระ ( !@) ไปทางขวา (ทิศทาง2)
  3. วาด5-1ตัวละคร ( #!@#) ลงด้านล่าง (ทิศทาง4)
  4. วาด5-1อักขระ ( !@#!) ไปทางซ้าย (ทิศทาง6)
  5. วาด7-1ตัวละคร ( @#!@#!) ขึ้นไป (ทิศทาง0)
  6. วาด7-1อักขระ ( @#!@#!) ไปทางขวา (ทิศทาง2)
  7. วาด9-1ตัวละคร ( @#!@#!@#) ลงด้านล่าง (ทิศทาง4)
  8. วาด9-1อักขระ ( !@#!@#!@) ไปทางซ้าย (ทิศทาง6)

-1จะมีเพราะเส้นทับซ้อน ดังนั้นสองขั้นตอนแรกคือ:

#
@
!

และ

 !@

ซึ่งรวมกันคือ:

#!@
@
!

หมายเหตุเล็กน้อย:

  • นอกเหนือจากตัวเลือก[0,7]แล้วยังมีตัวเลือกเฉพาะสองสามตัวให้เลือกซึ่งโดยทั่วไปแล้วจะแปลไปยังลำดับทิศทาง
  • Canvas ในตัวโดยนัยจะเพิ่มช่องว่างต่อท้ายเพื่อให้เอาต์พุตเป็นสี่เหลี่ยม
  • Λออกจะทันทีและส่งผลสตริงที่จะถูกผลักไปยังกองซึ่งเรายังคงสามารถกลับมาใช้แก้ไขและทำอะไรกับที่เราต้องการต้องการ ตัวอย่างบางส่วน:

1
ฉันไม่ทราบด้วยซ้ำว่า 05AB1E มีผ้าใบ!
MilkyWay90

คุณคิดยังไงดีล่ะ? รหัสแหล่งที่มา?
Magic Octopus Urn

1
@MagicOctopusUrn ส่วนใหญ่มาจากคำตอบของ @Adnan นี้ (PS: คำตอบล่าสุดของเขาก็อธิบายได้ดีเช่นกัน ) สำหรับ+×8ฉันได้ดูแน่นอนในรหัสที่มา
Kevin Cruijssen

5

ป๊อปหรือรับ

เช่นเดียวกับในภาษาอื่น ๆ ที่ใช้สแต็คฟังก์ชั่นของ 05AB1E มักจะป๊อป (กิน) อินพุตของพวกเขาจากสแต็กและส่งเอาต์พุตไปยังสแต็ก

อย่างไรก็ตามฟังก์ชั่นบางอย่างได้รับอินพุตจากสแต็กโดยไม่ต้องใช้มัน ตัวอย่างคือheadฟังก์ชั่น¬ซึ่งสร้างองค์ประกอบแรกจากรายการอินพุต ดูตัวอย่างโปรแกรมได้ที่นี่: ¬+. เพิ่มหมายเลขแรกของรายการอินพุตให้กับแต่ละหมายเลขของรายการนั้น

หากต้องการทราบว่าฟังก์ชั่นป๊อปและที่ได้รับการดูที่คอลัมน์สอดคล้องกันในแฟ้มข้อมูลฟังก์ชั่น


@NeilA ขอบคุณ! อัปเดตลิงก์แล้ว
Luis Mendo

3

เงื่อนไขและลูป

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

ตัวอย่างเช่นโปรแกรมนี้ที่ไม่ได้รับการสร้างรายการnหมายเลขเฉพาะแรกไม่จำเป็นต้องปิดวงเล็บ [¹¾Q#NpiNˆ¼

แต่ถ้าเราต้องการที่จะดำเนินการบางอย่างในรายการผลลัพธ์ตัวอย่างเช่นการ delta ของเราจะต้องปิดวงก่อน [¹¾Q#NpiNˆ¼]¯¥


3

เคล็ดลับการตีกอล์ฟ05AB1Eขนาดเล็ก

จะขยายสิ่งนี้ด้วยเคล็ดลับการเล่นกอล์ฟเล็ก ๆ ที่ฉันได้เรียนรู้ไปพร้อมกัน (เพิ่งเริ่มต้น 05AB1E เป็นการส่วนตัวเท่านั้น)

  • D(ซ้ำ) และÐ(เพิ่มขึ้นสามเท่า) ร่วมกับs(แลกเปลี่ยน) และŠ(สาม-swap a,b,cไปc,a,b) มักจะสั้นกว่าการใช้©(บันทึกในglobal_variable ) และ®(การผลักดันglobal_variable ) ภายในลูป สิ่งนี้ช่วยประหยัดไบต์ในคำตอบของฉันนี้และสองคำตอบของฉันนี้
  • ½(ถ้า 1 แล้วเพิ่มcounter_variableโดย 1) ไม่จำเป็นในตอนท้ายของ a µ(ในขณะที่counter_variable ! = a, do ... ) เนื่องจากมันทำโดยปริยาย ( บันทึกเป็นไบต์ในคำตอบของฉันนี้ )
  • .Bโดยปริยายบนบรรทัดใหม่ สิ่งนี้มีประโยชน์ในคำตอบของฉันเมื่อเรากำลังมองหาทางเลือกสำหรับ¡(แยก) ในขณะที่ยังคงเก็บรายการว่างไว้ (หมายเหตุ: คำตอบที่เชื่อมโยงไม่ทำงานเมื่อองค์ประกอบมีช่องว่างต่อท้ายหลังจากแยก) - หวังว่าบิวด์อิน เพิ่มลงในการแยก แต่จะเก็บบรรทัดว่างไว้ในอนาคต
  • (ซึ่งตัวเลขของอินพุทจำนวนเต็มสามารถแบ่งอินพุทจำนวนเต็มเท่า ๆ กัน) จะมีตัวเลขของตัวเองสำหรับตัวเลข0(แทนที่จะเป็นข้อผิดพลาดหารด้วยศูนย์) ตัวอย่างเช่น1053จะส่งผลให้[1,1053,0,1] (1053 หารด้วย 1 และ 3 ไม่หารด้วย 5 และให้ข้อผิดพลาดการหารด้วยศูนย์สำหรับ 0) นี่เป็นประโยชน์อย่างมากในคำตอบของฉันโดยการยึดอำนาจของรายการเนื่องจากมีเพียงความ1จริงใน 05AB1E และทุกอย่างอื่นไม่ถูกต้อง SÖPส่งผลให้ในความจริง ( 1) ดังนั้นหมายถึงการป้อนจำนวนเต็มอย่างเท่าเทียมกันโดยตัวเลขแต่ละตัวของมัน
  • หลังจากเห็นû(ทำให้เป็นสตริงที่กำหนด) ฉันประหลาดใจที่ไม่มีis_palindrome ในตัว แต่ต่อมาผมรู้เพียง 2 ไบต์ที่มีความจำเป็นเพื่อบรรลุซึ่งเป็นÂQ(ที่Âเป็นแยกไปสองทางซึ่งเป็นสั้นสำหรับDR: ซ้ำและย้อนกลับคัดลอกและQคือการตรวจสอบว่าชั้นสองค่าในกองมีค่าเท่ากัน)
  • เมื่อคุณต้องการกรองรายการตามสิ่งต่าง ๆ มักจะถูกกว่าที่จะมีตัวกรองหลวมหลายตัวแทนที่จะรวมกันในรายการเดียว เพราะเมื่อคุณมีตัวกรองสองตัวคุณจะต้องมีบางสิ่งบางอย่างตามแนวของDs*(ซ้ำ, สลับ, ทวีคูณเพื่อทำหน้าที่เป็นตรรกะ-AND) เทียบกับ(ปิดตัวกรองตัวแรกตัวกรองอีกครั้ง) เมื่อคุณใช้ตัวกรองสองตัว ตัวอย่างเช่นในความท้าทายนี้เราจะต้องแสดงรายการตัวเลขทั้งหมดของความยาวสี่หลักที่มีอย่างน้อยหนึ่งและมีผลรวมหลักเท่ากับ0 9การใช้ช่วง[1000,10000]ครอบคลุมจำนวนสี่หลักที่มีความยาว แต่คุณจะเหลือตัวกรองอีกสองตัว ตอนแรกฉันใช้₄4°ŸʒD0åsSO9Q*(14 ไบต์) แต่โดยใช้ตัวกรองสองตัวไบต์สามารถบันทึก: ₄4°Ÿʒ0å}ʒSO9Q(13 ไบต์) (ซึ่งต่อมาได้เล่นกอล์ฟถึง₄4°ŸεW°ö9Q(10 ไบต์) โดย@Grimy.)
  • เมื่อคุณต้องการ zip กับจำนวนเต็ม0เป็นฟิลเลอร์, คุณสามารถใช้ ปัญหาหนึ่งของเรื่องนี้คือฟิลเลอร์0จะกลายเป็นสตริง"0"ดังนั้นหากคุณลองเรียงลำดับด้วยสตริงและจำนวนเต็มแบบผสมในภายหลังสิ่งนี้จะไม่ให้ผลลัพธ์ที่คุณต้องการ 0ζ€{นี่เป็นตัวอย่างของวิธีการที่มันจะเรียงลำดับรายการภายในซิปนี้: นี้สามารถแก้ไขได้โดยการเพิ่มนักแสดงอย่างชัดเจนในการ int ( ï) 0ζï€{หลังจากซิปและเพียงแล้วเรียงลำดับตาม: อย่างไรก็ตามการใช้¾ค่าคงที่0กับ zip-filler จะทำให้ค่านั้นยังคงเป็นจำนวนเต็มแทนที่จะเป็นสตริงระหว่าง zip ดังนั้น¾ζ€{จะบันทึกไบต์ที่นี่ เคล็ดลับนี้จัดทำโดย@ Mr.Xcoderเพื่อบันทึกไบต์ในคำตอบของฉันนี้
  • €SOหากคุณต้องการที่จะสรุปตัวเลขของหลายหมายเลขในรายการคุณสามารถใช้ อย่างไรก็ตามใช้ตัวย่อซึ่งจะปรับเวกเตอร์อัตโนมัติ เคล็ดลับนี้จัดทำโดย@Grimyเพื่อบันทึกไบต์ที่นี่ (และ2 ไบต์ที่นี่ )
  • หากคุณกำลังเพียงการจัดการกับจำนวนเต็มไม่เป็นลบและคุณต้องการตรวจสอบภายในตัวกรองไม่ว่าจะเป็น 0 หรือ 1 2‹คุณสามารถของหลักสูตรใช้อย่างเห็นได้ชัด อย่างไรก็ตามการใช้!(แฟคทอเรียล) จะส่งผลให้ 1 (ความจริง) สำหรับ0และ1เท่านั้นและค่าอื่น ๆ ทุกอย่างจะส่งผลให้มีบางสิ่งที่สูงกว่า (และทำให้เข้าใจ1ผิดมากขึ้น เคล็ดลับนี้ถูกจัดให้โดย@Grimyเพื่อบันทึกไบต์ที่นี่

2

vectorization อัตโนมัติ

โปรดทราบว่าตัวดำเนินการบางอย่างใน 05AB1E จะ vectorize โดยอัตโนมัติในอาร์เรย์ ตัวอย่างเช่นรหัส5L3+ซึ่งแยกส่วนเป็นรหัสเทียมต่อไปนี้:

[1, 2, 3, 4, 5] + 3

จะกลายเป็น:

[4, 5, 6, 7, 8]

หากไม่ได้ทำให้เป็นแบบเวกเตอร์โดยอัตโนมัติคุณสามารถใช้โอเปอเรเตอร์ได้ ใช้คำสั่งอักขระเดียวและดำเนินการตัวดำเนินการ (monadic) ในแต่ละองค์ประกอบ ตัวอย่างการแยกแต่ละองค์ประกอบคือรหัสต่อไปนี้ ( ลองใช้ที่นี่ ):

€S

ในขณะที่Sผู้ดำเนินการปกติจะแยกแต่ละองค์ประกอบในอาร์เรย์และทำให้แบนเป็นอาร์เรย์เดียว ( ลองที่นี่ )


คุณจะกำหนดองค์ประกอบที่ n ในอาร์เรย์ได้อย่างไร
Andrew Savinykh

@AndrewSavinykh ตอนนี้ไม่มี builtin สำหรับสิ่งนั้น แต่เป็นสิ่งที่ฉันต้องการนำไปใช้
Adnan

@Adnan ฉันพบวิธีที่จะทำ สร้างรายการอื่นที่มีค่าที่จะกำหนดเช่นกันที่ดัชนี nth จากนั้นรวมรายการที่ใช้ñนำหน้าด้วยค่าของn(ดัชนี) tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
mbomb007

@ mbomb007 ที่เป็นไปได้ปัญหาเดียวคือคุณไม่สามารถแก้ไขอาร์เรย์หลังจากนั้นเนื่องจากคำสั่ง merge ใช้สตริงเป็นอาร์กิวเมนต์เท่านั้น (และแปลงรายการเป็นสตริง)
Adnan

2

การสั่งซื้ออินพุต

ลำดับที่คุณป้อนอาจมีผลอย่างมากต่อโค้ดของคุณและบ่อยครั้งหากคุณใช้sเพื่อสลับด้านบนสุดของสแต็กกับสิ่งที่สูงที่สุดถัดไปในสแต็กคุณไม่ได้คิดถึงปัญหาอย่างถูกต้อง ลองเรียงลำดับอินพุตใหม่และดูว่าคุณสามารถกำจัดความต้องการในการสลับได้หรือไม่โดยการสลับอินพุตล่วงหน้าก่อนเพิ่มลงในสแต็กก่อนหน้าหรือทำซ้ำที่อื่น I&O ที่ชัดเจนที่สุดสามารถเป็นคำตอบที่ประสบความสำเร็จน้อยที่สุด 05AB1E


2

05AB1E ASCII- ศิลปะการเล่นกอล์ฟ

รหัสด้านล่างช่วยเปลี่ยน ASCII-art เป็น 05AB1E โดยใช้การแปลงฐานแบบกำหนดเอง

|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"

ลองออนไลน์

นี่คือความสำเร็จโดย:

  1. การแสดงอักขระที่ไม่ซ้ำกันในรูปวาด ASCII
  2. จัดเรียงตามจำนวนครั้งที่เกิดขึ้นในสตริงตามลำดับจากมากไปน้อย (ส่วนใหญ่เกิดขึ้นกับอักขระที่เกิดขึ้นน้อยที่สุด)
  3. ย้อนกลับสองรายการแรกถ้าการวาดภาพ ASCII เริ่มต้นด้วยอักขระที่เกิดขึ้นมากที่สุด (เพื่อป้องกันการนำ 0s ในจำนวนเต็มที่ถูกบีบอัด)
  4. แมปอักขระของอินพุตเข้า0-9A-Za-zในลำดับนั้นอักขระแต่ละตัวที่แตกต่างกันจะได้รับการแม็พอักขระของตัวเองจนกระทั่งทุกตัวถูกแทนที่
  5. บีบอัดฐานโดยใช้ฐานสูงสุดที่คุณต้องการแทนที่ (ขึ้นอยู่กับจำนวนอักขระที่ไม่ซ้ำกัน)
  6. Base แปลงอีกครั้งเป็น base-255 (สำหรับการบีบอัด 05AB1E)
  7. จัดรูปแบบทุกอย่างในรูปแบบ: •<compressed_integer>•“<sorted_distinct_characters>“ÅвJ.

ช่วยให้คุณยังบีบอัดสตริงคำพูด"; Åвจะใช้สายนี้ไปยังฐานแปลงเลขที่สร้างขึ้นโดยใช้สตริงเป็นฐานที่กำหนดเอง; และJจะรวมตัวอักขระทั้งหมดเหล่านี้เข้าด้วยกันเป็นสายเดี่ยวซึ่งเป็นผลลัพธ์โดยปริยาย

ยอมรับรูปแบบที่มีมากถึงและรวมถึง 62 อักขระที่ไม่ซ้ำใครเหมาะสำหรับ ASCII-art
จำนวนอักขระที่ไม่ซ้ำกันที่น้อยลงจะยิ่งบีบอัดได้ดี


ตัวอย่างเอาต์พุตสำหรับวาดไดอะแกรมกำหนดเวลาแบบดิจิทัล XNOR (214 ไบต์, 9 อักขระที่ไม่ซ้ำกัน):

    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐  
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐   
X ──┘     └───┘ └───┘ └───┘   └────

อยากจะเป็น:

05AB1E , 106 ไบต์

•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ

ลองออนไลน์

(106/214) * 100 = 49.53% ขนาดของสตริง ASCII-art ดั้งเดิม

ซึ่งนับเป็นไบต์เดียวกันกับการส่งที่แท้จริงของฉันสำหรับความท้าทายนั้นใน 05AB1E (ดั้งเดิม)


คำอธิบายรหัส:

หมายเหตุ: รหัสไม่ได้เล่นกอล์ฟอย่างแน่นอน มันเขียนได้อย่างรวดเร็วเพื่อแปลงศิลปะ ASCII เป็นการบีบอัดที่มีประสิทธิภาพมากที่สุดดังนั้นมันจึงน่าเกลียดและยาว ..

               # Take multi-line input
  ©              # Store it in the register to reuse later                         
ÐÙS              # Only leave unique characters (as list)
   DŠ¢ø          # Map it with the count for each of those characters
       Σθ}R      # Sort it based on that count (highest to lowest)
           €н    # Remove the count again, so the sorted characters remain
¬®sÅ?i           # If the input starts with the most occurring character:
      D2£RDŠKsì} #  Swap the first two characters in the list
J©               # Join everything together, and store it in the register to reuse later
  žLR           # Map each character to [0-9A-Za-z]
      ®gö        # Get the amount of unique characters, and convert it to that Base
         B      # And then convert that to Base-255
®s               # Push the string and swap so the compressed integer is at the top again
  "•ÿ•“ÿ“ÅвJ"    # Insert it in the correct output format
                 #  `•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ`
"•ÿ•"            # (after which the result is output implicitly with trailing newline)

1
โดยวิธีการที่ตั้งแต่ 05AB1E มีการเปลี่ยนแปลงหน้ารหัสฐานสูงสุดจะเปลี่ยนจาก214ที่จะ255
Adnan

1
บางทีสิ่งที่จะเพิ่มลงในคำตอบของคุณ (หรือแก้ไขตัวสร้างด้วย) แต่ถ้ามีการใช้อักขระที่แตกต่างกันน้อยกว่า 10 ตัวในศิลปะ ASCII คุณสามารถตีได้สองไบต์ คือกำเนิดของคุณให้นี้ 22 byterแต่ก็สามารถเป็นแบบนี้20 byter แทน
Kevin Cruijssen

@KevinCruijssen ความคิดคือสิ่งที่ฉันพยายามสื่อ แต่ไม่ได้อ้างว่าเครื่องกำเนิดไฟฟ้านั้นเป็นอะไรที่ดี: P ฉันสงสัยอย่างตรงไปตรงมาว่ามันยังทำงานบนโอซาบิ ฉันเขียนมานานแล้ว!
Magic Octopus Urn

@ MagicOctopusUrn ไม่แน่ใจว่ามันทำงานใน Elixir เขียนใหม่ แต่มันก็ยังคงใช้ได้ในเวอร์ชั่นดั้งเดิม ฉันได้แก้ไข Base-214 ไปที่ Base-255 ประมาณครึ่งปีที่แล้วตามที่ได้กล่าวถึงในความคิดเห็นของAdnanด้านบน นอกเหนือจากที่ใช้งานได้ดีและฉันใช้มันสองสามครั้ง (แม้ว่าจะเล่นกอล์ฟทุกครั้งต่อไป;)) การสร้างทั้งสตริงและหมายเลขใช้งานได้ดีมาก!
Kevin Cruijssen

นี่คือรุ่นที่ได้รับการปรับปรุง (น่าเกลียดมากและเขียนอย่างรวดเร็ว แต่ใช้งานได้) มันจะทำให้ตัวอย่างของคุณ108 bytesแทน 113 การปรับปรุงที่ฉันทำคือ: เรียงลำดับอักขระที่แตกต่างกันในเหตุการณ์ที่เกิดขึ้นสูงสุดก่อน (เว้นแต่เหตุการณ์ที่เกิดขึ้นสูงสุดคืออักขระตัวแรก จำนวนเต็มเล็กที่สุด ใช้<str><compr_int><int>вèJแทนของคุณ<compr_int><int>BžLR<str>‡; และใช้แทนการ"เป็นสตริงคำพูดดังนั้น"สามารถเป็นส่วนหนึ่งของอินพุต
Kevin Cruijssen

1

สตริงและ ints เป็นชนิดเท่ากัน

ไม่ใช่สิ่งที่ทุกคนเห็นด้วย แต่ใช้ได้ผล

พิจารณาสองโปรแกรมต่อไปนี้:

4 5+
"4""5"+

พวกเขาทั้งสองผลออกเป็น9 นั่นเป็นเพราะทุกค่าได้รับการประเมินครั้งแรก (พร้อมast.literal_eval) ด้วยเหตุนี้เราจึงสามารถดำเนินการตัวดำเนินการจัดการสตริงทั้งหมดบน ints และตัวดำเนินการปรับแต่ง int ทั้งหมดบนสตริง

ยกตัวอย่างเช่น12345ûpalindromizes จำนวนผลใน12345 123454321หลังจากนั้นเราสามารถทำเลขปกติในเลขนี้ได้

12345û50000-

ซึ่งจะส่งผลเป็น: 123404321


0

ลูปที่ซ่อนและตัววนซ้ำ

05AB1E มีลูปและตัววนซ้ำปกติดังต่อไปนี้:

  • Fซึ่ง iterates ผ่าน0 .. n-1
  • Gซึ่ง iterates ผ่าน1 .. n-1
  • ƒซึ่ง iterates ผ่าน0 .. n
  • vซึ่ง iterates มากกว่าแต่ละองค์ประกอบs [0], s [1], .. , s [N]
  • ʒซึ่งไม่ใช่ลูป แต่เป็นคำสั่งfilter-by เราใช้คำสั่งนี้ในทางที่ผิดเนื่องจากเป็นพฤติกรรมที่ไม่ได้ตั้งใจในการวนซ้ำแต่ละองค์ประกอบ

การใช้ลูปเหล่านี้เราสามารถสืบทอดลูปที่ซ่อนอยู่ต่อไปนี้ได้:

  • แทนที่จะ gFใช้คุณสามารถใช้vซึ่งมีN-index ที่สามารถใช้ได้
  • การvy -> ʒเปลี่ยนนั้นค่อนข้างยุ่งยากกว่าเล็กน้อย:
    • คุณต้องพิมพ์ผลทันที สิ่งนี้จะลดการพิมพ์อัตโนมัติจากการพิมพ์ด้านบนของสแต็ก
    • ข้อมูลโค้ดทำงานบนสแต็คใหม่ชั่วคราว ซึ่งหมายความว่าไม่สามารถใช้ข้อมูลโค้ดที่ขึ้นกับสแต็ก
    • การเรียกใช้yเป็นไปไม่ได้ในลูปชนิดนี้

ฉันรู้ว่านี้ได้รับการโพสต์ในปีที่ผ่านมา แต่ไม่ได้[, µและεยังเป็นส่วนหนึ่งของปกติลูป / ซ้ำ?
Kevin Cruijssen

นอกจากนี้การเรียกใช้yเป็นไปได้กับบางส่วนของเหล่านี้ในขณะนี้
Magic Octopus Urn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.