4 yollu kavşak jeneratörü


26

İşte 4 yollu bir kavşağın ASCII sanatı:

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

(Yatay yolların 3 satır yüksekliğinde, dikey yollar 5 sütun genişliğinde olduğunu unutmayın. Bu, dikdörtgen yazı tipinden dolayı estetik nedenlerden dolayıdır.)

Buradaki zorluk bu ASCII sanatını üretmektir. Ancak, hepinizin bildiğinden emin olduğum gibi, her kavşağın her yöne giden bir yolu yoktur. Bu belirli kavşak gider NESW, ancak bazı kavşaklar gidebilir, örneğin NW:

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

Ya da gidebilir SWE:

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

Ya da Esadece tek bir yöne bile gidebilir (buna bir kesişme bile diyemezsiniz , ancak aşırı bilgiçlik yapmaktan kaçının).

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

Bu kombinasyonlardan herhangi birini kolayca oluşturabilecek bir program veya fonksiyon yazmanız gerekir . Daha spesifik olarak, zorluğunuz, NESWgirişten ibaret olan ve bu kesişme yolundaki bu kesişme sanatını çıkaran ya da veren, bir yol tarifi alan bir program ya da işlev yazmaktır . Bu talimatlar herhangi bir sırada görünebilir, ancak giriş olmayacak dışında karakterler içeriyor N, E, S, veya W. İsterseniz, bunun yerine girdilerin küçük harf olmasını isteyebilirsiniz, ancak bunu cevabınızda belirtmelisiniz. Tüm girişlerin en az bir yön içereceğini de varsayabilirsiniz.

Son örnekte her satırda öncü boşluklar vardı, çünkü batıya giden yol yok. Batıya giden bir yolunuz yoksa, bu önde gelen alanlar isteğe bağlıdır. Bu:

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

Ayrıca kabul edilebilir bir çıktı olurdu. Benzer şekilde, gitmiş Nveya Sgitmişse, oradaki boş çizgiler isteğe bağlıdır. Bir izleyen yeni hatta izin verilir ve çıktı görsel olarak aynı olduğu sürece izlenen boşluklara izin verilir .

Giriş ve çıkışları, STDIN / STDOUT, komut satırı argümanları, dosyalar, fonksiyon argümanları / dönüş değerleri vb. Gibi herhangi bir makul formatta alabilirsiniz.

Her zaman olduğu gibi, bu , bu yüzden hangi dilde kullanıyorsanız kullanın, mümkün olan en kısa sürede cevap almayı deneyin!

Örnek io:

NESW:

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


NS:

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

S:

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

EW:

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

SE:
+-----+-----
|     |     
|     |- - -
|     |     
+-----+-----
|  |  |
|     |
|  |  |
|     |
|  |  |

Sondaki boşluklara da izin veriliyor mu ( Eörneğin, yoksa )? Hayır Nya da yoksa boş satırlara öncülük etme ve takip etme izni var Smı?
Greg Martin

@GregMartin Evet, bunlara izin verilir. Düzenlemeye bak.
DJMcMayhem

belirsiz bir şekilde ilgili, bana roguelike bir oyunda yol kavşakları için en çok yazdığım bu kodu hatırlatıyorsun: github.com/CleverRaven/Cataclysm-DDA/blob/master/src/…
Sparr

Yanıtlar:


10

Javascript (ES6), 190 187 185 bayt

Bu, 17x15'lik bir matriste yinelenerek karakter başına bu ASCII sanat karakterini oluşturma girişimidir. Bu nedenle, çıktı her zaman ortada ortalanmış olan yolların kesişmesiyle birlikte, 17 sütundan oluşan 15 sıradan oluşur.

p=>eval("for(y=15,s='';y--;s+=`\n`)for(x=17;x--;)s+=' |-+'[+[a=y>4,b=y<10,c=x>4,d=x<12].every((c,i)=>c|p.search('SNEW'[i])+1)&&!((z=x-8||y&1|a&b)&&z*z-9)+2*!((z=y-7||x&1|c&d)&&z*z-4)]")

Ungolfed ve yorum yaptı

