Labirynt generujący jedną wkładkę


15

Słynna podstawowa podszewka C64

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

drukuje labirynt ukośników i odwrotnych ukośników.

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

Przeczytaj w takim labiryncie wykonanym z ukośnych ścian ze standardowego ekranu i wydrukuj ten sam labirynt z poziomymi i pionowymi ścianami składającymi się ze znaku ściany „#”

Na przykład mały labirynt

/\\
\\/
///

przetłumaczyć na

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

     #####    

Mówiąc ściślej, każdy izolowany segment ściany ma długość pięciu znaków, przylegające segmenty ściany mają wspólny narożnik. Przesunięcie znaku w prawo / lewo / góra / dół w matrycy ukośników i ukośników odwrotnych odpowiada translacji po przekątnej o 2 znaki w pionie i 2 znaki w kierunku poziomym w macierzy #.


Przydałby się prawdopodobnie inny przykładowy wynik. I spodziewam się, że tytuł powinien brzmieć „jedna linijka”.
Calvin's Hobbies

Czy labirynt wejściowy zawsze będzie prostokątem? Czy możesz podać większy przykład, abyśmy mogli zobaczyć odstępy?
xnor

2
Witamy w Programowaniu łamigłówek i wymianie stosów kodów golfowych! Świetne pierwsze wyzwanie, ale kilka rzeczy: czy wejście / wyjście może być czymś innym niż STDIN / STDOUT (np. Jako argument funkcji i wartość zwracana)? Czy linie można rozdzielać za pomocą znaku innego niż znak nowej linii?
Klamka

2
Używanie stdin i stdout jest obowiązkowe, jeśli to możliwe, w przeciwnym razie „najbliższy odpowiednik”. Czy istnieją powody, by osłabić założenie nowej linii?
mschauer

Odpowiedzi:


5

Python 3, 226 224 bajty

Mój pierwszy golf w Pythonie, więc prawdopodobnie bardzo nieoptymalny. Tworzy mnóstwo spacji końcowych, ale nie ma poprzedzających znaków nowej linii i co najwyżej dwóch poprzedzających spacji. Dane wejściowe należy podawać ręcznie z wiersza poleceń (być może ktoś zna krótszy sposób uzyskania wejścia wieloliniowego w Pythonie ...).

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))

Chodzi o to, aby zainicjować ogromną tablicę spacji r, a następnie iterować dane wejściowe i zamieniać spacje #w razie potrzeby, a na końcu wydrukować całą tablicę. Sztuczka, której użyłem, to porównanie znaków z = '0'zamiast testowania równości do '/'lub '\', co pozwala zaoszczędzić sporo bajtów.


1

Julia, 258 bajtów

Funkcjonalne rozwiązanie ...

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

W kolejności pojawiania się: fobejmuje „/” i „\” ich 5 * 5 bitowymi wzorami, hskłada co piąty i następną linię w jedną linię (przywołaj „sąsiednie segmenty ściany dzielą róg”) i grobi to samo dla kolumn. Na koniec i-j,i+jobraca obraz.


1

JavaScript (ES6), 258

Funkcja z labiryntem jako parametrem, zwracająca dane wyjściowe.

Nie jestem pewien, czy jest poprawny, z powodu reguł wejścia / wyjścia (i tak było fajnie)

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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.