เคล็ดลับสำหรับการเล่นกอล์ฟในภาษา 2D


18

คุณมีคำแนะนำทั่วไปเกี่ยวกับการเล่นกอล์ฟในภาษาโปรแกรมสองมิติ ฉันกำลังมองหาเคล็ดลับที่สามารถนำไปใช้กับปัญหาเกี่ยวกับ code-golf และเฉพาะเจาะจงกับภาษาการเขียนโปรแกรม 2D แต่ไม่เฉพาะเจาะจงกับภาษาใดภาษาหนึ่ง (ตอบเช่น "ลบความคิดเห็น" และ "ใช้การMดำเนินการ" ไม่ใช่คำตอบ)

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


คำถามนี้ไม่ควรอยู่ใน Meta หรือไม่?
นาย Lister

2
สิ่ง: มีคำถามที่เกี่ยวข้องเมตานี่คือขนาดของโปรแกรม 2D หรือไม่ ครอบคลุมพื้นที่หรือไม่ พื้นที่ของตัวเรือนูนหรือไม่ พื้นที่ของสี่เหลี่ยมผืนผ้าที่มีการจัดแนวแกน? ทั้งหมดอาจเป็นการวัดที่ดีกว่าขนาด ASCII บางรูปแบบ
MSalters

@MrLister Tips คำถามอยู่ในหัวข้อสำหรับเว็บไซต์หลัก หากคุณมองคุณจะเห็นว่าเรามีคำถามมากมายในแท็กเคล็ดลับอยู่แล้ว
ข้าวสาลีตัวช่วยสร้าง

@MSalters เช่นเดียวกับความยาวภาษาการเขียนโปรแกรมอื่น ๆ ทั้งหมดวัดเป็นไบต์ นักออกแบบภาษาบางคนอนุญาตให้มีการจัดเรียงภาษา 2D ในลักษณะที่แตกต่างกันเช่น Hexagony หรือ Cubix และนั่นก็ขึ้นอยู่กับพวกเขา
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


19

หลีกเลี่ยงช่องว่างแนวนอน

บ่อยครั้งที่โค้ดจะปล่อยช่องว่างขนาดใหญ่ไปทางซ้ายของโปรแกรมเช่นนั้น

abc
  d
  e

สิ่งนี้จะเพิ่ม 4 ไบต์เมื่อสามารถหลีกเลี่ยงได้โดยจัดแนวซ้าย

cde
b
a

หากคุณจำเป็นต้องใช้ช่องว่างขนาดใหญ่ให้พยายามทำให้เป็นแนวตั้งแทนที่จะเป็นแนวนอน

########
#      #
#      #
#      #

VS

####
#
#
#
#
#
#
####

11

ใช้หนึ่งมิติเมื่อเป็นไปได้

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

>iv
^o<

แต่เราสามารถละเมิดพฤติกรรมการห่อและทำสิ่งนี้:

io

หรือในภาษาที่ไม่มีพฤติกรรมการห่อเช่น:

> ?oi<

(สมมติ?ว่าไม่ได้ปรากฏ) ในกรณีของภาษาที่ไม่ได้ล้อมรอบการวนซ้ำอย่างชัดเจนมักจะดีกว่า

ด้วยคำสั่งกระโดด

ในภาษา 2D ที่มีคำสั่ง jump และ jump แบบมีเงื่อนไขโปรแกรมอาจมีลักษณะดังนี้:

abc >de?v;
    ^hgf<

นี่อาจเป็น:

abc de?!;hgf04&

(ถ้า!เป็นแทรมโพลีนและ&กระโดดไปยังตำแหน่ง)


ตัวอย่างที่สามของคุณไม่ได้ทำioiioiioiฯลฯ ใช่ไหม
ASCII เท่านั้น

@ ASCII-only แน่นอนมันทำ อุ่ย
Conor O'Brien

1
คุณควรระบุสิ่งที่คำสั่งปกติที่น้อยกว่าทำ ตัวอย่างเช่นฉันไม่รู้ว่าio;ทำอะไรและสิ่งที่ฉันรู้ก็คือ?มันไม่ปรากฏ ดูเหมือนว่านี่คือคำสั่งปลา แต่ฉันไม่คิดว่ามันเป็นมาตรฐาน
ข้าวสาลี Wizard

