คำตอบ:
เนื่องจากมันไม่ได้เป็นส่วนหนึ่งของ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#] '“,
โปรแกรมนี้จะ:
lAð«Ã#
) หรือตัดคำในรายการหากมีเพียงคำเดียวที่ป้อนเข้า ( ¸˜
)vyU
)"€...ï"Dâvy
) ซึ่งจะพยายามเรียกใช้เป็นโปรแกรม 05AB1E ( "“ÿ“".V
)XlQiy?1#
ด้วยการป้อนข้อมูลการส่งออกจึงจะเป็นgood bye world
ลองออนไลน์“‚¿Þ¡‚ï“
หมายเหตุ: คุณยังคงต้องดูว่าคำนั้นอยู่ในพจนานุกรมหรือไม่เพื่อให้เครื่องกำเนิดนี้ทำงานได้และจะไม่สนใจอักขระพิเศษหรือคำพหูพจน์ใด ๆ จะพบเฉพาะคำที่เหมือนกันทั้งหมดในพจนานุกรม
นี่คือตัวอย่างที่ฉันใช้…Ÿ™‚ï!
สำหรับสตริง "hello world!" และ’‚¿Þ¡ ÿ ‚ï!’
สำหรับสตริง "ลาก่อนÿโลก!" โปรดสังเกตว่าการใช้ช่องว่างและเครื่องหมายอัศเจรีย์เป็นอย่างไรเนื่องจากไม่มีดัชนีในไฟล์ info.txt นอกจากนี้ยังใช้ÿ
เพื่อแทรก "ความโหดร้าย" ที่อยู่ด้านบนสุดของสแต็กซึ่งน่าเสียดายที่ไม่ได้เป็นส่วนหนึ่งของพจนานุกรม (แต่ยังคงถูกบีบอัดโดยใช้วิธีการที่ส่วนด้านล่าง)
แม้ว่าไฟล์ดิกชันนารี word.ex นั้นค่อนข้างใหญ่ (10,000 คำที่แน่นอน) แต่ก็สามารถเกิดขึ้นได้ว่าคุณต้องการคำที่ไม่ได้เป็นส่วนหนึ่งของมันหรือสตริงที่เป็นแค่พูดพล่อยๆธรรมดา ดังนั้นมีวิธีการบีบอัดเหล่านั้นเช่นกัน?
มีแน่นอนคือโดยใช้.•
ซึ่งเป็นสตริงที่บีบอัดฐาน 255 ตัวอักษร หมายเหตุ: วิธีนี้สามารถใช้ได้กับตัวละครในตัวอักษรตัวพิมพ์เล็กและช่องว่างเท่านั้น
นี่เป็นโปรแกรมที่มีประโยชน์ในการแปลงคำ / สตริงเป็นสตริงพื้นฐานที่บีบอัด 255 ตัวอักษร:
vAyk})> 27β 255B ".•ÿ•"
สิ่งที่โปรแกรมนี้ทำคือ:
vAyk})>
: ทำดัชนีตัวอักษร 1 ดัชนีของตัวอักษรแต่ละตัวของอินพุตโดยช่องว่างกลายเป็นดัชนี 027β
: แปลงดัชนีเหล่านี้จากฐาน 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 ถึงไบนารีแทน2в
ซึ่งเข้าร่วมโดยปริยาย)[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]
( ใช้ในคำตอบของฉัน ):
•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
คือ 57 ไบต์ (สร้างโดยตัวสร้างรายการจำนวนเต็มที่บีบอัด)•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø
JδŠ₂ + Öηôî®À8† 6 / ðÎ6ùøΓ°ÓĆ; ˆ ©Ā•2ô`มี 57 ไบต์ (จำนวนเต็มบีบอัดแบ่งออกเป็นส่วนของขนาด 2)•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
,λ₂ϦP(Ì•65в₂+
มี แต่ 2 ไบต์สั้นโดยการบีบอัดรายการกับแต่ละค่าที่ต่ำกว่า 26 แล้วเพิ่มว่าหลังจากนั้นด้วย `₂ + ` เคล็ดลับในการเพิ่มค่าไบต์เดียวในภายหลังนี้สามารถใช้งานได้ค่อนข้างบ่อยเพื่อบันทึกไบต์ในรายการที่บีบอัดย้อนกลับไปในวันที่เปิดตัว 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.
£
เป็นคำสั่งสำหรับการถ่ายครั้งแรกที่ตัวละครของสตริงb
อดีต:a
"hello_world"5£
->
"hello"
แต่ถ้าb
เป็นรายการดัชนีมันจะแยกสตริงออกเป็นส่วนต่าง ๆ ของ (ไม่เกิน) ขนาดนั้น
อดีต: "hello_world"5L£
->
['h', 'el', 'lo_', 'worl', 'd']
พวกมันถูกซ่อนอยู่ใน 05AB1E เล็กน้อย นี่คือรายการของตัวแปรที่กำหนดไว้ล่วงหน้าทั้งหมด:
¾
ผลักดัน0
ถ้า counter_variable ไม่เปลี่ยนแปลงก่อนคำสั่งนี้X
ผลัก1
ถ้าตัวแปร X U
จะไม่มีการเปลี่ยนแปลงก่อนที่คำสั่งนี้กับY
ผลัก2
ถ้าตัวแปร Y V
จะไม่มีการเปลี่ยนแปลงก่อนที่คำสั่งนี้กับ®
ผลักถ้าลงทะเบียนจะไม่เปลี่ยนแปลงก่อนที่คำสั่งนี้กับ-1
©
¯
กด[]
(อาร์เรย์ว่าง) หากไม่มีการเพิ่มอะไรลงใน global_array ก่อนคำสั่งนี้¸
กด[""]
ที่สแต็กเปล่าถ้าไม่มีอินพุต (ขอบคุณ @Emigna สำหรับการค้นหาอันนี้)¾
pushes 0 => นั่นเป็นเรื่องเกี่ยวกับความทรงจำที่ไม่ได้รับ
¾
ผลักดันตัวแปรเคาน์เตอร์ซึ่งจะเริ่มต้นเป็น 0 ถ้าคุณเพียงต้องการที่จะผลักดัน 0, 0 เป็นหลักสูตรที่เป็นธรรมชาติมากขึ้น แต่ถ้าคุณต้องการที่จะผลักดัน5,0,7
, 5¾7
2 5 0 7
ไบต์สั้นกว่า
¾
ตั้งใจ.75
และฉันเคยเอาชนะ Pyth ด้วยความจริงนั้น ภาษาที่เล่นกอล์ฟที่ขึ้นใหม่เหล่านี้ไม่มีเงื่อนงำเกี่ยวกับความจำ ...
print(3 / 4)
ในหลาม 2 0
ให้ฉัน
M
-Inf
Λ
หรือ.Λ
)เนื่องจากมันไม่ได้เป็นส่วนหนึ่งของเอกสารและ@Adnanในขณะนี้ค่อนข้างยุ่งเกินไปที่จะเขียนมันฉันจึงขออนุญาตให้เพิ่มมันเป็นเคล็ดลับที่นี่ตอนนี้
สามารถใช้ฟังก์ชัน Canvas ( Λ
หรือ.Λ
) เพื่อวาดเส้น ASCII บนหน้าจอ มันมีสามพารามิเตอร์ที่ต้องการ:
[0,7]
สำหรับเส้นทางซึ่งเราสามารถใช้หนึ่งหรือหลาย นอกจากนี้ยังมีตัวเลือกพิเศษบางอย่างที่ต้องใช้อักขระบางตัว (เพิ่มเติมเกี่ยวกับเรื่องนั้นในภายหลัง)[0,7]
แผนที่ทิศทางหลักไปยังทิศทางต่อไปนี้:
7 0 1
↖ ↑ ↗
6 ← X → 2
↙ ↓ ↘
5 4 3
ตัวอย่าง 05AB1E บางคำตอบที่ใช้ Canvas:
ลองทำสิ่งที่คล้ายกันเป็นตัวสุดท้ายดังนั้นให้เราใช้Λ
ฟังก์ชั่นCanvas กับพารามิเตอร์สามตัวต่อไปนี้:
[3,3,5,5,7,7,9,9]
!@#
[0,2,4,6]
สิ่งนี้จะให้ผลลัพธ์ต่อไปนี้:
!@#!@#!
# @
@ #!@ #
! @ # !
# ! ! @
@ @ #
!#@!# !
@
@!#@!#@!#
แล้วมันทำงานอย่างไร ต่อไปนี้เป็นขั้นตอนที่มีอินพุตเหล่านี้ด้านบน:
3
ตัวละคร ( !@#
) ขึ้นไป (ทิศทาง0
)3-1
อักขระ ( !@
) ไปทางขวา (ทิศทาง2
)5-1
ตัวละคร ( #!@#
) ลงด้านล่าง (ทิศทาง4
)5-1
อักขระ ( !@#!
) ไปทางซ้าย (ทิศทาง6
)7-1
ตัวละคร ( @#!@#!
) ขึ้นไป (ทิศทาง0
)7-1
อักขระ ( @#!@#!
) ไปทางขวา (ทิศทาง2
)9-1
ตัวละคร ( @#!@#!@#
) ลงด้านล่าง (ทิศทาง4
)9-1
อักขระ ( !@#!@#!@
) ไปทางซ้าย (ทิศทาง6
)-1
จะมีเพราะเส้นทับซ้อน ดังนั้นสองขั้นตอนแรกคือ:
#
@
!
และ
!@
ซึ่งรวมกันคือ:
#!@
@
!
หมายเหตุเล็กน้อย:
[0,7]
แล้วยังมีตัวเลือกเฉพาะสองสามตัวให้เลือกซึ่งโดยทั่วไปแล้วจะแปลไปยังลำดับทิศทาง
+
( '+
inline) แปลเป็นรูปแบบ04402662
ซึ่งสร้าง+
-cross ด้วยแขนของความยาวที่กำหนด เห็นมันในทางปฏิบัติ×
( '×
inline) แปลเป็นรูปแบบ15513773
ซึ่งสร้างX
-cross ด้วยแขนของความยาวที่กำหนด เห็นมันในทางปฏิบัติ8
กลับไปที่จุดเริ่มต้นที่เราเริ่มวาดภาพจาก เห็นในการกระทำและเห็นความแตกต่างได้โดยไม่ต้องได้8
Λ
ออกจะทันทีและ.Λ
ส่งผลสตริงที่จะถูกผลักไปยังกองซึ่งเรายังคงสามารถกลับมาใช้แก้ไขและทำอะไรกับที่เราต้องการต้องการ ตัวอย่างบางส่วน:
+×8
ฉันได้ดูแน่นอนในรหัสที่มา
เช่นเดียวกับในภาษาอื่น ๆ ที่ใช้สแต็คฟังก์ชั่นของ 05AB1E มักจะป๊อป (กิน) อินพุตของพวกเขาจากสแต็กและส่งเอาต์พุตไปยังสแต็ก
อย่างไรก็ตามฟังก์ชั่นบางอย่างได้รับอินพุตจากสแต็กโดยไม่ต้องใช้มัน ตัวอย่างคือhead
ฟังก์ชั่น¬
ซึ่งสร้างองค์ประกอบแรกจากรายการอินพุต ดูตัวอย่างโปรแกรมได้ที่นี่: ¬+
. เพิ่มหมายเลขแรกของรายการอินพุตให้กับแต่ละหมายเลขของรายการนั้น
หากต้องการทราบว่าฟังก์ชั่นป๊อปและที่ได้รับการดูที่คอลัมน์สอดคล้องกันในแฟ้มข้อมูลฟังก์ชั่น
ลูปและเงื่อนไขจะได้รับวงเล็บปิดโดยอัตโนมัติเมื่อสิ้นสุดโปรแกรมดังนั้นคุณจะต้องเพิ่มเข้าไปในรหัสหากคุณต้องการบางสิ่งที่อยู่นอกลูป / เงื่อนไข
ตัวอย่างเช่นโปรแกรมนี้ที่ไม่ได้รับการสร้างรายการn
หมายเลขเฉพาะแรกไม่จำเป็นต้องปิดวงเล็บ
[¹¾Q#NpiNˆ¼
แต่ถ้าเราต้องการที่จะดำเนินการบางอย่างในรายการผลลัพธ์ตัวอย่างเช่นการ delta ของเราจะต้องปิดวงก่อน
[¹¾Q#NpiNˆ¼]¯¥
จะขยายสิ่งนี้ด้วยเคล็ดลับการเล่นกอล์ฟเล็ก ๆ ที่ฉันได้เรียนรู้ไปพร้อมกัน (เพิ่งเริ่มต้น 05AB1E เป็นการส่วนตัวเท่านั้น)
D
(ซ้ำ) และÐ
(เพิ่มขึ้นสามเท่า) ร่วมกับs
(แลกเปลี่ยน) และŠ
(สาม-swap a,b,c
ไปc,a,b
) มักจะสั้นกว่าการใช้©
(บันทึกในglobal_variable ) และ®
(การผลักดันglobal_variable ) ภายในลูป สิ่งนี้ช่วยประหยัดไบต์ในคำตอบของฉันนี้และสองคำตอบของฉันนี้½
(ถ้า 1 แล้วเพิ่มcounter_variableโดย 1) ไม่จำเป็นในตอนท้ายของ a µ
(ในขณะที่counter_variable ! = a, do ... ) เนื่องจากมันทำโดยปริยาย ( บันทึกเป็นไบต์ในคำตอบของฉันนี้ ).B
โดยปริยายบนบรรทัดใหม่ สิ่งนี้มีประโยชน์ในคำตอบของฉันเมื่อเรากำลังมองหาทางเลือกสำหรับ¡
(แยก) ในขณะที่ยังคงเก็บรายการว่างไว้ (หมายเหตุ: คำตอบที่เชื่อมโยงไม่ทำงานเมื่อองค์ประกอบมีช่องว่างต่อท้ายหลังจากแยก) - หวังว่าบิวด์อิน เพิ่มลงในการแยก แต่จะเก็บบรรทัดว่างไว้ในอนาคตSÖ
(ซึ่งตัวเลขของอินพุทจำนวนเต็มสามารถแบ่งอินพุทจำนวนเต็มเท่า ๆ กัน) จะมีตัวเลขของตัวเองสำหรับตัวเลข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.)0
เป็นฟิลเลอร์, 0ζ
คุณสามารถใช้ ปัญหาหนึ่งของเรื่องนี้คือฟิลเลอร์0
จะกลายเป็นสตริง"0"
ดังนั้นหากคุณลองเรียงลำดับด้วยสตริงและจำนวนเต็มแบบผสมในภายหลังสิ่งนี้จะไม่ให้ผลลัพธ์ที่คุณต้องการ 0ζ€{
นี่เป็นตัวอย่างของวิธีการที่มันจะเรียงลำดับรายการภายในซิปนี้: นี้สามารถแก้ไขได้โดยการเพิ่มนักแสดงอย่างชัดเจนในการ int ( ï
) 0ζï€{
หลังจากซิปและเพียงแล้วเรียงลำดับตาม: อย่างไรก็ตามการใช้¾
ค่าคงที่0
กับ zip-filler จะทำให้ค่านั้นยังคงเป็นจำนวนเต็มแทนที่จะเป็นสตริงระหว่าง zip ดังนั้น¾ζ€{
จะบันทึกไบต์ที่นี่ เคล็ดลับนี้จัดทำโดย@ Mr.Xcoderเพื่อบันทึกไบต์ในคำตอบของฉันนี้€SO
หากคุณต้องการที่จะสรุปตัวเลขของหลายหมายเลขในรายการคุณสามารถใช้ อย่างไรก็ตามใช้ตัวย่อ1ö
ซึ่งจะปรับเวกเตอร์อัตโนมัติ เคล็ดลับนี้จัดทำโดย@Grimyเพื่อบันทึกไบต์ที่นี่ (และ2 ไบต์ที่นี่ )2‹
คุณสามารถของหลักสูตรใช้อย่างเห็นได้ชัด อย่างไรก็ตามการใช้!
(แฟคทอเรียล) จะส่งผลให้ 1 (ความจริง) สำหรับ0
และ1
เท่านั้นและค่าอื่น ๆ ทุกอย่างจะส่งผลให้มีบางสิ่งที่สูงกว่า (และทำให้เข้าใจ1
ผิดมากขึ้น เคล็ดลับนี้ถูกจัดให้โดย@Grimyเพื่อบันทึกไบต์ที่นี่โปรดทราบว่าตัวดำเนินการบางอย่างใน 05AB1E จะ vectorize โดยอัตโนมัติในอาร์เรย์ ตัวอย่างเช่นรหัส5L3+
ซึ่งแยกส่วนเป็นรหัสเทียมต่อไปนี้:
[1, 2, 3, 4, 5] + 3
จะกลายเป็น:
[4, 5, 6, 7, 8]
หากไม่ได้ทำให้เป็นแบบเวกเตอร์โดยอัตโนมัติคุณสามารถใช้€
โอเปอเรเตอร์ได้ ใช้คำสั่งอักขระเดียวและดำเนินการตัวดำเนินการ (monadic) ในแต่ละองค์ประกอบ ตัวอย่างการแยกแต่ละองค์ประกอบคือรหัสต่อไปนี้ ( ลองใช้ที่นี่ ):
€S
ในขณะที่S
ผู้ดำเนินการปกติจะแยกแต่ละองค์ประกอบในอาร์เรย์และทำให้แบนเป็นอาร์เรย์เดียว ( ลองที่นี่ )
ñ
นำหน้าด้วยค่าของn
(ดัชนี) tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
ลำดับที่คุณป้อนอาจมีผลอย่างมากต่อโค้ดของคุณและบ่อยครั้งหากคุณใช้s
เพื่อสลับด้านบนสุดของสแต็กกับสิ่งที่สูงที่สุดถัดไปในสแต็กคุณไม่ได้คิดถึงปัญหาอย่างถูกต้อง ลองเรียงลำดับอินพุตใหม่และดูว่าคุณสามารถกำจัดความต้องการในการสลับได้หรือไม่โดยการสลับอินพุตล่วงหน้าก่อนเพิ่มลงในสแต็กก่อนหน้าหรือทำซ้ำที่อื่น I&O ที่ชัดเจนที่สุดสามารถเป็นคำตอบที่ประสบความสำเร็จน้อยที่สุด 05AB1E
รหัสด้านล่างช่วยเปลี่ยน ASCII-art เป็น 05AB1E โดยใช้การแปลงฐานแบบกำหนดเอง
|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"
นี่คือความสำเร็จโดย:
0-9A-Za-z
ในลำดับนั้นอักขระแต่ละตัวที่แตกต่างกันจะได้รับการแม็พอักขระของตัวเองจนกระทั่งทุกตัวถูกแทนที่•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ
.“
ช่วยให้คุณยังบีบอัดสตริงคำพูด"
; Åв
จะใช้สายนี้ไปยังฐานแปลงเลขที่สร้างขึ้นโดยใช้สตริงเป็นฐานที่กำหนดเอง; และJ
จะรวมตัวอักขระทั้งหมดเหล่านี้เข้าด้วยกันเป็นสายเดี่ยวซึ่งเป็นผลลัพธ์โดยปริยาย
ยอมรับรูปแบบที่มีมากถึงและรวมถึง 62 อักขระที่ไม่ซ้ำใครเหมาะสำหรับ ASCII-art
จำนวนอักขระที่ไม่ซ้ำกันที่น้อยลงจะยิ่งบีบอัดได้ดี
ตัวอย่างเอาต์พุตสำหรับวาดไดอะแกรมกำหนดเวลาแบบดิจิทัล XNOR (214 ไบต์, 9 อักขระที่ไม่ซ้ำกัน):
┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──
┌───┐ ┌───┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐
B ┘ └─┘ └─┘ └─┘ └───┘ └─┘ └
┌─────┐ ┌─┐ ┌─┐ ┌───┐
X ──┘ └───┘ └───┘ └───┘ └────
อยากจะเป็น:
•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)
<str><compr_int><int>вèJ
แทนของคุณ<compr_int><int>BžLR<str>‡
; และใช้“
แทนการ"
เป็นสตริงคำพูดดังนั้น"
สามารถเป็นส่วนหนึ่งของอินพุต
ไม่ใช่สิ่งที่ทุกคนเห็นด้วย แต่ใช้ได้ผล
พิจารณาสองโปรแกรมต่อไปนี้:
4 5+
"4""5"+
พวกเขาทั้งสองผลออกเป็น9 นั่นเป็นเพราะทุกค่าได้รับการประเมินครั้งแรก (พร้อมast.literal_eval
) ด้วยเหตุนี้เราจึงสามารถดำเนินการตัวดำเนินการจัดการสตริงทั้งหมดบน ints และตัวดำเนินการปรับแต่ง int ทั้งหมดบนสตริง
ยกตัวอย่างเช่น12345û
palindromizes จำนวนผลใน12345
123454321
หลังจากนั้นเราสามารถทำเลขปกติในเลขนี้ได้
12345û50000-
05AB1E มีลูปและตัววนซ้ำปกติดังต่อไปนี้:
F
ซึ่ง iterates ผ่าน0 .. n-1G
ซึ่ง iterates ผ่าน1 .. n-1ƒ
ซึ่ง iterates ผ่าน0 .. nv
ซึ่ง iterates มากกว่าแต่ละองค์ประกอบs [0], s [1], .. , s [N]ʒ
ซึ่งไม่ใช่ลูป แต่เป็นคำสั่งfilter-by เราใช้คำสั่งนี้ในทางที่ผิดเนื่องจากเป็นพฤติกรรมที่ไม่ได้ตั้งใจในการวนซ้ำแต่ละองค์ประกอบการใช้ลูปเหล่านี้เราสามารถสืบทอดลูปที่ซ่อนอยู่ต่อไปนี้ได้:
gF
ใช้คุณสามารถใช้v
ซึ่งมีN
-index ที่สามารถใช้ได้vy -> ʒ
เปลี่ยนนั้นค่อนข้างยุ่งยากกว่าเล็กน้อย:
y
เป็นไปไม่ได้ในลูปชนิดนี้[
, µ
และε
ยังเป็นส่วนหนึ่งของปกติลูป / ซ้ำ?
y
เป็นไปได้กับบางส่วนของเหล่านี้ในขณะนี้