เคล็ดลับการเล่นกอล์ฟใน Charcoal


15

Charcoalเป็นภาษาที่สร้างโดย ASCII เท่านั้นและ DLosc ที่เชี่ยวชาญในการท้าทายงานศิลปะ ASCII

คุณมีเคล็ดลับอะไรสำหรับการเล่นกอล์ฟใน Charcoal? เห็นได้ชัดว่าฉันกำลังมองหาเคล็ดลับที่เกี่ยวข้องกับ Charcoal โดยเฉพาะอย่างยิ่งไม่ใช่สิ่งที่สามารถนำไปใช้กับภาษาส่วนใหญ่ - ถ้าไม่ใช่ทุกภาษา


เอาล่ะฉันจะลองทำคำตอบถ่านกับอะไรซักอย่าง brb บางทีฉันอาจให้พอยน์เตอร์ชี้บนชุดข้อความนี้ได้
Magic Octopus Urn

คำตอบ:


5

ใช้ประโยชน์จาก deverbosifier

ใช้ deverbosifier หมายความว่าคุณสามารถเขียนใน ASCII ( --dvหรือ--deverbosifyเพื่อ deverbosify -vหรือ--verboseดำเนินการเป็นรหัส verbose) นอกจากนี้มันบีบอัดสตริงสำหรับคุณซึ่งจะมีประโยชน์ในความท้าทายศิลปะ ASCII บางอย่างเมื่อสตริงที่จะบีบอัดยาวเกินไป

@Neilแนะนำให้ใช้หรือ-vl -v --slสิ่งนี้สั้นสำหรับ--verbose --showlengthหมายความว่ามันจะถูกตีความว่าเป็นถ่าน verbose และความยาวของรหัสถ่านปกติจะปรากฏขึ้น นอกจากนี้เมื่อยกเลิกการระบุขนาดให้ตรวจสอบเอาต์พุตเพื่อให้แน่ใจว่าอินพุตได้รับการวิเคราะห์อย่างถูกต้องจริงเนื่องจาก Charcoal มักจะละเว้นข้อผิดพลาดในการแยกวิเคราะห์ หากมีเป็นข้อผิดพลาดทางไวยากรณ์, การใช้งาน-a( --astify) หรือ--oa( --onlyastify) ตัวเลขความช่วยเหลือจากปัญหาที่เกิดขึ้น


-v -slต่อไปนี้ผมขอแนะนำให้ใช้ นอกจากนี้เมื่อ deverbosifying ตรวจสอบผลลัพธ์เพื่อให้แน่ใจว่าข้อมูลที่ได้รับการแยกวิเคราะห์อย่างถูกต้องจริง ๆ เพราะคุณไม่ได้รับข้อผิดพลาดในการแยกวิเคราะห์
Neil

3

ใช้เกินพิกัด

ตัวอย่างเช่นคำสั่งจำนวนมากต้องการเพียงหนึ่งอาร์กิวเมนต์เท่านั้น:

  • Rectangle, OblongและBoxทำให้ตารางถ้าอาร์กิวเมนต์เดียวเท่านั้นที่จะได้รับ
  • Reflect คำสั่งเริ่มต้นเพื่อสะท้อนให้เห็นถึงความถูกต้อง
  • Rotate คำสั่งเริ่มต้น 90 องศาทวนเข็มนาฬิกา
  • PolygonและPolygonHollowสามารถยอมรับความยาวหลายทิศทางและด้านข้าง สามารถใช้งานได้หากทุกด้านมีความยาวเท่ากัน

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

อืมข้อ จำกัด นั้นค่อนข้างตั้งใจ แต่ฉันเดาว่าฉันควรเปลี่ยนเพราะมันจะไม่เจ็บอยู่ดี
ASCII-only

ฉันเห็นคุณแก้ไขรูปหลายเหลี่ยมเพื่อยอมรับลูกศรและหลายทิศทางในลำดับใด ๆ ขอบคุณ! ในขณะที่ฉันอยู่ที่นี่ผมคาดหวังว่าReflectButterfly dlsจะเรียกReflectButterflyสำหรับแต่ละทิศทาง แต่ (ตามที่วิกิพีเดียเอกสารที่ถูกต้อง) ReflectOverlapก็จริงโทร
Neil

