เครื่องกำเนิดไฟฟ้าสี่แยก


26

นี่คือ ASCII-art ของสี่แยกสี่ทาง:

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

(โปรดสังเกตว่าถนนในแนวนอนมีความสูง 3 แถวในขณะที่ถนนแนวตั้งมีความกว้าง 5 คอลัมน์เพื่อเหตุผลด้านสุนทรียภาพเนื่องจากตัวอักษรรูปสี่เหลี่ยมผืนผ้า)

ความท้าทายของคุณคือการผลิตงานศิลปะ ASCII นี้ อย่างไรก็ตามอย่างที่ฉันแน่ใจว่าทุกคนรู้ว่าไม่ใช่ทุก ๆ สี่แยกที่มีถนนที่เดินทางไปในทุกทิศทาง ทางแยกนี้ไปโดยเฉพาะNESWแต่ทางแยกบางอย่างอาจไปเช่นNW:

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

หรืออาจจะไปSWE:

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

หรืออาจเป็นไปEได้เพียงทิศทางเดียว (แม้ว่าคุณจะไม่สามารถเรียกสิ่งนี้ได้ว่าเป็นจุดตัดแต่พยายามหลีกเลี่ยงการใช้ความรุนแรงมากเกินไป):

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

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่สามารถสร้างใด ๆของการรวมกันเหล่านี้ โดยเฉพาะอย่างยิ่งความท้าทายของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เส้นทางที่ประกอบด้วยเส้นทางNESWเข้าและออกหรือส่งกลับศิลปะ ASCII นี้ของทางแยกที่มีถนนที่ชี้ไปในทิศทางเหล่านั้น เส้นทางเหล่านี้อาจปรากฏในลำดับใด ๆ แต่การป้อนข้อมูลจะไม่ได้มีตัวอักษรใด ๆ ยกเว้นN, E, หรือS Wหากคุณต้องการคุณอาจขอให้อินพุตเป็นตัวพิมพ์เล็กแทน แต่คุณต้องระบุสิ่งนี้ในคำตอบของคุณ คุณอาจสมมติว่าอินพุตทั้งหมดจะมีทิศทางอย่างน้อยหนึ่งทิศทาง

ตัวอย่างสุดท้ายมีช่องว่างนำหน้าในแต่ละบรรทัดเนื่องจากไม่มีถนนที่ไปทางตะวันตก หากคุณไม่มีถนนที่ไปทางตะวันตกช่องว่างชั้นนำเหล่านี้เป็นทางเลือก นี้:

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

ก็จะเป็นผลลัพธ์ที่ยอมรับได้ ในทำนองเดียวกันถ้าNหรือSหายไปบรรทัดว่างในสถานที่นั้นเป็นตัวเลือก หนึ่งขึ้นบรรทัดใหม่ที่ได้รับอนุญาตและช่องว่างต่อท้ายได้รับอนุญาตตราบใดที่ส่งออกเป็นสายตาเดียวกัน

คุณสามารถรับอินพุตและเอาต์พุตในรูปแบบที่เหมาะสมเช่น STDIN / STDOUT, บรรทัดคำสั่ง, ไฟล์, อาร์กิวเมนต์ของฟังก์ชัน / ค่าส่งคืนเป็นต้น

ตามปกตินี่คือดังนั้นพยายามหาคำตอบที่สั้นที่สุดในภาษาที่คุณใช้!

ตัวอย่าง IO:

NESW:

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


NS:

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

S:

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

EW:

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

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

อนุญาตให้ใช้ช่องว่างต่อท้ายได้ (เช่นไม่มีE) อนุญาตNหรือSไม่ใช้บรรทัดนำหน้าและต่อท้ายหากไม่มีหรือไม่
Greg Martin

@GregMartin ใช่ได้รับอนุญาต ดูการแก้ไขของฉัน
DJMcMayhem

เกี่ยวข้องกับรางคุณเตือนฉันของรหัสนี้ฉันส่วนใหญ่เขียนสำหรับการแยกถนนในเกม roguelike: github.com/CleverRaven/Cataclysm-DDA/blob/master/src/
Sparr

คำตอบ:


10

Javascript (ES6), 190 187 185 ไบต์

นี่คือความพยายามในการสร้างตัวละคร ASCII นี้ต่อตัวละครโดยทำซ้ำในเมทริกซ์ 17x15 ดังนั้นผลลัพธ์จะถูกสร้างขึ้นจาก 15 แถวจาก 17 คอลัมน์โดยมีจุดตัดของถนนที่กึ่งกลาง

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 และแสดงความคิดเห็น

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

มดลูก

ด้านล่างเป็นเมทริกซ์พร้อมพิกัดที่ใช้ในรหัส

มดลูก

การสาธิต

ตัวอย่างต่อไปนี้อนุญาตให้ลองกำหนดค่าถนน

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 ไบต์

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)

