Mẹo chơi golf nghệ thuật ASCII


18

Tôi nghĩ rằng các câu hỏi nghệ thuật ASCII trên PPCG rất thú vị, nhưng cá nhân tôi nghĩ rằng nó có thể khá khó, đặc biệt là khi câu hỏi được gắn thẻ là .

Tôi tự hỏi nếu có ai ở đây có thể có một số mẹo sẽ hữu ích cho việc sản xuất nghệ thuật ASCII.

Đơn giản chỉ cần sắp xếp các ký tự là dễ dàng, nhưng với thuật toán (ngắn), mọi thứ sẽ trở nên phức tạp hơn.

Tôi đang nói về nghệ thuật ASCII như:

  • Chuyển văn bản sang nghệ thuật ASCII (ký tự)
  • Hình ảnh (logo hoặc biểu tượng)

Tôi chỉ tìm kiếm các mẹo chung, nhưng ngôn ngữ cụ thể được cho phép vì hầu hết chúng có thể được dịch bằng mọi cách.

Câu trả lời:


8

Thuật toán nén

Bạn có thể áp dụng nén LZMA cho chuỗi.
Nhiều ngôn ngữ hỗ trợ nó.

Mã hóa chiều dài

Bạn có thể sử dụng các hướng dẫn xử lý như [char][number](ví dụ b12).
Thuật toán nén này được sử dụng tại đây: /codegolf//a/20589/10920

Đọc thêm: http://en.wikipedia.org/wiki/Run-length_encoding

Số nguyên đóng gói

Bạn có thể sử dụng các mảng số nguyên để lưu trữ các hình dạng nhỏ như:

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

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

Mỗi không gian sẽ được dịch thành a 0.
Mỗi sắc nét sẽ được dịch thành a 1.

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

Mỗi bit sau đó được đọc bằng toán tử bitwise &.

Thuật toán trên có thể được cải thiện bằng cách sử dụng cơ sở số nguyên lớn hơn:

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

3
Hướng dẫn xử lý của bạn thường được gọi là mã hóa độ dài chạy , FYI.
FireFly

@FireFly Cảm ơn! Tôi không biết có một cái tên cho điều đó.
Florent

Theo mệnh (ngôn ngữ của tôi), điều này có thể được mở rộng hơn nữa vì nó hỗ trợ các số nguyên được mã hóa đến cơ sở 62:[0-9A-Za-z]
Cyoce

5

Tìm sự đối xứng

Đôi khi nghệ thuật ASCII cần thiết là đối xứng tại một số điểm. Ví dụ: Argyle ASCII Art yêu cầu một đầu ra tương tự như sau:

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

Người ta chỉ có thể in điều này một cách bình thường, nhưng tùy thuộc vào ngôn ngữ, mã yêu cầu có thể được rút ngắn bằng cách chỉ tạo ra nửa trên của kết quả, đảo ngược nó và hoán đổi /\.

Hãy thử chuyển vị

Trong ASCII Art Archery Arbow kết quả để in là cái này, được chia tỷ lệ thành n:

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

Nếu chúng ta nhìn vào mũi tên, chúng ta có thể thấy có 8 loại đường:

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

Hãy thử tương tự cho chuyển vị của nó.

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

Ở đây, có 10 loại đường.

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

Nhưng đây là điểm thu hút: 5 đáy giống hệt với top 5, ngoại trừ hoán đổi /\. Theo quy tắc trước đó, trước tiên bạn có thể tạo 5 đầu tiên, sao chép, thực hiện trao đổi và cuối cùng chuyển đổi để có được mũi tên. Điều này có thể tiết kiệm rất nhiều mã.


5

Kiểm soát các ký tự, chuỗi thoát và mã bảng điều khiển

Trừ khi câu hỏi cấm họ, sự đồng thuận hiện tại về Meta là các thách thức nghệ thuật ASCII không yêu cầu một luồng byte cụ thể, nhưng đầu ra có vẻ chính xác.

Điều này có nghĩa là chúng ta có thể sử dụng các ký tự điều khiển ASCII , các chuỗi thoát ANSImã bảng điều khiển Linux trong các câu trả lời của chúng tôi, giả sử một thiết bị đầu cuối hỗ trợ.

Trừ khi có quy định khác, phần còn lại của câu trả lời này sẽ giải thích hành vi của các thiết bị đầu cuối Linux, đây là những gì tôi có sẵn để thử nghiệm ngay bây giờ.

Ký tự điều khiển ASCII

Hỗ trợ / giải thích khác nhau từ thiết bị đầu cuối đến thiết bị đầu cuối và nhân vật để nhân vật. Công cụ di động nhất phải là linefeed ( \n, \x0a), di chuyển nhân vật đến đầu dòng tiếp theo.

