Візуалізуйте лабіринт ASCII


18

дивись! Це лабіринт ASCII! Сухі холодильники, дивовижні кульки та інше.

+-+-----+---+
| |     |   |
| |  ++   | |
| |  ++ +-+ |
|       |   |
+-------+ | |
|         | |
+---------+-+

Але, але, але ... боляче відпрацьовувати, в якому напрямку рухаються всі частини лабіринту. Я просто хочу намалювати макет, і лабіринт зробить себе кулею кул без навантажень часу.

Що робити, якби я міг просто намалювати це в ...

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

Це було б солодко!


Правила (Тому що правила охолоджують):

  • Напишіть код, щоб перетворити рядок у лабіринт ascii та вивести результат.
  • Будь-який символ, що не має пробілів, буде читатися як стіна.
  • Кожна таблиця стіни визначатиме, якого персонажа базувати на сусідах (лише в північному, південному, східному та західному напрямках).
    • Якщо у char немає сусідів, що не мають пробілу, це буде знаком плюс (+).
    • Якщо у сусіда є сусіди як у вертикальному (північ-південь), так і в горизонтальному (схід-захід) напрямку, це буде знаком плюс (+).
    • Якщо у сусіда є сусіди лише у вертикальному (північ-південь) напрямку, це буде символ труби (|).
    • Якщо у сусіда є сусіди лише в горизонтальному (схід-захід) напрямку, це буде знаком мінус (-).
  • Вхід може бути одним рядком (з рядками, розділеними символами нового рядка, або масивом рядків).
  • Усі вхідні символи будуть друкованими символами ASCII, вам не потрібно мати справу з розширеними символами.
  • Користуйтеся будь-якою старою мовою.
  • Якщо перед рядком є ​​пробіл, він повинен бути однаковим у кожному рядку. Будь-який пробіл після кожного рядка виводу є нормальним.
  • Спроба вирішити це найменшою кількістю байтів.

Тестові приклади:

1: Рамка

Вхід:

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

Вихід:

+--------+
|        |
|        |
|        |
+--------+

2: Класичний лабіринт

Вхід:

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

Вихід:

--------+-------+
        |       |
| --+-+ | ----+ |
|   | | |     | |
| + | | +---- | |
|   | |       | | 
+-- | +----+- | |
|   | |    |  | | 
| --+ | ++ | -+
|     | ++    |  
+-----+-++----+--

3: Зелені яйця, людина.

Вхід:

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!

Вихід:

| ++ +++ ++++ +++++ +++- -++ ----
| ++ +++ ++++ +++++ +++ + +++
+-+++ +++ ++++ ++++ ++++ ++ +++---
| +++-+ +++ ++++ ++-+ +++++++++

4: Бурульки

Вхід:

Word Icicle!
Word Icicle 
Word  cicle 
 ord  cicle 
 ord   icle 
 ord   i le 
 or    i le 
 or    i l  
 or      l  
 or         
  r         

Вихід:

++++ ++++++-
++++ ++++++ 
++++  +++++ 
 +++  +++++ 
 +++   ++++ 
 +++   | ++ 
 ++    | ++ 
 ++    | |  
 ++      |  
 ++         
  |         

1
Чи не повинен закінчуватися третій рядок зелених яєць і шинки ---?
LiefdeWen

1
Результати для змішаних сусідів досі незрозумілі; не впевнений, чому бурульки взагалі матимуть -s або чому класичний лабіринт не має чотирьох +s у нижньому ряду.
Ніл

1
чи дозволяється нам приймати дані як квадрат, прокладений пробілами (тобто матрицею)? Чи дозволяється виводу мати додатковий пробіл навколо нього? Також ти справді маєш на увазі smallest number of charactersне байти?
dzaima

1
Я думаю, що 1) класичний лабіринт повинен містити +середину 1-го ряду 2) !Ікрила слід замінити на a -. Чи можете ви подвійно перевірити ці?
Арнольд

1
До речі whitespace, ти просто маєш на увазі просто простір? Мені не хочеться підтримувати вкладки, і ви, мабуть, не хочете, щоб я також трансформував нові рядки
Джо Кінг,

Відповіді:


11

APL (Dyalog Unicode) , 57 35 байт SBCS

–22 завдяки новому рішенню від ngn .

Анонімна мовчазна функція, яка бере аргумент матриці символів.

{⊃'+-|+'↓⍨25 4 2⊃¨⊂⍱∘⌽⍨' '≠,⍵}⌺3 3

Спробуйте в Інтернеті!

{... }⌺3 3 застосуйте наступну функцію для кожного мікрорайону 3 на 3:

,⍵ реве (згладжувати)

' '≠ Булева, де не пробіл

⍱∘⌽⍨ що NOR - зворотний (у тому числі ні верхній нижній NOR, ні лівий NOR справа)

5 4 2⊃¨⊂виберіть 5- й , 4- й та 2- й елемент із цього списку,
  тобто порожній "Я", не вертикаль, ні горизонталь

2⊥ оцінити в базі-2 (двійковій),
  тобто ≥4: порожня самостійна; 3: немає сусідів; 2: немає горизонтальних сусідів; 1: немає вертикалі; 0: має і те, і інше

'+-|+'↓⍨ викиньте з цього рядка багато елементів,
  тобто порожнє ":" ; поодинці +:; вертикальний сусід (и) тільки: |+; горизонтальний -|+:; обидва:+-|+

 виберіть перший елемент (майданчик з пробілом, якщо його немає),
  тобто порожнє ":" ; поодинці +:; вертикальний сусід (и) тільки: |; горизонтальний -:; обидва:+


Старе рішення

Анонімна мовчазна функція, яка бере аргумент матриці символів.