รับอินพุตเป็นสตริงของตัวอักษรพิมพ์ใหญ่ปลดเปลื้องมันเป็นcharอาร์เรย์ โครงสร้างว่า "เหนือ" ส่วนที่ผ่านการวนลูปจากไป0 4แต่ละลูปจะสร้างสตริง 5 ช่องว่าง (หากW/ 87มีอยู่ในอินพุต) เก็บข้อมูล$xนั้นจากนั้น| |(เก็บไว้ใน$w) หรือ| | |ขึ้นอยู่กับว่าเราอยู่ในปัจจุบันหรือคี่ อาร์เรย์ของสตริงที่ถูกเก็บไว้ใน$nและคูณด้วยไม่ว่าจะเป็นN/ 78คือ-inการป้อนข้อมูล ที่จะตรวจสอบว่า$nมีการวางท่อหรือไม่

จากนั้นเราสร้างส่วนตรงกลาง บรรทัดแรก$zคือ "top" ของเส้นทางตะวันออก - ตะวันตกโดยใช้ตรรกะเดียวกันWและE/ 69และล้อมรอบด้วย parens เพื่อวางสำเนาบนไปป์ไลน์ เราใช้ตัวแปรตัวช่วย$yเพื่อบันทึกไบต์บน-----ส่วนต่างๆ

บรรทัดถัดไปเป็นจำนวนช่องว่างที่เหมาะสม (เช่น$x) การต่อสตริงเข้ากับท่อความกว้างที่ถูกต้อง (เช่น$w) จากนั้นเส้นกลางลายอีกครั้งด้วยWและEตรรกะและ$wกรอกตรงกลาง จากนั้น$x+$wและ$zอีกครั้ง

สุดท้ายตั้งแต่ถนนใต้เป็นเช่นเดียวกับทิศตะวันตกเฉียงเหนือที่ใส่$nในท่อถ้าS/ เป็น83-in $a

สตริงผลลัพธ์ทั้งหมดเหล่านั้นจะถูกรวบรวมจากไปป์ไลน์และเอาท์พุทเป็นนัยในตอนท้ายของการดำเนินการโปรแกรม ละเมิดWrite-Outputตัวคั่นเริ่มต้นเพื่อแทรกบรรทัดใหม่ระหว่างองค์ประกอบ


ตัวอย่าง

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 bytes

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
ผู้ประกอบการประกอบไปด้วยศักดิ์สิทธิ์ศักดิ์สิทธิ์แบทแมน!

เรารู้อยู่เสมอว่ามันดีสำหรับบางสิ่ง
David Schwartz

การแทนที่strchrด้วยindexจะทำให้มีการโกนมากขึ้น กำหนดxและyรวมกันนอกforลูป
วอยชิก Migda

2

Python 3, 186 ไบต์

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'

คำอธิบายที่จะปฏิบัติตาม


2

อยู่ 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

มันแค่สร้างส่วนต่าง ๆ ถ้าตัวละครที่เหมาะสมอยู่ในบรรทัด
ใช้@แทน\nและย่อย\nกลับมาในตอนท้าย
ส่วนทางทิศเหนือและทิศใต้เหมือนกันดังนั้นฉันจึงใช้ฟังก์ชั่นเพื่อแทรกเข้าไป


2

แบตช์351 344 341 ไบต์

@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%^|  ^|  ^|

หมายเหตุ: บรรทัดset t=สิ้นสุดในห้าช่องว่างและบรรทัดif "%i:e=%"=="%i%" set r=สิ้นสุดในช่องว่าง รับอินพุตแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่จาก STDIN แก้ไข: บันทึก 7 ไบต์โดยการกำจัดdตัวแปร บันทึก 3 ไบต์โดยใช้การforวนซ้ำเพื่อพิมพ์ส่วนตรงกลาง หากฉันอนุญาตให้ใช้พารามิเตอร์บรรทัดคำสั่งแยกกันแทน326 319 316 ไบต์:

@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 ไบต์

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=[],[],[]m=t=s=[]อาจจะเป็น
Yytsi

range(5)สามารถบันทึกลงในตัวแปรและใช้สองครั้งแทนที่จะพิมพ์range(5)สองครั้ง
Yytsi

มีmไว้เพื่ออะไร
Oliver Ni

@TuukkaX ด้วยเหตุผลบางอย่างที่ทำให้t=s=[]ทุกอย่างยุ่งขึ้น
Daniel

1
ตอนนี้ฉันมั่นใจว่าโดยการทำm=t=s=[]พวกเขาทั้งหมดชี้ไปที่การอ้างอิงเดียวกัน
Yytsi


1

Pyth ( 385 380 373 353 ไบต์)

แข็งแรงเล่นกอล์ฟ:

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

แน่นอนถ้ามีการปรับปรุงใด ๆ โปรดบอกฉัน

บันทึก 5 ไบต์ขอบคุณ Maltysen

คุณสามารถลองได้ที่นี่


คุณสามารถใช้KแทนNและจากนั้นเมื่อกำหนดเป็นครั้งแรกคุณไม่จำเป็นต้องใช้=และช่วยคุณประหยัด byte
Maltysen

ยังN[:-1]เป็นP
Maltysen

0

Groovy (274 ไบต์)

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}:[])
}

แข็งแรงเล่นกอล์ฟ

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}:[])}

ลองทำดู: https://groovyconsole.appspot.com/script/5082600544665600

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.