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 golf-golf .
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ć.
[0-9A-Za-z]
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.źródło
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ół.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.Klawisz cofania (
\b
,\x08
) przesuwa kursor o jedną pozycję w lewo. Każdy kolejny znak do wydrukowania zastąpi go przed spacją.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
\ec
bę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
\eM
powoduje cofnięcie linii , tzn. Kursor przesunie się o jedną pozycję w górę.Sekwencja
\eH
ustawia tabulator w bieżącej kolumnie.źródło
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) :
W ten sposób, można zrobić coś takiego jak
).
lc + " "*N + rc + "\n"
n-1 razy, a następnielc + bc*N + rc
raz na każde trzy segmenty (lc
,bc
,rc
będąc znaki lewo, oddolne, a tuż segmentami, czyli jeden z|
,_
lubźródło
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.
źródło