Wskazówki do gry w golfa ASCII art

18

Myślę, że pytania o sztukę ASCII na PPCG są fajne, ale osobiście uważam, że może być to dość trudne, szczególnie gdy pytanie jest oznaczone jako .

Zastanawiam się, czy ktoś tutaj może mieć jakieś wskazówki, które przydadzą się do tworzenia sztuki ASCII.

Proste układanie znaków jest łatwe, ale dzięki (krótkim) algorytmom sprawy staną się bardziej skomplikowane.

Mówię o sztuce ASCII, takiej jak:

  • Tekst do grafiki ASCII (znaki)
  • Obrazy (logo lub ikony)

Po prostu szukam ogólnych wskazówek, ale specyficzne dla języka są dozwolone, ponieważ większość z nich można w każdym razie przetłumaczyć.

Teun Pronk
źródło

Odpowiedzi:

8

Algorytmy kompresji

Możesz zastosować kompresję LZMA do łańcucha.
Obsługuje to wiele języków.

Kodowanie długości przebiegu

Możesz użyć instrukcji przetwarzania, takich jak [char][number](np b12.).
Ten algorytm kompresji jest używany tutaj: /codegolf//a/20589/10920

Dalsza lektura: http://en.wikipedia.org/wiki/Run-length_encoding

Pakowanie całkowite

Możesz używać tablic liczb całkowitych do przechowywania małych kształtów, takich jak:

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

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

Każde miejsce zostanie przetłumaczone na 0.
Każde ostrze zostanie przetłumaczone na 1.

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

Każdy bit jest następnie odczytywany przy użyciu operatora bitowego & .

Powyższy algorytm można ulepszyć, stosując większą bazę liczb całkowitych:

// ~44 characters
// Integers are in base 36.
// Use `_` as a separator (or a line break).
"47qo_122o_5m9c_lf0c_2hwcf_211ir_1zn03_1c5c"
Florent
źródło
3
Twoje instrukcje przetwarzania są powszechnie znane jako kodowanie długości przebiegu (FYI).
FireFly,
@FireFly Thanks! Nie wiedziałem, że jest na to nazwa.
Florent
W wartości nominalnej (mój język) można to rozszerzyć, ponieważ obsługuje liczby całkowite zakodowane do podstawy 62:[0-9A-Za-z]
Cyoce
5

Poszukaj symetrii

Czasami wymagana grafika ASCII jest w pewnym momencie symetryczna. Na przykład Argyle ASCII Art wymaga danych wyjściowych podobnych do tego:

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

Można po prostu wydrukować to normalnie, ale w zależności od języka wymagany kod można skrócić, generując tylko górną połowę wyniku, odwracając go i zamieniając /i\ .

Spróbuj transponować

W ASCII Art Archery Arrows wynik do wydrukowania jest następujący n:

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

Jeśli spojrzymy na strzałkę, zobaczymy 8 rodzajów linii:

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

Spróbujmy tego samego dla jego transpozycji.

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

Tutaj jest 10 rodzajów linii.

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

Ale tutaj jest haczyk: dolne 5 jest identyczne z górnym 5, z wyjątkiem zamiany /i \. Zgodnie z poprzednią regułą możesz najpierw wygenerować pierwszą 5, skopiować, zrobić zamianę, a na koniec dokonać transpozycji, aby uzyskać strzałkę. To może zaoszczędzić dużo kodu.

PurkkaKoodari
źródło
5

Kontroluj znaki, sekwencje specjalne i kody konsoli

O ile pytanie nie zabrania ich, obecny konsensus w sprawie Meta jest taki, że wyzwania artystyczne ASCII nie wymagają określonego strumienia bajtów, ale wynik, który wygląda poprawnie.

Oznacza to, że możemy użyć znaków kontrolnych ASCII , sekwencji ucieczki ANSI i kodów konsoli Linux w naszych odpowiedziach, zakładając, że obsługujemy terminal.

O ile nie podano inaczej, pozostała część tej odpowiedzi wyjaśni zachowanie terminali Linuksa, co mam teraz do przetestowania.

Znaki kontrolne ASCII

Wsparcie / interpretacja różni się w zależności od terminala i terminala. Najbardziej przenośnym powinien być linefeed ( \n, \x0a), który przenosi znak na początek następnego wiersza.

