เคล็ดลับสำหรับการเล่นกอล์ฟใน> <> (ปลา)


14

เนื่องจากฉันได้เห็นมากกว่า> <>การส่งที่ลอยไปรอบ ๆ เมื่อเร็ว ๆ นี้ฉันคิดว่ามันเป็นความคิดที่ดีที่จะมีหน้าเคล็ดลับ

โปรดติดหนึ่งเคล็ดลับต่อโพสต์เว้นแต่ว่าจะมีความเกี่ยวข้องอย่างใกล้ชิด

Python ล่ามอย่างเป็นทางการ

ล่ามออนไลน์ (มีบั๊กบางตัว แต่ดีสำหรับกรณีส่วนใหญ่)


9
ฉันเพิ่งรู้เมื่อมองไปที่หน้า esolang: ผู้สร้าง> <> มีชื่อที่อาจดูเหมือน "ฉมวก"
mbomb007

ฉันจะพิมพ์บรรทัดใหม่ในปลาได้อย่างไร
Captain Man

@CaptainMan คุณสามารถจุดรหัสการส่งออกด้วยoและตั้งแต่บรรทัดใหม่\nเป็น ASCII 10 aoที่คุณสามารถทำได้
Sp3000

ขอบคุณ @Sp ผมพยายามCRแทนLFและได้รับการผลักดันแทนd a
Captain Man

คำตอบ:


5

ตรวจสอบกับ 0

การใช้?!แทนที่จะ0=?บันทึกแบบไบต์

อย่างไรก็ตามมาตรฐาน?บางครั้งอาจจะดีกว่าถ้าคุณสามารถปรับโครงสร้างได้เล็กน้อย

?!vA
  B

กับ

?vB
 A

4

ตรวจสอบ EOF

เมื่อถึง EOF> <> จะเพิ่ม -1 ลงในสแต็กซึ่งสามารถตรวจสอบได้สองวิธี:

:0(?
:1+?

สำหรับจุดประสงค์ในการตรวจสอบ EOF ทั้งสองนี้เป็นการปฏิเสธดังนั้นสิ่งที่มีประโยชน์มากขึ้นนั้นขึ้นอยู่กับโครงสร้างของโปรแกรมของคุณ


3

ข้ามไปที่หลีกเลี่ยงการขึ้นบรรทัดใหม่

บางครั้งการขึ้นบรรทัดใหม่หมายถึงการสูญเสียช่องว่างชั้นนำจำนวนมากในบรรทัดถัดไป ในสถานการณ์เช่นนี้การกระโดดอาจมีประโยชน์

ตัวอย่างเช่น

[lots of code here]>[loop body]v
                   ^ ......... <

สามารถทำเพื่อให้พอดีกับหนึ่งบรรทัดเช่น:

[lots of code here][loop body][jump]

เพื่อเป็นตัวอย่างในทางปฏิบัตินี่คือโปรแกรม Hello World ในหนึ่งบรรทัด:

"!dlroW ,olleH"l?!;oe0.

3

ใช้มอดุลัสเพื่อทำให้อินพุตง่ายขึ้น

นี่อาจเป็นเคล็ดลับที่ง่ายเกินไปดังนั้นหากเป็นเช่นนั้นฉันจะแทนที่หรือลบทิ้ง

สมมติว่าคุณต้องการป้อนอักขระสองตัวคือ "a" และ "b" และส่งคืน 1 และ 2 สำหรับแต่ละตัวตามลำดับ คุณอาจใช้เงื่อนไขกับสิ่งนี้เนื่องจากมันสมเหตุสมผลที่สุดและฉันจะใช้แบบฟอร์มย่อเพิ่มเติมสำหรับตัวอย่างเฉพาะนี้

i:"a")+1+n

การตรวจสอบนี้เพื่อตรวจสอบว่าอินพุทมากกว่า "a" และเพิ่ม 1 เนื่องจาก "a" จะส่งคืน 0 และ "b" 1 นี่จะให้ 1 และ 2 นี่ทำงานได้ค่อนข้างดี แต่ในกรณีของเรา อินพุตเราสามารถไปได้ไกลกว่านี้

i:3%n

ใน mod 3, 97, ซึ่งหมายถึง "a" ที่เทียบเท่ากับตัวเลขกลายเป็น 1, และ 98 ซึ่งเป็น "b" s, กลายเป็น 2 สำหรับตัวเลขสองตัวที่แตกต่างกัน สำหรับมากกว่าสองรายการมี mod ที่ให้ผลลัพธ์ที่เป็นเอกลักษณ์ แต่ฉันไม่มีความสามารถทางคณิตศาสตร์ในการหาอันที่เล็กที่สุดในวิธีที่ง่าย (เช่นหากคุณมีชุด {100,101,102,103} mod 104 จะให้ผลลัพธ์ที่ไม่ซ้ำกันสำหรับ แต่ละค่าในมัน แต่ไม่ใช่ในรูปแบบที่เป็นประโยชน์มาก) อย่างไรก็ตามในกรณีส่วนใหญ่ด้วยการป้อนข้อมูลที่ถูก จำกัด ให้มีตัวอักษรสองสามตัวคุณมักจะพบ mod ที่ใช้งานได้