@Neil ฮ่า ๆ ๆ ๆ ฉันจะพยายามแก้ไขมันโดยเร็ว (ฉันคิดว่ามันเป็นเรื่องบังเอิญเหมือนกันฮ่าฮ่า)
ASCII-only

3

หลีกเลี่ยงค่าคงที่ต่อเนื่องที่เป็นประเภทเดียวกัน

ตัวอย่างเช่น, Plus(Times(i, 2), 1)แปลเป็น⁺×鲦¹แต่คุณสามารถบันทึกไบต์ได้โดยสลับพารามิเตอร์: Plus(1, Times(i, 2))แปลเป็น⁺¹×ι²และPlus(Times(2, i), 1)เป็น⁺ײι¹ทั้งคู่ซึ่งบันทึกไบต์ Plus(1, Times(2, i))(ซึ่งแปลว่า⁺¹×²ι) จะดียิ่งขึ้นถ้ามีค่าคงที่ตัวเลขอื่นตามมา


3

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

นี่คือรายการของตัวแปรทั้งหมดที่สามารถใช้ได้โดยให้ตัวอักษรภาษากรีกรวบรัดและตัวอักษร verbose ที่แสดงถึงมัน

α/a: The uppercase alphabet
β/b: The lowercase alphabet
γ/g: A string of all the ASCII characters from space to ~
δ/d: The fifth input
ε/e: The fourth input
ζ/z: The third input
η/h: The second input
θ/q: The first input
υ/u: An empty array
φ/f: 1000
χ/c: 10
ψ/y: The null character
ω/w: The empty string

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


สิ่งเหล่านี้ควรได้รับการแก้ไขใน TIO ในตอนนี้มันจะดีถ้าคุณสามารถตรวจสอบว่ามันใช้งานได้
ASCII-only

@ ASCII เท่านั้นคุณสามารถยืนยันได้yและfเป็นวิธีอื่นจากสิ่งที่ฉันวาง (ฉันอาจอ่านตัวอักษรกรีกผิดเมื่อฉันเขียนสิ่งนี้ในตอนแรก)
Neil

ใช่พวกเขาเป็นอย่างอื่น
ASCII- เท่านั้น

3

เรียนรู้การสะท้อนและการหมุนของคุณ

มีการสะท้อนและการหมุนพื้นฐานหลายรูปแบบดังนั้นจึงต้องรู้ว่าความแตกต่างที่ลึกซึ้งคืออะไร กุญแจสู่ตาราง:

  • Command: ชื่อของคำสั่งในโหมด Verbose
  • เปลี่ยนรูป: Charcoal ควรพยายามพลิกหรือหมุนตัวละครในขณะที่มันสะท้อนหรือหมุนมัน ตัวอย่างเช่น/อาจกลายเป็น\หลังจากหมุนหรือพลิก
  • Keep Original: Charcoal ควรผสานผลลัพธ์ด้วย Canvas ดั้งเดิมหรือไม่
  • ซ้อนทับกัน: (ใช้เฉพาะเมื่อ Keep Original คือ Yes) กำหนดตำแหน่งของแกนของการสะท้อน / การหมุนเป็นครึ่งตัวจากเส้นขอบ ในกรณีที่มีการสะท้อนกลับให้เทียบเท่ากับจำนวนแถว / คอลัมน์ที่ไม่ได้รับผลกระทบและจบลงตรงกลางของผลลัพธ์ ในกรณีที่มีการหมุนสำเนาที่หมุนได้จะได้รับอนุญาตให้เขียนทับพื้นที่ที่ชัดเจน (แต่ไม่ใช่ที่ว่าง) ในต้นฉบับ

สะท้อน

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Reflect                 | No        | No            | n/a     |
| ReflectCopy             | No        | Yes           | 0       |
| ReflectOverlap          | No        | Yes           | 1       |
| ReflectOverlapOverlap   | No        | Yes           | n       |
| ReflectTransform        | Yes       | No            | n/a     |
| ReflectMirror           | Yes       | Yes           | 0       |
| ReflectButterfly        | Yes       | Yes           | 1       |
| ReflectButterflyOverlap | Yes       | Yes           | n       |