Inne przydatne postacie to:

  • Pionowa zakładka ( \v, \x0b) przesuwa kursor o jedną pozycję w prawo, a następnie o jedną pozycję w dół.

    $ echo -e 'a\vb'
    a
     b
    
  • Powrót karetki ( \r, \x0d) przesuwa kursor na początek bieżącej linii. Każdy kolejny znak do wydruku nadpisze pierwszy znak bieżącego wiersza.

    $ echo -e 'ab\rc'
    cb
    
  • Klawisz cofania ( \b, \x08) przesuwa kursor o jedną pozycję w lewo. Każdy kolejny znak do wydrukowania zastąpi go przed spacją.

    $ echo -e 'ab\bc'
    ac
    
  • Funkcja escape ( \e, \x1b) sama z siebie nic nie robi, ale stanowi część sekwencji specjalnych ANSI (opcjonalnie) i kodów konsoli Linux.

Wiele języków dopuszcza rzeczywiste znaki kontrolne w kodzie źródłowym.

Sekwencje specjalne ANSI

(jeszcze przed nami)

Kody konsoli Linux

Chociaż istnieje wiele innych, najbardziej przydatnymi kodami konsoli dla grafiki ASCII są prawdopodobnie następujące:

  • Sekwencja \ecbędzie zresetować terminal. Spowoduje to wyczyszczenie ekranu, przesunięcie kursora w lewym górnym rogu i ustawienie domyślnych wartości koloru przedniego i tła, szybkości migania kursora itp.

  • Sekwencja \eMpowoduje cofnięcie linii , tzn. Kursor przesunie się o jedną pozycję w górę.

    $ echo -e '\na\eMb\n'
     b
    a
    
  • Sekwencja \eHustawia tabulator w bieżącej kolumnie.

    $ echo -e '   \eHa\n\tb'
       a
       b
    
Dennis
źródło
2

Poszukaj wzorów

Ten może być nieco oczywisty, ale ... szukaj wzorców, podobieństw i powtórzeń w danych wyjściowych. Na przykład, kiedy zobaczyłem zadanie Przekształć w 7-segmentowe zadanie wzorca wyświetlania , zacząłem myśleć o tym, jak można go zagrać w golfa i zacząłem szukać podobieństw. Ze względu na sposób, w jaki segmenty poziome przechodzą między pionowymi w matrycy znaków, prawdopodobnie najłatwiej byłoby poradzić sobie z trzema segmentami naraz, zgrupowanymi razem jako takie (dodając dwa segmenty „zawsze puste” dla pierwszego, najwyższego) :

segmenty po omacku

W ten sposób, można zrobić coś takiego jak lc + " "*N + rc + "\n"n-1 razy, a następnie lc + bc*N + rcraz na każde trzy segmenty ( lc, bc, rcbędąc znaki lewo, oddolne, a tuż segmentami, czyli jeden z |, _lub  ).

Robaczek świętojański
źródło
2

Użyj konwersji podstawowej

Ta odpowiedź była na pytanie, które chciało sztuki ASCII, która składała się z postaci + |-i nowych linii. Ponieważ jest tylko 5 możliwych znaków, można je traktować jako liczbę podstawową 5 i konwertować na bajty, pakując 3,45 znaków na bajt.

Wykorzystaj prawidłowości

Często dane będą miały pewne prawidłowości, nawet jeśli nie są wystarczająco silne, aby zastosować określone narzędzia, takie jak dublowanie. Na przykład w powyższym pytaniu pożądany wynik miał nowe wiersze z grubsza równomiernie rozmieszczone w teście, ponieważ tekst był z grubsza prostokątny. Wykorzystałem to, aby skrócić mój kod, używając funkcji podziału Pyth'a na n elementów, a następnie dołączając się do nowej linii.

Poznaj swoje narzędzia i wybierz odpowiednie dla danego zadania.

Najbardziej wydajne i wydajne narzędzia do przetwarzania tekstu, jakie znam:

Silniki Regex:, ///Retina, Perl, w kolejności kompromisu mocy / zwięzłości.

Użyj, jeśli to, co chcesz zrobić, może być dokładnie opisane w podstawieniach wyrażeń regularnych, takich jak ta odpowiedź

Niewyraźne narzędzia do przetwarzania tekstu: gema itp. (Jestem pewien, że istnieją inne, ale są zbyt niejasne)

Użyj, jeśli mają funkcję dokładnie taką, jakiej potrzebujesz, której nie ma nic więcej. Tak jak w tym pytaniu , z rekurencyjnym dopasowaniem gema.

Ogólne języki gry w golfa: CJam, Pyth itp.

Użyj, jeśli wykorzystujesz na tyle subtelny kompleks, że żadne inne narzędzie nie wykona zadania lub po prostu wykona zadanie krócej.

Wypróbuj wiele podejść

Dotyczy to każdego pytania związanego z golfem, ale szczególnie tutaj. Nie będziesz wiedział, czy prawidłowość można wykorzystać, dopóki jej nie wypróbujesz. Prawdopodobnie w wielu językach.

isaacg
źródło