2
ในบางภาษา 2D ที่ไม่มีคำสั่งข้ามเงื่อนไข (เช่นเขาวงกต) คุณสามารถเขียนโปรแกรมแบบบรรทัดเดียวแบบวนซ้ำได้โดยการยกเลิกโปรแกรมแบบมีเงื่อนไขด้วยการหารด้วยศูนย์
Martin Ender

10

ผลตอบแทนการขนส่งเป็นไบต์เกินไป

ยิ่ง 2D น้อยลงเท่าไหร่คุณก็ยิ่งทำได้ดีเท่านั้น การคืนสินค้าเป็นอีกหนึ่งบริการ โดยไม่ต้องสนใจเคล็ดลับจาก @ATaco และ @ ASCII เท่านั้นให้ลองใช้มิติ Y ที่มีขนาดเล็กที่สุดเท่าที่จะทำได้

นี้

###
####
########

ดีกว่า

###
###
###
##
#
#
#
#

การขึ้นบรรทัดใหม่ไม่ใช่ไบต์เสมอไป \n(line-feed) คือการสิ้นสุดบรรทัดที่ใช้เป็นประจำในข้อความชิดซ้ายบนระบบ POSIX แม้ว่า Windows และ Mac OS (pre-macOS) ใช้การรวมกันของ\n(line-feed) และ\r(carriage-return)
wizzwizz4

9

แห้ง (อย่าทำซ้ำตัวเอง)

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


8

สอดแทรกพา ธ

โดยทั่วไปในภาษา 2D จะมี IP ที่เคลื่อนที่ตามคำสั่งทิศทาง เนื่องจากพื้นที่ว่างมีจำนวนไบต์ที่สูญเปล่าดังนั้นจึงมีประสิทธิภาพมากขึ้นในการจัดเรียงโปรแกรมใหม่เพื่อให้เคลื่อนย้ายไปใกล้ชิดซ้ายบ่อยที่สุดเท่าที่จะเป็นไปได้


2

ใช้กระจก

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


2

จดจำสำนวน

นี่คือ "สำนวน" บางอย่างที่ทำบางสิ่งขึ้นอยู่กับลักษณะของภาษา

โค้ดเชิงเส้นเทียม

หากจำเป็นต้องมีการสร้างรหัสแบบไดนามิกอาจเป็นการใช้รหัสจำลองเชิงเส้นแบบหลอก:

v
\"line 1"
\"line 2"
.
.
\"line N"

สมมติ\และvหมายถึงสิ่งที่พวกเขามักจะทำ

วนไม่มีสิ้นสุด

ในเกือบทุกภาษา 2D ><นั้นเป็นลูปที่ไม่สิ้นสุดและไม่สามารถแตกได้ ถ้าด้วยเหตุผลบางอย่างคุณต้องทำสิ่งนี้เป็นวิธีที่ดีที่สุดแม้ว่าจะดูดีแค่ไหน:

>v
^<

ในความเป็นจริงถ้าคุณทำให้โค้ดของคุณเป็น 1 ซับคุณก็สามารถใช้^หรือvเช่น:

i?vo;

นี่vจะส่ง IP ไปยังตัวมันเอง คุณอาจยังสามารถใช้วิธีการนี้ในกรณีใด ๆ ที่คำสั่งทิศทางชี้ไปที่ชุดของ (ญาติ) no-ops

กรอบ Quine

โดยปกติภาษาที่มีกรอบข้อความ / อัญประกาศสามารถมีลักษณะดังนี้:

<quote><generate "><output stack><terminate>

สำหรับ> <> จะมีลักษณะดังนี้:

":1-r>o<#

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


นี่ดูเหมือนจะไม่ได้ปลายเดียวจริงๆ
ข้าวสาลี Wizard

@WeatWizard ฉันเก็บมันไว้ด้วยกันเพราะการแยกพวกมันทำให้ฉันมีความรู้สึกน้อยลง
Conor O'Brien

ทำไมคุณถึง<อยู่ใน> <> quine
Jo King

@ โจกิ้งฉันไม่แน่ใจอย่างยิ่ง lol
Conor O'Brien

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