เคล็ดลับสำหรับการตีกอล์ฟ ASCII


18

ผมคิดว่าคำถามศิลปะ ASCII ใน PPCG จะสนุกกับการทำ แต่ส่วนตัวผมคิดว่ามันอาจจะค่อนข้างยากโดยเฉพาะอย่างยิ่งเมื่อเป็นคำถามที่ติดแท็กเป็นรหัสกอล์ฟ

ฉันสงสัยว่าใครที่นี่อาจมีเคล็ดลับที่จะเป็นประโยชน์ในการผลิตงานศิลปะ ASCII หรือไม่

การจัดเรียงตัวละครเป็นเรื่องง่าย แต่ด้วยอัลกอริธึม (สั้น) สิ่งต่าง ๆ จะซับซ้อนมากขึ้น

ฉันกำลังพูดถึงศิลปะ ASCII เช่น:

  • ข้อความถึงศิลปะ ASCII (ตัวละคร)
  • รูปภาพ (โลโก้หรือไอคอน)

ฉันแค่มองหาเคล็ดลับทั่วไป แต่อนุญาตเฉพาะภาษาเท่านั้นเนื่องจากส่วนใหญ่สามารถแปลได้ แต่อย่างใด

คำตอบ:


8

ขั้นตอนวิธีการบีบอัด

คุณสามารถใช้การบีบอัด LZMA กับสตริงได้
หลายภาษารองรับ

การเข้ารหัสความยาว

คุณสามารถใช้คำแนะนำการประมวลผลเช่น[char][number](เช่นb12)
อัลกอริทึมการบีบอัดนี้ใช้ที่นี่: /codegolf//a/20589/10920

อ่านเพิ่มเติม: http://en.wikipedia.org/wiki/Run-length_encoding

จำนวนเต็มบรรจุ

คุณสามารถใช้อาร์เรย์ของจำนวนเต็มเพื่อจัดเก็บรูปร่างขนาดเล็กเช่น:

// This is an invader!
// (SE line height makes it looks awful)
// ~158 characters

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

0แต่ละพื้นที่จะได้รับการแปลเป็น แต่ละคมจะได้รับการแปลเป็น
1

// ~58 characters
// Saved ~100 bytes!
[
  196656,  49344,   262128,  999228,
  4194303, 3407859, 3342387, 62400
]

&แต่ละบิตจะอ่านแล้วใช้ประกอบการระดับบิต

อัลกอริทึมข้างต้นสามารถปรับปรุงได้โดยใช้ฐานจำนวนเต็มที่ใหญ่กว่า:

// ~44 characters
// Integers are in base 36.
// Use `_` as a separator (or a line break).
"47qo_122o_5m9c_lf0c_2hwcf_211ir_1zn03_1c5c"

3
คำแนะนำในการประมวลผลของคุณเป็นที่รู้จักกันทั่วไปในชื่อการเข้ารหัสความยาวรัน , FYI
FireFly

@FireFly ขอบคุณ! ฉันไม่รู้ว่ามีชื่อสำหรับสิ่งนั้น
Florent

ตาม (ภาษาของฉัน) สิ่งนี้สามารถขยายได้อีกเนื่องจากสนับสนุนจำนวนเต็มที่เข้ารหัสถึงฐาน 62:[0-9A-Za-z]
Cyoce

5

มองหาสมมาตร

บางครั้งศิลปะ ASCII ที่ต้องการนั้นมีความสมมาตรในบางประเด็น ตัวอย่างเช่นArgyle ASCII Artต้องการเอาต์พุตคล้ายกับสิ่งนี้:

    /\        /\
   /  \  /\  /  \
/\/    \/  \/    \/\
\/\    /\  /\    /\/
   \  /  \/  \  /
    \/        \/

หนึ่งก็สามารถพิมพ์นี้ได้ตามปกติ แต่ขึ้นอยู่กับภาษารหัสที่จำเป็นจะสั้นลงโดยการสร้างเพียงครึ่งบนของผลย้อนกลับและการแลกเปลี่ยนและ/\

ลองเปลี่ยนตำแหน่ง

