Popatrz! To labirynt ASCII! Soo coolzors, amazeballs i takie tam.
+-+-----+---+
| | | |
| | ++ | |
| | ++ +-+ |
| | |
+-------+ | |
| | |
+---------+-+
Ale, ale, ale ... ustalenie, w którą stronę idą wszystkie części labiryntu, jest uciążliwe. Chcę tylko narysować układ, a labirynt zamieni się w kulę bez mnóstwa czasu.
Co jeśli mógłbym to narysować w ...
#############
# # # #
# # ## # #
# # ## ### #
# # #
######### # #
# # #
#############
To byłoby takie słodkie!
Reguły (ponieważ reguły są fajne):
- Napisz kod, aby przekonwertować ciąg znaków na labirynt ascii i wyślij wynik.
- Wszelkie znaki niebiałe będą odczytywane jak ściana.
- Każdy znak ściany decyduje, która postać będzie oparta na swoich sąsiadach (tylko w kierunku północnym, południowym, wschodnim i zachodnim).
- Jeśli znak nie ma sąsiadów niebędących spacjami, będzie to znak plus (+).
- Jeśli znak ma sąsiadów zarówno w kierunku pionowym (północ-południe), jak i poziomym (wschód-zachód), będzie to znak plus (+).
- Jeśli znak ma sąsiadów tylko w kierunku pionowym (północ-południe), będzie to symbol potoku (|).
- Jeśli znak ma sąsiadów tylko w kierunku poziomym (wschód-zachód), będzie to znak minus (-).
- Dane wejściowe mogą być pojedynczymi łańcuchami (z wierszami oddzielonymi znakami nowej linii lub tablicą ciągów).
- Wszystkie znaki wejściowe będą drukowalnymi znakami ASCII, nie musisz zajmować się rozszerzonymi zestawami znaków.
- Użyj dowolnego starego języka, jaki chcesz.
- Jeśli przed linią jest biała spacja, powinna ona być taka sama w każdej linii. Wszelkie spacje po każdym wierszu wyjścia są w porządku.
- Spróbuj rozwiązać go przy użyciu najmniejszej liczby bajtów.
Przypadki testowe:
1: Ramka
Wejście:
##########
# #
# #
# #
##########
Wynik:
+--------+
| |
| |
| |
+--------+
2: Klasyczny labirynt
Wejście:
#################
# #
# ##### # ##### #
# # # # # #
# # # # ##### # #
# # # # #
### # ####### # #
# # # # # #
# ### # ## # ##
# # ## #
#################
Wynik:
--------+-------+
| |
| --+-+ | ----+ |
| | | | | |
| + | | +---- | |
| | | | |
+-- | +----+- | |
| | | | | |
| --+ | ++ | -+
| | ++ |
+-----+-++----+--
3: Zielone jajka, stary.
Wejście:
I do not like green eggs and ham.
I do not like them, sam I am.
Would you like them here or there?
I would not like them anywhere!
Wynik:
| ++ +++ ++++ +++++ +++- -++ ----
| ++ +++ ++++ +++++ +++ + +++
+-+++ +++ ++++ ++++ ++++ ++ +++---
| +++-+ +++ ++++ ++-+ +++++++++
4: Sople
Wejście:
Word Icicle!
Word Icicle
Word cicle
ord cicle
ord icle
ord i le
or i le
or i l
or l
or
r
Wynik:
++++ ++++++-
++++ ++++++
++++ +++++
+++ +++++
+++ ++++
+++ | ++
++ | ++
++ | |
++ |
++
|
---
?-
s, ani dlaczego klasyczny labirynt nie ma czterech+
s w dolnym rzędzie.smallest number of characters
, a nie bajty?+
pośrodku pierwszego rzędu 2)!
sople lodu powinny zostać zastąpione przez-
. Czy mógłbyś dokładnie sprawdzić te?whitespace
, po prostu nie myśli tylko miejsca? Nie chcę obsługiwać kart i prawdopodobnie nie chcesz, żebym również przekształcał nowe wierszeOdpowiedzi:
APL (Dyalog Unicode) ,
5735 bajtów SBCS–22 dzięki nowatorskiemu rozwiązaniu firmy ngn .
Anonimowa ukryta funkcja przyjmująca jako argument macierz znaków.
Wypróbuj online!
{
… W}⌺3 3
każdej dzielnicy 3 na 3 zastosuj następującą funkcję:,⍵
ravel (spłaszczyć)' '≠
Boolean gdzie spacja⍱∘⌽⍨
że NOR jest odwrotny (w tym ani górny NOR dolny, ani lewy NOR prawy)5 4 2⊃¨⊂
pick 5 th , 4 th , oraz 2 nd element z tej całej listytj pustym siebie, nie pionowe, poziome nie
2⊥
oceniać w podstawie 2 (binarnie)tj. ≥4: pusta jaźń; 3: brak sąsiadów; 2: brak horyzontalnych sąsiadów; 1: bez pionu; 0: ma oba
'+-|+'↓⍨
upuść tyle elementów z tego ciągu,tj. puste ja
:; sam
+
:; sąsiedniej pionowej (ach):|+
; pozioma-|+
:; obie:+-|+
⊃
wybierz pierwszy element (pad ze spacją, jeśli nie są dostępne),tj. puste self
+
:; sąsiedniej pionowej (ach):|
; pozioma-
:; obie:+
Stare rozwiązanie
Anonimowa ukryta funkcja przyjmująca jako argument macierz znaków.
Wypróbuj online!
{
… W}⌺3 3
każdej dzielnicy 3 na 3 zastosuj następującą funkcję:,⍵
ravel (spłaszczyć)(
…)/
Filtruj za pomocą następującej maski:9⍴0 1
cyklicznie przekształcaj[0,1]
do długości 9 (wybiera N, W, E, S)' '≠
Boolean gdzie spacja1⌽
obróć o jeden krok w lewo;[W,E,S,N]
2 2⍴
przekształcić w matrycę 2 na 2;[[W,E],[S,N]]
∨/
redukcja rzędów LUB:[horizontal,vertical]
(
…)
Zastosuj następującą funkcję ukrytą:⊢
tożsamość;[horizontal,vertical]
∧/,
poprzedzone jego zmniejszeniem AND;[both,horizontal,vertical]
(
…),
Wstaw następujące:,⍵
ravel (spłaszcz) sąsiedztwo5⊃
odebrać 5 th elementu (sam)' '=
Boolean, jeśli spacja (tzn. Pusta)Teraz mamy
[empty,both,horizontal,vertical]
1⍳⍨
indeks skrajnie lewej 1 (daje 5, jeśli w ogóle nie ma sąsiadów)' +-|+'⊃⍨
użyj tego, aby wybrać symbolźródło
JavaScript (ES6), 110 bajtów
Format I / O: tablica ciągów.
Wypróbuj online!
Lub 108 bajtów , używając zamiast tego macierzy znaków.
źródło
Python 2 ,
181168 bajtówdzięki Leaky Nun za -13 bajtów
Wypróbuj online!
źródło
MATLAB,
113110101 bajtówKonwertuje dane wejściowe na logiczne, stosuje splot w poziomie i pionie i łączy dane wyjściowe, aby utworzyć odpowiednie znaki.
3 bajty zapisane przez @Adriaan na powiedzenie mi, że możesz zablokować wyjście w PPCG: P
9 bajtów zapisanych dzięki licznym komentarzom @flawr!
źródło
J ,
4947 bajtówDzięki FrownyFrog za -2 bajty!
Wypróbuj online!
źródło
Retina 0.8.2 , 92 bajty
Wypróbuj online! Wymaga wejścia prostokątnego. Link zawiera przypadki testowe. Wyjaśnienie:
Zmień wszystkie spacje na
0
s.Poszukaj wszystkich
0
s z innym0
bezpośrednio powyżej lub poniżej w tej samej kolumnie i zmień je na 1.1
S są teraz miejscami z pionowymi sąsiadami, podczas gdy0
s nie mają pionowych sąsiadów.Poszukaj wszystkich cyfr bez poziomych sąsiadów. Do
0
s nie mają pionowe sąsiadów albo, więc stają się one+
s, podczas gdy1
y mają pionowe sąsiadów, więc stają|
s.Pozostałe cyfry mają poziomych sąsiadów.
1
Y również pionowe sąsiadów, więc stają się one+
s, podczas gdy0
s tylko poziome sąsiadów, więc stają-
s.źródło
Python 3 , 336 bajtów
Wypróbuj online!
Musiałem użyć dużo kodu, aby poradzić sobie z błędami wielkości liter.
źródło
C (gcc) , 143 bajty
Wypróbuj online!
Funkcja f modyfikuje tablicę ciągów w miejscu. Obszar wokół tablicy musi być wypełniony spacjami (nieco ograniczony). Chociaż nie spełnia to dokładnie wymagań większości rozwiązań, jest zgodne z regułami, jeśli mówimy, że reprezentujemy znak nowej linii z dwoma spacjami (i bierzemy ciąg znaków kończący się znakami nowego wiersza).
Nie golfił
To było zabawne wyzwanie arytmetyki wskaźników. Używając iteracji wskaźnika w stylu C, łatwo jest uzyskać poziomych sąsiadów, ale pionowe były trudniejsze. Na szczęście wskaźnik y wciąż jest w pobliżu (co wskazuje na początkową wartość z), więc mogę wydedukować z niego swój indeks i użyć go, aby uzyskać dostęp do tego samego elementu w innym wierszu. Czułem się bardzo źle, pisząc
y[-1][z-*y]
wbrew rozsądnemu stylowi!źródło