ทิศทางของการสะท้อนแสงเป็นตัวเลือก ค่าเริ่มต้นคือการสะท้อนหนึ่งครั้งทางด้านขวา สำหรับภาพสะท้อนเหล่านั้นที่เก็บต้นฉบับอนุญาตให้มีหลายทิศทางซึ่งเพียงทำซ้ำคำสั่งสำหรับแต่ละทิศทาง (ซึ่งหมายความว่าเช่นReflectMirror(:¬)จะสร้างสำเนาทั้งหมดสี่ชุด)

เคอร์เซอร์ถูกย้ายพร้อมกับการสะท้อน (แม้เมื่อเก็บต้นฉบับ)

ผลัด

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Rotate                  | No        | No            | n/a     |
| RotateCopy              | No        | Yes           | 0       |
| RotateOverlap           | No        | Yes           | 1       |
| RotateOverlapOverlap    | No        | Yes           | n       |
| RotateTransform         | Yes       | No            | n/a     |
| RotatePrism             | Yes       | Yes           | 0       |
| RotateShutter           | Yes       | Yes           | 1       |
| RotateShutterOverlap    | Yes       | Yes           | n       |

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

จำนวนการหมุน (เพิ่มทีละ 45 °) เป็นทางเลือก ค่าเริ่มต้นคือ 2, คือ 90 °ทวนเข็มนาฬิกา (ทวนเข็มนาฬิกา) สำหรับการหมุนเหล่านั้นที่เก็บต้นฉบับมีสองตัวเลือกทางเลือก: จำนวนเต็ม multidigit ระบุเพื่อหมุนผืนผ้าใบหนึ่งครั้งสำหรับแต่ละหลักแล้วรวมผลลัพธ์ในขณะที่รายการจำนวนเต็มเพียงทำซ้ำคำสั่งสำหรับแต่ละการหมุนด้วยผลตัวแปรขึ้นอยู่กับวิธี ผ้าใบเปลี่ยนระหว่าง


คำถาม: Transformหมายความว่าอย่างไร
CalculatorFeline

@CalculatorFeline เป็นคำถามที่ดี กรณีที่การแปลงไม่ได้เป็นเพียงการคัดลอกอักขระสำหรับอักขระ ตัวอย่างเช่นการสะท้อนมาตรฐานของ "4> 2" เป็นเพียงตัวอักษรในลำดับย้อนกลับเช่น "2> 4" สิ่งนี้ไม่เป็นที่ต้องการเสมอดังนั้นการแปลงความพยายามในการสลับอักขระในลักษณะที่เหมาะสมที่สุดดังนั้นภาพสะท้อนของ "4> 2" จึงกลายเป็น "2 <4" การแปลงอาจไม่ใช่คำอธิบายที่ดีที่สุดดังนั้นอย่าลังเลที่จะแนะนำสิ่งที่ดีกว่า
Neil

ไม่สามารถคิดอะไรได้ดีไปกว่านี้ดังนั้นคุณควรอธิบายว่าTransformคำตอบของคุณทำงานอย่างไร
CalculatorFeline

@CalculatorFeline ฉันได้เพิ่มคีย์ลงในตารางในกรณีที่คอลัมน์อื่น ๆ ไม่ชัดเจนเช่นกัน
Neil

ข้อผิดพลาดควรได้รับการแก้ไขในขณะนี้ ขอบคุณมากที่สละเวลาเขียนคำอธิบายนี้!
ASCII เท่านั้นเท่านั้น

2

ใช้คำสั่งที่ไม่มีอักขระคำสั่ง

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

หากทิศทางไม่ได้ถูกตามด้วยนิพจน์มันจะนับเป็นการย้ายหนึ่งช่องว่างในทิศทางที่ระบุ

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


1
คุณต้องระวังความกำกวมเนื่องจากคำสั่งก่อนหน้าอาจยอมรับพารามิเตอร์ทางเลือก
Neil

2

ใช้หลายทิศทาง