for(y = 15, s = ''; y--; s += `\n`)   // iterate on y, from 14 to 0 / append line feeds
  for(x = 17; x--;)                   // iterate on x, from 16 to 0
    s += ' |-+' [                     // append next character to string
      +[ a = y > 4,                   // a = outside South area?
         b = y < 10,                  // b = outside North area?
         c = x > 4,                   // c = outside East area?
         d = x < 12 ]                 // d = outside West area?
      .every((c, i) =>                // for each area, see if either:
        c |                           //   - we're currently outside it
        p.search('SNEW' [i]) + 1      //   - or it's an allowed area (p = function param.)
      )                               // if all tests pass, add a:
      &&                              //   - vertical bar (encoded as 1) if:
      !((z = x - 8 || y & 1 | a & b)  //     - x=8, y is even and we're not in the middle
      && z * z - 9)                   //     - OR x=5 OR x=11 (<=> (x-8)*(x-8) = 9)
      + 2 *                           //   - horizontal bar (encoded as 2) if:
      !((z = y - 7 || x & 1 | c & d)  //     - y=7, x is even and we're not in the middle
      && z * z - 4)                   //     - OR y=5 OR y=9 (<=> (y-7)*(y-7) = 4)
    ]                                 // (vertical + horizontal = 3, which leads to '+')

Matris

Aşağıda kodda kullanılan koordinatları içeren matris bulunmaktadır.

matris

gösteri

Aşağıdaki kod parçası, herhangi bir yol yapılandırmasını denemeye izin verir.

let f =
p=>eval("for(y=15,s='';y--;s+=`\n`)for(x=17;x--;)s+=' |-+'[+[a=y>4,b=y<10,c=x>4,d=x<12].every((c,i)=>c|p.search('SNEW'[i])+1)&&!((z=x-8||y&1|a&b)&&z*z-9)+2*!((z=y-7||x&1|c&d)&&z*z-4)]")

function update() {
  document.getElementById("o").innerHTML = f(document.getElementById("s").value);
}
update();
<input id="s" size=4 value="NSEW" oninput="update()">
<pre id="o" style="font-size:9px"></pre>


8

PowerShell v3 +, 226 204 192 191 bayt

param([char[]]$a)($n=0..4|%{($x=' '*5*($b=87-in$a))+('|  |  |',($w='|     |'))[$_%2]})*(78-in$a)
($z=($y='-'*5)*$b+"+$y+"+$y*($c=69-in$a))
$x+$w
'- - -'*$b+$w+'- - -'*$c
$x+$w
$z
$n*(83-in$a)

Girdiyi büyük harflerden oluşan bir dizge olarak alır, açıkça bir chardizi olarak çevirir. "North" segmentini ile arasındaki döngülerle 0oluşturur 4. Her döngü, 5 boşluktan ( giriş W/ varsa) bir dize oluşturur , şu anda eşit mi yoksa garip mi olduğumuza bağlı olarak, onu ( sonra da saklanır ) veya içine kaydeder. Şeritlerinin bu dizi içine depolanır ve olmadığını ile çarpılır / olup girişi. Boru hattına yerleştirilip yerleştirilmediğini belirleyecektir .87$x| |$w| | |$nN78-in$n

Sonra orta kısmı inşa ederiz. İlk satır, $zdoğu-batı yolunun "üstü", Wve E/ için aynı mantığı kullanarak ve aynı 69zamanda boru hattına bir kopyasını yerleştirmek üzere parens ile çevrilidir. Bölümlerde $ybir bayt kaydetmek için yardımcı değişken kullanıyoruz -----.

Bir sonraki satır, $xdoğru genişlikteki borularla (yani) dize birleştirilmiş uygun sayıda boşluktur (yani $w). Sonra, orta şeritli çizgi, yine Wve ortada Emantık ve $wdoldurma ile. Sonra $x+$wve $ztekrar.

Son olarak, Güney yolun yana koymak, kuzeye aynıdır $neğer boru hattı üzerinde S/ 83olduğunu -in $a.

Elde edilen bu dizgilerin tümü boru hattından toplanır ve programın yürütülmesi sonunda çıktılar örtüktür. Write-OutputÖğeler arasına yeni bir satır eklemek için varsayılan sınırlayıcıyı kötüye kullanır.


Örnekler

PS C:\Tools\Scripts\golfing> .\4-way-intersection.ps1 'EN'
|  |  |
|     |
|  |  |
|     |
|  |  |
+-----+-----
|     |
|     |- - -
|     |
+-----+-----

PS C:\Tools\Scripts\golfing> .\4-way-intersection.ps1 'SNW'
     |  |  |
     |     |
     |  |  |
     |     |
     |  |  |
-----+-----+
     |     |
- - -|     |
     |     |
-----+-----+
     |  |  |
     |     |
     |  |  |
     |     |
     |  |  |

PS C:\Tools\Scripts\golfing> .\4-way-intersection.ps1 'WE'
-----+-----+-----
     |     |
- - -|     |- - -
     |     |
-----+-----+-----

4

C ++ 317 280 276 bayt