ในASCII Art Archery Arrowsผลลัพธ์ที่จะพิมพ์คือขนาดนี้ตามขนาดที่กำหนดn:

     /\
    /  \
   /    \
  /      \
  \      /
   \____/
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
   /|  |\
  / |  | \
 /  |  |  \
/   |  |   \
/   |  |   \
/   |__|   \
/  /    \  \
/ /      \ \
//        \\
/          \

ถ้าเราดูที่ลูกศรเราจะเห็นว่ามี 8 ชนิดของเส้น:

/ \
\ /
\_/
| |
/ | | \
/ |_| \
/ / \ \
/ \

ลองทำแบบเดียวกันกับทรานสโพส

                         ///////
                        /     / 
   /\                  /     /  
  /  \                /     /   
 /   _||||||||||||||||||||||    
/    _                     _    
\    _                     _    
 \   _||||||||||||||||||||||    
  \  /                \     \   
   \/                  \     \  
                        \     \ 
                         \\\\\\\

ที่นี่มี 10 ชนิดของเส้น

/
/ /
/ \ / /
/ _|
/ _ _
\ _ _
\ _|
\ / \ \
\ \
\

แต่นี่คือการจับ: ด้านล่าง 5 เหมือนไปด้านบน 5 ยกเว้นสำหรับการแลกเปลี่ยนและ/ \ตามกฎก่อนหน้านี้คุณสามารถสร้าง 5 อันดับแรกคัดลอกสลับและสุดท้ายจะได้รับลูกศร วิธีนี้สามารถบันทึกรหัสได้จำนวนมาก


5

อักขระควบคุมลำดับ escape และรหัสคอนโซล

เว้นแต่ห้ามคำถามที่พวกเขาฉันทามติในปัจจุบันเกี่ยวกับ Metaคือศิลปะ ASCII ความท้าทายที่ไม่จำเป็นต้องมีกระแส byte เฉพาะ แต่การส่งออกที่มีลักษณะถูกต้อง

ซึ่งหมายความว่าเราสามารถใช้อักขระควบคุม ASCII , escape sequences ของ ANSIและรหัสคอนโซล Linuxในคำตอบของเราโดยสมมติว่าเป็นเทอร์มินัลที่สนับสนุน

ส่วนที่เหลือของคำตอบนี้จะอธิบายถึงพฤติกรรมของเทอร์มินัล Linux ซึ่งเป็นสิ่งที่ฉันมีให้สำหรับการทดสอบในขณะนี้เว้นแต่จะระบุไว้เป็นอย่างอื่น

อักขระควบคุม ASCII

การสนับสนุน / การตีความแตกต่างกันไปจากเทอร์มินัลไปยังเทอร์มินัลและตัวละครต่ออักขระ แบบพกพาที่ดีที่สุดควรเป็น linefeed ( \n, \x0a) ซึ่งย้ายอักขระไปที่จุดเริ่มต้นของบรรทัดถัดไป

ตัวละครที่มีประโยชน์อื่น ๆ ได้แก่ :

  • แท็บแนวตั้ง ( \v, \x0b) เลื่อนเคอร์เซอร์หนึ่งตำแหน่งไปทางขวาจากนั้นเลื่อนลงหนึ่งตำแหน่ง

    $ echo -e 'a\vb'
    a
     b
    
  • carriage return ( \r, \x0d) เลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดปัจจุบัน อักขระที่พิมพ์ได้ใด ๆ ที่ตามมาจะเขียนทับอักขระตัวแรกของบรรทัดปัจจุบัน

    $ echo -e 'ab\rc'
    cb
    
  • Backspace ( \b, \x08) เลื่อนเคอร์เซอร์หนึ่งตำแหน่งไปทางซ้าย อักขระที่สามารถพิมพ์ได้ใด ๆ ที่ตามมาจะเขียนทับอักขระก่อนหน้า backspace

    $ echo -e 'ab\bc'
    ac
    
  • Escape ( \e, \x1b) ไม่ทำอะไรเลย แต่เป็นส่วนหนึ่งของ ANSI escape sequences (เป็นทางเลือก) และรหัสคอนโซล Linux

