Лабиринт, генерирующий один вкладыш

15

Знаменитый основной лайнер C64

10 PRINT CHR$(205.5+RND(1)); : GOTO 10

печатает лабиринт косой черты и обратной косой черты.

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

Прочитайте в таком лабиринте из диагональных стен от stdin и распечатайте тот же лабиринт с горизонтальными и вертикальными стенами, состоящий из символа стены "#"

Например маленький лабиринт

/\\
\\/
///

переводит на

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

     #####    

Чтобы быть точным, каждый изолированный сегмент стены имеет длину пять символов, смежные сегменты стены имеют угол. Перемещение символа вправо / влево / вверх / вниз в матрице слешей и обратных слешей соответствует диагональному переводу на 2 символа по вертикали и 2 символа по горизонтали в # -матрице.

mschauer
источник
Другой пример вывода, вероятно, будет полезен. И я ожидаю, что название должно быть "один лайнер".
Увлечения Кэлвина
Будет ли входной лабиринт всегда прямоугольником? Не могли бы вы привести более крупный пример, чтобы мы могли видеть расстояние?
xnor
2
Добро пожаловать в раздел Программирование головоломок и обмена стеками Code Golf! Отличная первая задача, но несколько вещей: может ли ввод / вывод быть чем-то отличным от STDIN / STDOUT (например, в качестве аргумента функции и возвращаемого значения)? Могут ли строки быть разделены символом, отличным от символов новой строки?
Ручка двери
2
Использование stdin и stdout обязательно, если возможно, в противном случае «ближайший эквивалент». Есть ли основания ослаблять допущение новой строки?
Мшауер
1
Связанный: codegolf.stackexchange.com/q/37390/194 , codegolf.stackexchange.com/q/21730/194
Питер Тейлор

Ответы:

5

Python 3, 226 224 байта

Мой первый Python Golf, так что, вероятно, очень неоптимальный. Он генерирует много пробелов, но предшествующих строк нет, и не более двух предшествующих пробелов. Ввод необходимо вводить вручную из командной строки (возможно, кто-то знает более короткий способ получения многострочного ввода в Python ...).

e,z,s=enumerate,'0',list(iter(input,""))
p=''.join(s)*5
r=[len(p)*[' ']for _ in p]
for y,l in e(s):
 for x,c in e(l):
  for i in range(-2,3):r[2*(x+y+(s>[z]))+i*(c>z)][2*(x+len(s)-y)+i*(c<z)]='#'
for l in r:print(''.join(l))

Идея состоит в том, чтобы инициализировать огромный массив пробелов r, затем выполнить итерацию по входным данным и заменить пробелы #нужным, и, наконец, распечатать весь массив. Уловка, которую я использовал, состоит в том, чтобы сравнивать символы z = '0'вместо проверки равенства с '/'или '\', что экономит кучу байтов.

Zgarb
источник
1

Юлия, 258 байт

Функциональное решение ...

A=split(readall(STDIN))
q(i,j)=fld(i-1,j)
n,^ =A[].(3),q
f(i,j)=try A[1+i^5][1+j^5]<'0'?(i+j)%5==1:(i-j)%5==0catch 0end
h(i,j)=f(i+i^4,j)|f(i+(i-1)^4,j)
g(i,j)=h(i,j+j^4)|h(i,j+(j-1)^4)
for i=1:6length(A),j=-n-5:2n;print(" #"[1+g(i-j,i+j)],j==2n?"\n":"")end

В порядке появления: fзакрывает '/' и '\' своими 5 * 5-битными шаблонами, hскладывает каждую пятую и следующую строки в одну строку (напомним, что "соседние сегменты стены имеют угол") и gделает то же самое для столбцов. Наконец, i-j,i+jвращается картина.

mschauer
источник
1

JavaScript (ES6), 258

Функция с лабиринтом в качестве параметра, возвращающая результат.

Не уверен, что это правильно, из-за правил ввода / вывода (в любом случае это было весело)

f=m=>([...m].map(c=>{if(c<' ')x=sx-=2,y=sy+=2;else for(x+=2,y+=2,d=c>'0',i=y-3*d,j=x-3*!d,c=5;c--;)o[i+=d][j+=!d]='#';},w=m.search`
`,h=m.match(/\n/g).length,sy=y=0,sx=x=h*2,o=Array(z=(w+h+1)*2).fill(' ').map(x=>Array(z).fill(x))),o.map(r=>r.join``).join`
`)

// LESS GOLFED

U=m=>(
  w=m.search`\n`,
  h=m.match(/\n/g).length,
  o=Array(z=(w+h+1)*2).fill(' ').map(x=>Array(z).fill(x)),
  sy=y=0,
  sx=x=h*2,
  [...m].forEach(c=>{
    if(c<' ')x=sx-=2,y=sy+=2
    else for(x+=2,y+=2,d=c>'0',i=y-3*d,j=x-3*!d,c=5;c--;)o[i+=d][j+=!d]='#';
  }),
  o.map(r=>r.join``).join`\n`  
)

// TEST
out=x=>O.innerHTML+=x+'\n'

test=`\\\\/\\\\\\//\\/\\////\\\\/\\/
\\/\\///\\\\///////\\//\\/
/\\\\\\//\\//\\////\\\\//\\\\
\\////\\//\\//\\/\\\\\\\\\\\\/
/\\/\\\\///\\\\\\\\/\\\\\\\\/\\\\
\\/\\//\\\\\\\\\\\\//\\/\\////
/\\//\\\\///\\/\\///\\////
\\/\\\\\\//\\\\/\\\\\\//\\\\/\\/
//////\\\\/\\\\/\\/\\/\\///
\\\\/\\/\\\\////\\/\\/\\\\/\\/`
out(test),out(f(test))
<pre id=O></pre>

edc65
источник