int i(char*j){for(int y=0;y<15;++y)for(int x=0;x<18;++x)putchar(x-17?y<5&!strchr(j,'N')|y>9&!strchr(j,'S')|x<5&!strchr(j,'W')|x>11&!strchr(j,'E')?' ' :x==5|x==11?y==5|y==9?'+':'|':y==5|y==9?x==5|x==11?'+':'-':x==8&y%2|y==7&x%2?' ':x==8&(y/5-1)?'|':y==7&(x/6-1)?'-':' ':'\n');}

Ungolfed:

int i (char* j)
{
  for (int y=0; y<15; ++y)
    for (int x=0; x<18; ++x)
      putchar(
        x-17 ? 
        y<5 & !strchr(j,'N') |
        y>9 & !strchr(j,'S') |
        x<5 & !strchr(j,'W') |
        x>11 & !strchr(j,'E') ? ' ' :
        x==5 | x==11 ? y==5 | y==9 ? '+' : '|' : 
        y==5 | y==9 ? x==5 | x==11 ? '+' : '-' : 
        x==8 & y%2 | y==7 & x%2 ? ' ' : 
        x==8 & (y / 5 - 1) ? '|' :
        y==7 & (x / 6 - 1) ? '-' :
        ' ' : '\n');
}

1
Kutsal iç içe üçlü operatörler, Batman!

Her zaman bir şey için iyi olacağını biliyorduk.
David Schwartz

Değiştirme strchrile indexbirkaç tıraş edecek. Dış döngüler tanımlayın xve ybirlikte for.
Wojciech Migda

2

Python 3, 186 bayt

S=' -- -  -- -  --'
lambda d:'\n'.join(S[r//4:15*('W'in d):3]+'||+  -  -| -  -  -||+'[r%4::3]+S[r//4:15*('E'in d):3]for r in[0,1,0,1,0,6,1,9,1,6,0,1,0,1,0][5-5*('N'in d):10+5*('S'in d)])

'NWS' gibi bir dizi yolla adlandırılan isimsiz bir lambda.

Takip açıklaması


2

sed 234

s,$,@+-----+@|     |@!     !@|     |@+-----+@,
:l;tl
/N/s,^,#,;t
:r
/S/s,@$,#,;t
/E/{s,!@,|- - -@,;s,+@,+-----@,g}
/W/{s,@!,@- - -|,;s,@+,@-----+,g;s,@|,@     |,g}
y,@!NSEW,\n|    ,
q
:
s,#,@|  |  |@|     |@|  |  |@|     |@|  |  |,
tr

Satırda uygun karakter varsa, sadece farklı parçaları oluşturur.
Kullanımları @yerine \nve subs \nsonunda arkaya.
Kuzey ve güney kısımları aynı, bu yüzden onları yerleştirmek için temelde bir işlev olanı kullanıyorum.


2

Toplu İş, 351 344 341 bayt

@echo off
set/pi=
set t=     
if not "%i:n=%"=="%i%" call:l
set l=-----
set r=%l%
if "%i:w=%"=="%i%" set l=%t%
if "%i:e=%"=="%i%" set r= 
for %%s in (%l%+-----+%r% "%t%|%t%|" "%l:--=- %|%t%|%r:--=- %" "%t%|%t%|" %l%+-----+%r%) do echo %%~s
if "%i:s=%"=="%i%" exit/b
:l
call :m
call :n
:n
echo %t%^|%t%^|
:m
echo %t%^|  ^|  ^|

Not: Çizgi set t=beş if "%i:e=%"=="%i%" set r=boşlukta , çizgi boşlukta bitiyor. STDIN'den büyük / küçük harf duyarlı girişi alır. Düzenleme: dDeğişkeni ortadan kaldırarak 7 bayt kaydedildi . forOrta bölümü yazdırmak için bir döngü kullanarak 3 bayt kaydedildi . Bunun yerine ayrı komut satırı parametrelerine izin verilirse, 326 319 316 bayt için:

@echo off
set t=%*
set/an=s=e=w=5,%t: ==%=0
set t=     
call:%n%
set r=-----%t%
call set l=%%r:~%w%,5%%
call set r=%%r:~%e%%%
for %%s in (%l%+-----+%r% "%t%|%t%|" "%l:--=- %|%t%|%r:--=- %" "%t%|%t%|" %l%+-----+%r%) do echo %%~s
goto %s%
:0
call :1
call :2
:2
echo %t%^|%t%^|
:1
echo %t%^|  ^|  ^|
:5

1

Python 2, 290 bayt

t,s,r,i=[],[],range(5),raw_input()
for n in r:t+=[" "*5*("W"in i)+"|  "+("|"," ")[n%2]+"  |"]
exec"s+=['-'*5];s[:1]+=' '*5,;"*2;s[:2]+="- - -",
if"N"in i:print'\n'.join(t)
print'\n'.join([s[n]*("W"in i)+("|     |","+-----+")[`n`in"04"]+s[n]*("E"in i)for n in r])
if"S"in i:print'\n'.join(t)

m,t,s=[],[],[]olabilir m=t=s=[].
Yytsi

range(5)bir değişkene kaydedilebilir ve iki kez yazmak yerine range(5)iki kez kullanılabilir.
Yytsi

Ne miçin?
Oliver Ni

@TuukkaX, bir nedenden ötürü t=s=[]herşeyi mahvetti
Daniel

1
Artık eminim ki m=t=s=[], hepsi aynı referansı gösterir.
Yytsi

1

GolfScript, 154 bayt

{a?1+}:x;'-'5*:e;' '5*:b;"+"e+"+"+:f;{b'|'b'|'b n}:k;{'W'x{e}{b}if\'E'x{e}{}if n}:y;{x{b"|  |  |
"+:c k c k c}{}if}:z;1/:a;'N'z f y k'|'b+'|'+ y k f y'S'z

Çevrimiçi deneyin!


Etkileyici, bunun nasıl oy kullandığı hakkında hiçbir fikrim yok.
Magic Octopus Urn

1

Pyth ( 385 380 373 353 bayt)

golfed:

K"     |  |  |\n     |     |\n"?}\Nz++KKPKk?}\Wz?}\Ez+++*5\-*2+\+*5\-"\n     |     |\n- - -|     |- - -\n     |     |\n"+*5\-*2+\+*5\-++*2+*5\-\+"\n     |     |\n- - -|     |\n     |     |\n"*2+*5\-\+?}\Ez+"     "+*2+\+*5\-"\n     |     |\n     |     |- - -\n     |     |\n     +-----+-----"++"     +-----+\n"*3"     |     |\n""     +-----+"?}\Sz++KKPKk