หลายภาษาอนุญาตให้ใช้อักขระควบคุมจริงในซอร์สโค้ด

ANSI escape sequences

(ยังมาไม่ถึง)

รหัสคอนโซล Linux

ในขณะที่มีอีกมากมายรหัสคอนโซลที่มีประโยชน์ที่สุดสำหรับ ASCII art น่าจะเป็นสิ่งเหล่านี้:

  • ลำดับ\ecจะรีเซ็ตเทอร์มินัล การล้างหน้าจอจะทำให้เคอร์เซอร์อยู่ที่มุมซ้ายบนและตั้งค่าสีพื้นหลังและพื้นหลังอัตราการกะพริบของเคอร์เซอร์ ฯลฯ เป็นค่าเริ่มต้น

  • ลำดับ\eMทำให้เกิดการป้อนบรรทัดย้อนกลับนั่นคือเคอร์เซอร์จะเลื่อนขึ้นหนึ่งตำแหน่ง

    $ echo -e '\na\eMb\n'
     b
    a
    
  • ลำดับ\eHตั้งค่าแท็บหยุดที่คอลัมน์ปัจจุบัน

    $ echo -e '   \eHa\n\tb'
       a
       b
    

2

มองหารูปแบบ

อันนี้อาจจะค่อนข้างชัดเจน แต่ ... มองหารูปแบบความคล้ายคลึงกันและการทำซ้ำในการส่งออก ตัวอย่างเช่นเมื่อฉันเห็นเลขแปลงเป็นงานรูปแบบการแสดงผล 7 ส่วนฉันเริ่มคิดว่าจะตีกอล์ฟได้อย่างไรและเริ่มมองหาความคล้ายคลึงกัน เนื่องจากวิธีที่เซกเมนต์แนวนอนเชื่อมต่อระหว่างส่วนแนวตั้งในเมทริกซ์อักขระจึงอาจง่ายที่สุดในการจัดการกับสามส่วนในแต่ละครั้งจัดกลุ่มเข้าด้วยกันเช่นนี้ (เพิ่มเซ็กเมนต์ "ว่างเสมอ" สองอันสำหรับอันดับแรกสุด) :

เซ็กเมนต์คล้าหา

ดังนั้นคุณสามารถทำสิ่งที่ชอบlc + " "*N + rc + "\n"N-1 ครั้งแล้วlc + bc*N + rcครั้งหนึ่งสำหรับทุกกลุ่มที่สาม ( lc, bc, rcเป็นซ้าย, bottom- และขวาส่วนอักขระคือหนึ่ง|, _หรือ )


2

ใช้การแปลงฐาน

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

ใช้ประโยชน์จากระเบียบ

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

รู้จักเครื่องมือของคุณและเลือกเครื่องมือที่เหมาะสมกับงาน

เครื่องมือประมวลผลข้อความที่ทรงพลังและมีประสิทธิภาพที่สุดที่ฉันรู้จักคือ:

เอนจิ้นของ Regex:, ///Retina, Perl ตามลำดับของกำลังงาน / ความรัดกุม

ใช้หากสิ่งที่คุณต้องการทำสามารถอธิบายได้อย่างชัดเจนในการทดแทน regex เช่นคำตอบนี้

เครื่องมือประมวลผลข้อความที่ไม่ชัดเจน: gema และอื่น ๆ (ฉันแน่ใจว่ามีคนอื่นอยู่ แต่พวกเขาก็คลุมเครือเกินไป)

ใช้หากพวกเขามีคุณสมบัติที่ตรงตามที่คุณต้องการไม่มีสิ่งอื่นใด เช่นในคำถามนี้กับการจับคู่ซ้ำของ Gema

รหัสภาษากอล์ฟทั่วไป: CJam, Pyth และอื่น ๆ

ใช้หากคุณกำลังใช้ประโยชน์จากความซับซ้อนที่ซับซ้อนพอที่จะไม่มีเครื่องมืออื่นใดที่จะทำงานหรือทำให้งานสั้นลง

ลองหลายวิธี

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

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