Kiedy piszę dokumentację, komentarze itp. Uwielbiam tworzyć tabele ASCII. Zwykle wyglądają całkiem nieźle, ale zawsze uważam, że mogłyby wyglądać jeszcze lepiej - zwłaszcza, że UTF-8 / Unicode zawiera znaki rysujące ramki . Jednak te znaki są bardzo uciążliwe w użyciu, wymagają wstawienia kilku naciśnięć klawiszy. Twoje zadanie? Napisz program lub funkcję, która może automatycznie konwertować tabele ASCII na odpowiednik UTF-8 / Unicode.
To wyzwanie zostało piaskownicy .
Wyzwanie
Napisz program, który jako tabelę wejściową poda tabelę ASCII, wypisuje tabelę od nowa za pomocą znaków rysujących pole Unicode / UTF-8. W szczególności znaki, które są częścią tabeli, należy tłumaczyć w następujący sposób:
(Unicode, 3 bytes each in UTF-8)
- to ─ (\u2500)
| to │ (\u2502)
= to ═ (\u2550)
and + to one of:
┌ (\u250C), ┐ (\u2510), └ (\u2514), ┘ (\u2518),
├ (\u251C), ┤ (\u2524), ┬ (\u252C), ┴ (\u2534),
┼ (\u253C)
or, if '=' on either side:
╒ (\u2552), ╕ (\u2555), ╘ (\u2558), ╛ (\u255D),
╞ (\u255E), ╡ (\u2561), ╤ (\u2564), ╧ (\u2567),
╪ (\u256A)
Detale
I / O:
- Domyślne wejścia / wyjścia są dozwolone
- Możesz pobrać dane wejściowe w dowolnym rozsądnym formacie, w tym tabelę jako ciąg znaków lub ścieżkę do pliku zawierającego tabelę.
- Możesz wyprowadzać dane do pliku i traktować nazwę pliku jako dodatkowy argument.
- Nie można jednak modyfikować pliku wejściowego . (Należy zachować dla ułatwienia przyszłej edycji)
Wejście:
- Możesz założyć, że każdy wiersz danych wejściowych został uzupełniony o tę samą długość
.
- Nie możesz zakładać, że pierwszy znak po nowej linii jest częścią obramowania tabeli (może to być biała spacja).
- Dane wejściowe uważa się za prawidłową tabelę, jeśli wszystkie znaki (które są częścią tabeli)
-=|
są połączone dokładnie z dwoma znakami i+
są połączone z co najmniej jednym znakiem zarówno w poziomie, jak i w pionie. - Twój program może nie generować błędów przy prawidłowych danych wejściowych.
- Jeśli dane wejściowe są niepoprawne, zachowanie jest niezdefiniowane i możesz wygenerować dowolne dane wyjściowe.
- Dane wejściowe mogą zawierać dowolne znaki UTF-8, w tym znaki do rysowania ramek.
Wynik:
- Wszelkie znaki
-=|+
, które nie są częścią tabeli, należy pozostawić bez zmian . - Podobnie, wszelkie inne znaki muszą pozostać niezmienione.
- Dozwolona jest jedna wiodąca i / lub końcowa nowa linia.
Inny:
- Standardowe luki są zabronione, jak zwykle.
- Jeśli preferowany język ma wbudowaną funkcję, która rozwiązuje ten problem, nie możesz go używać.
- Oznacza to programy, funkcje, podprogramy lub instrukcje, które byłyby poprawnymi przesłaniami dla tego wyzwania bez żadnych dodatków.
- Każda z postaci potrzebnych w tym wyzwaniu ma trzy bajty długości, gdy jest zakodowana w UTF-8.
Połączone postacie :
Postać jest połączona z inną, jeśli:
- Jest
|
i jest bezpośrednio powyżej lub poniżej+
lub|
; - Jest
-
i jest bezpośrednio przed lub po+
lub-
; - Jest
=
i jest bezpośrednio przed lub po+
lub=
; - Jest
+
i jest bezpośrednio powyżej lub poniżej|
lub+
, lub jest bezpośrednio przed lub po-
,=
lub+
.
Postać jest uważana za część stołu, jeśli jest połączona z dowolnym znakiem, który jest częścią stołu. Z definicji pierwszy +
z danych wejściowych jest częścią tabeli.
Przykłady
Przykłady dostępne tutaj jako wersja do skopiowania.
Input: Output:
+------------------+ ┌──────────────────┐
| Hello+World! | │ Hello+World! │
+==================+ ╞══════════════════╡
| This is+my first | -> │ This is+my first │
|+-+ code|golf +-+| │+-+ code|golf +-+│
|+-+chall|enge! +-+| │+-+chall|enge! +-+│
+------------------+ └──────────────────┘
+===+===+===+ ╒═══╤═══╤═══╕
| 1 | 2 | 3 | │ 1 │ 2 │ 3 │
+---+===+===+===+ ┌───╪═══╪═══╪═══╡
| 1 | 1 | 2 | 3 | │ 1 │ 1 │ 2 │ 3 │
+---+---+---+---+ -> ├───┼───┼───┼───┤
| 2 | 2 | 4 | 6 | │ 2 │ 2 │ 4 │ 6 │
+---+---+---+---+ ├───┼───┼───┼───┤
|-3 |-3 |-6 |-9 | │-3 │-3 │-6 │-9 │
+===+---+---+---+ ╘═══╧───┴───┴───┘
+-----+ -> <Undefined>
+-----+ -> ┌─────┐
+-----+ └─────┘
+-----------------+
| Hello, World! |
| This is invalid | -> <Undefined>
| input |
-----------------+
++++ ┌┬┬┐
++++ -> ├┼┼┤
++++ └┴┴┘
+--+
++++ -> <Undefined>
+--+
Wreszcie...
To jest golf golfowy , więc wygrywa najmniej bajtów. Miłej gry w golfa!
+-+
fragmenty nie są uważane za powiązane ze sobą?Hello World
tabelę, nie uważa się, że tabele wewnętrzne tworzą tabelę, ponieważ tekst wewnątrz tabeli musi pozostać niezmieniony i nie są one uważane za część zewnętrznych granic tabeli, ponieważ nie są z nimi prawidłowo połączone.+----+
przykład, to dlatego, że kierunek narożników byłby niejednoznaczny.Odpowiedzi:
Python 3,
392281 bajtówGrał w golfa nieco więcej i przekształcił się w rozwiązanie rekurencyjne zamiast iteracyjnego:
Pobiera ciąg równych długości wierszy oddzielonych znakami nowej linii i zwraca ciąg znaków w tym samym formacie. Może zgłosić wyjątek w przypadku nieprawidłowych danych wejściowych.
Poprzednie rozwiązanie:
Wersja bez golfa:
źródło
Python 3 ,
914898827823594587569540469 bajtówEdycja: znacznie zmieniona strategia, teraz tworzy bitowe pole sąsiadów (podobne do odpowiedzi Dead-possum). Opuściłem wcześniejszą wersję poniżej.
Wypróbuj online!
Dane wejściowe mają postać listy list znaków, która jest modyfikowana na miejscu. Powraca od pierwszego +, który znajdzie.
Wypróbuj online!
Oto najbliższa rzecz do wersji bez golfa:
źródło
JavaScript,
311307 bajtówPokaż fragment kodu
Wyjaśnienie
Począwszy od pierwszego znalezionego
+
skrzyżowania, program próbuje znaleźć ścieżki do innych skrzyżowań we wszystkich kierunkach, wykonując zastępstwa w miarę swoich możliwości. Przechowuje znalezione kierunki i stan „podwójnej granicy” w mapie bitowej, która następnie określa odpowiedni znak skrzyżowania.źródło
Python 3 , 599 bajtów
Nie jestem zbyt dobry w golfie w Pythonie 3, ale (ku mojemu wstydowi) nie mogłem uzyskać normalnej wydajności znaków UTF-8 w Pythonie 2. Więc oto jesteśmy.
Chyba jedyną ciekawą sztuczką jest decyzja o
+
transformacji.Wszystkie możliwe warianty zakodowałem za pomocą adresów 4-bitowych. Każdy kawałek adresu przypomina połączenie z sąsiednią komórką. Zatem 0 - brak połączenia i 1 - połączenie.
1111
to┼
0011
jest┐
itp.
Niektóre konfiguracje połączeń są nieprawidłowe i zastąpione wartościami zastępczymi:
'012┐45┌┬8┘0┤└┴├┼'
Jeśli jakakolwiek komórka sąsiadująca zawiera
=
, druga lista zostanie użyta z podwójnymi liniami.Adres jest tutaj łączony.
r
zawiera ciąg znaków o długości 8, gdzie co dwa znaki to 1/0, a rzeczywisty znak sąsiedni.Na przykład:
1+0y1-1|
.Służy do wyboru listy podstawień, jak pokazano wcześniej. A następnie zawarł umowę na adres:
int(r[0::2],2)
Ta lambda służy do sprawdzania poprawności współrzędnych komórki, a char komórki to jeden z „+ - | =”
Ta lambda zwykła odbierać znak z komórki. Zwraca,
' '
jeśli współrzędne są nieprawidłowe. (na pewno można grać w golfa)Warunki rekurencji. Może być także golfem.
Wypróbuj online!
źródło