Các nhân vật hữu ích khác bao gồm:

  • Tab dọc ( \v, \x0b) di chuyển con trỏ một vị trí sang phải, sau đó một vị trí xuống.

    $ echo -e 'a\vb'
    a
     b
    
  • Quay trở lại vận chuyển ( \r, \x0d) di chuyển con trỏ đến đầu dòng hiện tại . Bất kỳ ký tự có thể in tiếp theo sẽ ghi đè lên ký tự đầu tiên của dòng hiện tại.

    $ echo -e 'ab\rc'
    cb
    
  • Backspace ( \b, \x08) di chuyển con trỏ một vị trí sang trái. Bất kỳ ký tự có thể in tiếp theo sẽ ghi đè lên ký tự trước khoảng lùi.

    $ echo -e 'ab\bc'
    ac
    
  • Lối thoát ( \e, \x1b) không tự làm gì, nhưng tạo thành một phần của chuỗi thoát ANSI (tùy chọn) và mã bảng điều khiển Linux.

Nhiều ngôn ngữ cho phép các ký tự điều khiển thực tế trong mã nguồn.

Trình tự thoát ANSI

(chưa đến)

Mã giao diện điều khiển Linux

Mặc dù còn nhiều điều nữa, các mã bảng điều khiển hữu ích nhất cho nghệ thuật ASCII có thể là:

  • Trình tự \ecsẽ thiết lập lại thiết bị đầu cuối. Thao tác này sẽ xóa màn hình, di chuyển con trỏ ở góc trên bên trái và đặt màu nền và màu nền, tốc độ nhấp nháy của con trỏ, v.v. thành các giá trị mặc định của chúng.

  • Trình tự \eMgây ra một nguồn cấp dữ liệu ngược , nghĩa là, con trỏ sẽ di chuyển một vị trí lên.

    $ echo -e '\na\eMb\n'
     b
    a
    
  • Trình tự \eHđặt tab dừng ở cột hiện tại.

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

2

Tìm mẫu

Điều này có thể là một chút rõ ràng, nhưng ... tìm kiếm các mẫu, sự tương đồng và lặp lại trong đầu ra. Ví dụ, khi tôi thấy nhiệm vụ biến đổi số thành mô hình hiển thị 7 đoạn, tôi bắt đầu suy nghĩ về cách người ta có thể chơi nó và bắt đầu tìm kiếm sự tương đồng. Do cách các phân đoạn ngang đi giữa các phân đoạn dọc trong ma trận ký tự, có thể dễ dàng xử lý ba phân đoạn cùng một lúc, được nhóm lại với nhau như vậy (thêm hai phân đoạn "luôn trống" cho phân đoạn đầu tiên, trên cùng) :

phân đoạn mò mẫm

Vì vậy, bạn có thể làm một cái gì đó giống như lc + " "*N + rc + "\n"N-1 lần và sau đó lc + bc*N + rcmột lần, cứ mỗi ba phân đoạn ( lc, bc, rclà những nhân vật trái, từ dưới, và phải phân đoạn, tức là một trong |, _hoặc  ).


2

Sử dụng chuyển đổi cơ sở

Câu trả lời này là một câu hỏi muốn nghệ thuật ASCII bao gồm các nhân vật + |-và dòng mới. Vì chỉ có 5 ký tự có thể, những ký tự này có thể được coi là số 5 cơ sở và được chuyển đổi thành byte, đóng gói 3,45 ký tự cho mỗi byte.

Khai thác thường xuyên

Thông thường, dữ liệu sẽ có một số quy tắc, ngay cả khi những quy tắc đó không đủ mạnh để sử dụng các công cụ cụ thể như phản chiếu. Chẳng hạn, trong câu hỏi trên, đầu ra mong muốn có các dòng mới cách đều nhau trong suốt bài kiểm tra, vì văn bản có dạng hình chữ nhật. Tôi đã khai thác điều này để rút ngắn mã của mình, bằng cách sử dụng chức năng phân chia của Pyth thành n mảnh, sau đó tham gia vào dòng mới.

Biết các công cụ của bạn, và chọn một công cụ phù hợp cho công việc.

Các công cụ xử lý văn bản mạnh mẽ và hiệu quả nhất mà tôi biết là:

Động cơ Regex : ///, Retina, Perl, theo thứ tự trao đổi sức mạnh / sự đồng nhất.

Sử dụng nếu điều bạn muốn làm có thể được mô tả chính xác trong các thay thế regex, chẳng hạn như câu trả lời này

Các công cụ xử lý văn bản tối nghĩa: gema, v.v. (Tôi chắc chắn có những công cụ khác, nhưng chúng quá tối nghĩa)

Sử dụng nếu họ có một tính năng chính xác là những gì bạn cần, không có gì khác. Chẳng hạn như trong câu hỏi này , với kết hợp đệ quy của gema.

Các ngôn ngữ chơi gôn mã chung: CJam, Pyth, v.v.

Sử dụng nếu bạn đang khai thác một số phức tạp tinh vi đủ để không có công cụ nào khác thực hiện công việc hoặc nó chỉ thực hiện công việc ngắn hơn.

Hãy thử nhiều cách tiếp cận

Điều này áp dụng trong mọi câu hỏi golf-code, nhưng đặc biệt ở đây. Bạn sẽ không biết liệu một sự đều đặn có thể khai thác được hay không cho đến khi bạn dùng thử. Có thể bằng nhiều ngôn ngữ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.