Ungolfed:

K"     |  |  |\n     |     |\n"  //sets K to first two lines of north
?}\Nz                            //if north in the input 
  ++KKPK                         //then: return K + K + K[:-1]
  k                              //else: return ""
?}\Wz                            //if West in input
  ?}\Ez                          //if East in input
    +++*5\-*2+\+*5\-"\n     |     |\n- - -|     |- - -\n     |     |\n"+*5\-*2+\+*5\-    //then: Return E+W string
    ++*2+*5\-\+"\n     |     |\n- - -|     |\n     |     |\n"*2+*5\-\+         //else: Return W string
  ?}\Ez                          //else: if east in input (and not W)
    +"     "+*2+\+*5\-"\n     |     |\n     |     |- - -\n     |     |\n     +-----+-----" //return East without West String
    ++"     +-----+\n"*3"     |     |\n""     +-----+" \\Return empty left and right intersection
?}\Sz                            //if south in input
  ++KKPK                         //return north string
  k                              //return ""

Tabii ki, herhangi bir gelişme varsa, lütfen söyle.

Maltysen sayesinde 5 bayt kaydedildi

Burada deneyebilirsiniz


Kullanabileceğiniz Kyerine Nilk kez atarken sonra ve, bir kullanmak zorunda değilsiniz =size byte tasarruf
Maltysen

Ayrıca, N[:-1]birP
Maltysen

0

Groovy (274 Bayt)

Ungolfed

r{
    l->
    t='+-----+'
    s='     ';
    m='|     |'
    x='-----'
    v=(1..5).collect{s}
    nsR=(1..5).collect{[s,((it%2)?'|  |  |':m),s]}
    ewR=[x,s,'- - -',s,x]
    c=[l[3]?ewR:v,[t,m,m,m,t],l[1]?ewR:v]
    (l[0]?nsR.collect{it}:[])+((0..4).collect{x->((0..2).collect{y->c[y][x]})}​)​+​(l[2]?nsR.collect{it}:[])
}

golfed

def i(l) {t='+-----+';s='     ';m='|     |';x='-----';v=(1..5).collect{s};n=(1..5).collect{[s,((it%2)?'|  |  |':m),s]};e=[x,s,'- - -',s,x];c=[l[3]?e:v,[t,m,m,m,t],l[1]?e:v];(l[0]?n.collect{it}:[])+((0..4).collect{x->((0..2).collect{y->c[y][x]})}​)​+​(l[2]?n.collect{it}:[])}

Deneyin: https://groovyconsole.appspot.com/script/5082600544665600

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.