Лабіринт генерує один лайнер


15

Відомий C64 basic один вкладиш

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

друкує лабіринт косою рисою та зворотною косою рисою.

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

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

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

/\\
\\/
///

перекладається на

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

     #####    

Якщо бути точним, кожен ізольований відрізок стіни має довжину п'ять символів, сусідні сегменти стіни ділять кут. Переміщення символу вправо / вліво / вгору / вниз у матриці косої риски та зворотньої косої риски відповідає діагональному перекладу двома символами у вертикальному напрямку та 2 символами в горизонтальному напрямку в # -матриці.


Можливо, буде корисний ще один вихідний приклад. І я очікую, що заголовок повинен бути "одним лайнером".
Захоплення Кальвіна

Чи завжди вхідний лабіринт буде прямокутником? Чи можете ви навести більший приклад, щоб ми могли бачити відстань?
xnor

2
Ласкаво просимо до обміну головоломки та обміну гольфу для коду! Великий перший виклик, але декілька речей: чи може введення / вихід бути чимось іншим, ніж STDIN / STDOUT (наприклад, як аргумент функції та повернене значення)? Чи можна розділити лінії за допомогою символу, відмінного від нових рядків?
Дверна ручка

2
Використання stdin та stdout обов'язково, якщо можливо, інакше "найближчий еквівалент". Чи є причини послабити припущення про новий рядок?
mschauer

Відповіді:


5

Python 3, 226 224 байт

Мій перший гольф Python, напевно, дуже неоптимальний. Він створює безліч пробільних пробілів, але немає попередніх нових рядків і не більше двох попередніх пробілів. Введення потрібно дати вручну з командного рядка (можливо, хтось знає коротший спосіб отримати багаторядковий вхід в 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'а не перевіряти рівність '/'або '\', що економить купу байтів.


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обертає картинку.


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>

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