ในการค้นหาโมดูลัสขนาดเล็กที่สุดที่ให้ผลลัพธ์ที่ไม่ซ้ำกันสำหรับตัวเลขสองจำนวนคือ a และ b คุณทำดังนี้ ใช้ค่าสัมบูรณ์ของความแตกต่างของ a และ b ( |a - b|) และหาจำนวนที่น้อยที่สุด n ซึ่งไม่ได้แบ่งมัน เช่น 97 และ 98 |98 - 97| = 1และอื่น ๆ 2 จะเป็น mod ที่เล็กที่สุด (แต่สำหรับโปรแกรมทดสอบของเรามันให้ 1 สำหรับ 97 และ 0 สำหรับ 98 ดังนั้น mod 3 จะดีกว่า)


3

ใช้การข้ามเป็นเงื่อนไข

บางครั้งคุณจะปิดโปรแกรมการเขียนใน> <> ที่คุณต้องทำสิ่งต่าง ๆ เมื่อได้รับการป้อนข้อมูลที่แตกต่างกัน โดยปกติแล้วคุณจะใช้ conditionals ( ?) และตัวเปลี่ยนทิศทางเพื่อแยกวิเคราะห์สิ่งนี้ ในบางกรณีมันใช้งานได้ดี (โดยเฉพาะเมื่อมีประเภทอินพุตที่จะจัดการน้อยลง) แต่บางครั้งคุณก็จบลงด้วยสิ่งที่มีลักษณะเช่นนี้ (ไม่ต้องสนใจความจริงที่ว่ารหัสนี้สามารถลดได้โดยใช้ลูกเล่นอื่นมันเป็นเพียงการสาธิต)

i:"a"=?v:"b"=?v"c"=?v>
  .00n1< .00n2<.00n3<

ในขณะนี้เป็นเรื่องปกติ แต่ก็มีช่องว่างบางอย่าง (ซึ่งฉันไม่เคยชอบที่จะเห็น) และมีการทำซ้ำมาก ( =?vและ.00n) แทนที่จะเป็นเช่นนั้นคุณสามารถใช้การกระโดดและบรรทัดที่แตกต่างเป็นเงื่อนไขของคุณ นี่คือตัวอย่าง:

i:"a")$"b")+1+0$.>
v1
v2
v3
<.00n

วิธีนี้จะช่วยให้ประหยัด 10 ไบต์ นี่คือสิ่งที่เกิดขึ้น:

i: เราทำซ้ำอินพุตหนึ่งครั้งเพื่อให้เราสามารถประเมินได้สองครั้ง

"a")$"b")+นี่อาจเป็นเคล็ดลับของตัวเอง แต่สิ่งที่ฉันทำที่นี่คือการตรวจสอบเพื่อดูว่าอินพุตมากกว่าตัวอักษร "a" หรือไม่และถ้ามากกว่าอักขระ "b" และเพิ่มผลลัพธ์ สำหรับ "a" สิ่งนี้จะให้ผลเป็น 0 สำหรับ "b," 1 และสำหรับ "c," 2

1+0$.นี่คือสิ่งที่เวทมนตร์เกิดขึ้น เรานำผลลัพธ์ของการทำให้เข้าใจง่ายก่อนหน้านี้และเพิ่ม 1 (ให้ 1 สำหรับ "a", 2 สำหรับ "b", 3 สำหรับ "c") จากนั้นกด 0 และสลับค่า เมื่อเราไปถึงการกระโดดสิ่งนี้จะย้ายไปที่บรรทัดที่สอดคล้องกับค่าที่เรากำหนดให้กับตัวละครเหล่านั้น (เช่นบรรทัดที่ 1 สำหรับ "a") NB Line 0 เป็นโปรแกรมอันดับต้น ๆ


1

การเขียนโค้ดที่สามารถรันได้สองวิธี

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

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

?!v80.>ao (สมมุติว่าฉันต้องการพิมพ์บรรทัดใหม่ก่อน)

แต่ถ้ารหัสที่เราต้องการเรียกใช้ครั้งเดียว (รหัสที่ผ่านมา>) ทำให้บรรทัดมีความยาวมากกว่า 16 ตัวอักษรเราจะไม่สามารถใช้การกระโดดเป็นตัวอักษรสามตัวได้อีกต่อไป อย่างไรก็ตามนี่คือตัวอย่างที่มันไม่สำคัญที่จะวิ่งไปข้างหน้าและข้างหลัง ...

?!v!?<>ao>

ไปข้างหน้าเราพิมพ์บรรทัดใหม่แล้วกดปุ่ม?!vซึ่งจะทิ้งค่าถ้าไม่ใช่ 0 จากนั้นเพราะแทรมโพลีนที่เราข้ามไป?และย้อนกลับไป สิ่งเดียวกันนี้เกิดขึ้นและการวนซ้ำจะดำเนินต่อไปจนกว่าเราจะตี 0

นี่เป็นตัวอย่างที่เจาะจงอย่างผิดปกติ แต่มีบางแอปพลิเคชั่น (อาจจะไม่มาก)

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