บางคำสั่งสามารถยอมรับ +X*|-\/<>^KLTVY7¬⌊⌈multidirectionals: สิ่งที่พวกเขาขยายตัวออกไปเป็นที่นี่ โดยทั่วไปรายการทิศทางจะเริ่มจากขึ้นและหมุนตามเข็มนาฬิกา


เหตุผลเฉพาะใด ๆ ที่ทำให้คำสั่งบางคำสั่งยอมรับหลายทิศทาง แต่บางรายการต้องการรายชื่อทิศทาง (อาจมีเหตุผลที่ดีสำหรับสิ่งนี้ที่ฉันมองเห็น แต่ฉันพยายามทำReflectButtterflyOverlap(:¬, Modulo(g, 2));)
Neil

@ ไม่มีฉันไม่คิดอย่างนั้นจะเปลี่ยนโดยเร็ว
เท่านั้น

0

ใช้ประโยชน์จาก Sum

Sum มีโอเวอร์โหลดที่มีประโยชน์มากมาย:

  • ในรายการสตริงเชื่อมต่อกันเข้าด้วยกัน อย่างไรก็ตามหากเป็นไปได้ว่ารายการนั้นอาจว่างเปล่าสิ่งนี้จะให้ไม่มีในกรณีนี้ให้ใช้Join(..., "")แทน
  • ในรายการตัวเลขที่ไม่ว่างเปล่าเพียงแค่นำผลรวมของพวกเขา
  • ในรายการที่ไม่ว่างให้เรียงรายการเข้าด้วยกัน (แบนให้ลึก 1)
  • ในจำนวนเต็มใช้ผลรวมของหลัก (ค่าทศนิยมจะถูกปัดเศษเป็นจำนวนเต็มหากคุณต้องการหาผลรวมของตำแหน่งทศนิยมให้แปลงเป็นสตริงก่อน)
  • ในสตริงที่มีตัวเลขเท่านั้นและเป็นทางเลือกหนึ่ง .อักขระรับผลรวมของตัวเลข
  • บนสตริงที่มีตัวเลขและตัวคั่นให้นำผลรวมของตัวเลขที่ส่งไปยัง int หรือ float (แต่โปรดทราบว่า-นับเป็นตัวคั่น)

ผลข้างเคียงที่สะดวกของกฎสองข้อสุดท้ายคือถ้าคุณใช้Sumกับตัวอักษรตัวเลขนั้น1-9จะถูกส่งไปยังค่าของมันและทุกอย่างจะกลับเป็นศูนย์ซึ่งต่างจากCastที่ไม่ได้ใช้กับค่าที่ไม่ใช่ตัวเลข


0

ใช้ split สำหรับอาเรย์สตริง, แยกและร่ายสำหรับอาเรย์ตัวเลข

Split for a string array เป็นอักขระสามตัวที่มีค่าโสหุ้ยและ split และ cast เป็นเพียงสี่ตัวอักษรของค่าใช้จ่าย เปรียบเทียบสิ่งนี้กับการเขียนอาเรย์อย่างแท้จริงซึ่งจะต้องเริ่มต้นและสิ้นสุดของอาเรย์และตัวคั่นระหว่างองค์ประกอบอาร์เรย์ทุก

หากอาร์เรย์ตัวเลขของคุณมีตัวเลขน้อยกว่า 95 ให้ใช้เพี้ยน (หากตัวเลขทั้งหมดน้อยกว่า 10) หรือดัชนีเป็นหนึ่งในตัวแปรที่กำหนดไว้ล่วงหน้า


0

ใช้ตัวกรองเพื่อแบ่งอักขระตัวแรกจากอาร์เรย์หรือสตริง

แม้ว่าคุณจะโชคดีที่ใช้Sliceหั่นตัวอักษรตัวแรกจากสตริงใช้เวลา 2 Slice(..., 1)ไบต์: จะใช้เวลานานขึ้นหากนิพจน์ที่จะแบ่งเป็นส่วน ๆ สิ้นสุดต้องใช้ตัวคั่นหรือหากโค้ดต่อไปนี้สามารถตีความได้ว่าเป็นนิพจน์เช่นเดียวกับในกรณีSliceนั้นจะต้องการใช้เป็นพารามิเตอร์เพิ่มเติม

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

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