{' +-|+'⊃⍨1⍳⍨(' '=5⊃,⍵),(∧/,⊢)∨/2 21' '≠(90 1)/,⍵}⌺3 3

Спробуйте в Інтернеті!

{... }⌺3 3 застосуйте наступну функцію для кожного мікрорайону 3 на 3:

,⍵ реве (згладжувати)

()/ Фільтрують за допомогою наступної маски:

  9⍴0 1 циклічно переробити [0,1]на довжину 9 (вибирає N, W, E, S)

' '≠ Булева, де не пробіл

1⌽ повернути на один крок вліво; [W,E,S,N]

2 2⍴ переформатуйте на матрицю 2 на 2; [[W,E],[S,N]]

∨/ зменшення рядків АБО: [horizontal,vertical]

() Застосувати таку негласну функцію:

   особистість; [horizontal,vertical]

  ∧/, передує його зменшенню І; [both,horizontal,vertical]

(), Додайте наступне:

  ,⍵ згорнути (згладити) околиці

  5⊃ вибрати 5- й елемент (сам)

  ' '= Булевий, якщо пробіл (тобто порожній)

 Зараз у нас є [empty,both,horizontal,vertical]

1⍳⍨ індекс крайнього лівого 1 (дає 5, якщо сусідів немає взагалі)

' +-|+'⊃⍨ використовуйте це для вибору символу

   




5

MATLAB, 113 110 101 байт

function F(A)
B=A>32
c=[1 1 1]
f=@(c)conv2(B,c,'s')>1
h=f(c)
v=f(c')
char((13*h+92*v-94*(h&v)).*B+32)

Перетворює вхід в логічний, застосовує згортання в горизонтальний і вертикальний і поєднує виходи, щоб зробити відповідні символи.

3 байти, збережені @Adriaan за те, що мені сказали, що ви можете засмітити вихід у PPCG: P

9 байт збережено завдяки численним коментарям @flawr!



2

Сітківка 0,8,2 , 92 байти

\S
0
(?<=(.)*)0(?=(?>.*\n(?<-1>.)*)0)|0(?=(.)*)(?<=0(?>(?<-2>.)*\n.*))
1
T`d`+|`\b.\b
T`d`-+

Спробуйте в Інтернеті! Потрібен прямокутний ввід. Посилання включає тестові випадки. Пояснення:

\S
0

Змініть усі пропуски на 0s.

(?<=(.)*)0(?=(?>.*\n(?<-1>.)*)0)|0(?=(.)*)(?<=0(?>(?<-2>.)*\n.*))
1

Шукайте всі 0s з іншим 0безпосередньо над чи нижче в тому ж стовпці та змініть їх на 1. Тепер 1s є місцями з вертикальними сусідами, тоді як 0s не мають вертикальних сусідів.

T`d`+|`\b.\b

Шукайте всі цифри без горизонтальних сусідів. У 0s також немає вертикальних сусідів, тому вони стають +s, тоді як 1s мають вертикальні сусіди, тому вони стають |s.

T`d`-+

Решта цифр мають горизонтальні сусіди. У 1s також є вертикальні сусіди, тому вони стають +s, тоді як 0s мають лише горизонтальні сусіди, тому вони стають -s.


1

Python 3 , 336 байт

def g(s):
 h,j,s=' +|-+','',s.splitlines()
 s+=['']
 for n in range(len(s)):
  s[n]+=' '
  for i in range(len(s[n])-1):
   l,r,k=s[n][i-1],s[n][i+1],0
   try:u=s[n-1][i]
   except:u=' '
   try:d=s[n+1][i]
   except:d=' '
   if not s[n][i]==' ':
    k+=1
    if not u==d==' ':k+=1
    if not l==r==' ':k+=2
   j+=h[k]
  j+='\n'
 print(j)

Спробуйте в Інтернеті!

Мені довелося використовувати багато коду, щоб боротися з помилками крайнього випадку.


1

C (gcc) , 143 байт

char**y,*z,h,v;f(char**x){for(y=x;*y;++y)for(z=*y;*z;++z)if(*z-32){h=z[1]-32|z[-1]-32;v=y[1][z-*y]-32|y[-1][z-*y]-32;*z=h?v?43:45:(v?'|':43);}}

Спробуйте в Інтернеті!

Функція f змінює масив рядків на місці. Область навколо масиву має бути пробілами (трохи обмеженими). Незважаючи на те, що це не відповідає вимогам, які використовуються в більшості рішень, воно відповідає правилам, якщо ми говоримо, що ми представляємо новий рядок з двома пробілами (і беремо масив рядків, що закінчуються на нових рядках).

Безумовно

f(char**x){
    char **y;
    for (y = x; *y; ++y) {
        char *z;
        for (z = *y; *z; ++z) {
            if (*z != ' ') {
                if (z[1] != ' ' || z[-1] != ' ') {
                    // Horizontal exists
                    if (y[1][z-*y] != ' ' || y[-1][z-*y] != ' ')
                        // Vertical exists
                        *z = '+';
                    else
                        *z = '-';
                } else {
                    // Horizontal doesn't exist
                    if (y[1][z-*y] != ' ' || y[-1][z-*y] != ' ')
                        // Vertical exists
                        *z = '|';
                    else
                        *z = '+';
                }
            }
        }
    }
}

Це було цікавим викликом арифметики вказівника. За допомогою ітерації вказівника у стилі С легко отримати горизонтальних сусідів, але вертикальні були жорсткішими. На щастя, покажчик y все ще знаходиться навколо (що вказує на початкове значення z), тому я можу вивести з нього свій індекс і використовувати його для доступу до того ж елемента в іншому рядку. Дуже неправильно було писати, y[-1][z-*y]бо летить перед будь-яким розумним стилем!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.