Bir astar üreten labirent


15

Ünlü C64 temel tek astar

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

eğik çizgi ve ters eğik çizgi bir labirent yazdırır.

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

Stdin çapraz duvarlardan yapılmış böyle bir labirent okuyun ve duvar karakteri "#" oluşan yatay ve dikey duvarlar ile aynı labirent yazdırın

Örneğin küçük labirent

/\\
\\/
///

Çevirir

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

     #####    

Kesin olmak gerekirse, her yalıtılmış duvar parçasının uzunluğu beş karakterdir, bitişik duvar segmentleri bir köşeyi paylaşır. Eğik çizgi ve ters eğik çizgi matrisinde bir karakteri sağa / sola / yukarı / aşağı hareket ettirmek, # matrisinde dikey olarak 2 karakter ve yatay yönde 2 karakter olmak üzere çapraz çeviriye karşılık gelir.


Başka bir çıktı örneği muhtemelen yararlı olacaktır. Ve başlığın "bir astar" olmasını bekliyorum.
Calvin'in Hobileri

Giriş labirenti her zaman dikdörtgen olacak mı? Boşluğu görebilmemiz için daha büyük bir örnek verebilir misiniz?
xnor

2
Programlama Bulmacalar ve Kod Golf Stack Exchange hoş geldiniz! Büyük ilk meydan okuma, ama birkaç şey: giriş / çıkış STDIN / STDOUT (örneğin bir işlev argümanı ve dönüş değeri olarak) dışında bir şey olabilir mi? Satırlar, yeni satırlar dışındaki bir karakterle ayrılabilir mi?
Kapı tokmağı

2
Mümkünse stdin ve stdout kullanmak zorunludur, aksi takdirde "en yakın eşdeğer". Yeni satır varsayımını zayıflatmak için nedenler var mı?
mschauer

Yanıtlar:


5

Python 3, 226224 bayt

Benim ilk Python golf, muhtemelen çok alt-optimal. Çok fazla izleyen boşluk oluşturur, ancak önceki satırlar ve en fazla iki önceki alan yoktur. Girişin komut satırından elle verilmesi gerekir (belki birisi Python'da çok satırlı giriş almanın daha kısa bir yolunu bilir ...).

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

Fikir, çok sayıda boşluk başlatmak r, ardından giriş boyunca yineleme yapmak ve boşlukları# gerektiği gibi ve son olarak tüm diziyi yazdırmaktır. Kullandığım bir numara, z = '0'eşitliği test etmek yerine '/'veya '\'bir dizi bayt kaydeden karakterleri karşılaştırmaktır .


1

Julia, 258 bayt

İşlevsel bir çözüm ...

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

Görünüş sırasına göre: f'/' ve '\' 5 * 5 bit desenlerini kapsar, hher beşinci ve bir sonraki satırı tek bir satıra katlar ("bitişik duvar segmentleri bir köşeyi paylaşır" hatırlayın) ve gsütunlar için aynısını yapar. Son olarak, i-j,i+jresmi döndürür.


1

JavaScript (ES6), 258

Labirenti parametre olarak döndüren ve çıktıyı döndüren bir işlev.

Giriş / çıkış kuralları nedeniyle geçerli olduğundan emin değilim (yine de eğlenceliydi)

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.