Zeichnen und beschriften Sie ein hexagonales ASCII-Gitter

12

In meiner vorherigen Herausforderung habe ich das erste Diagramm größtenteils von Hand gezeichnet (mithilfe des visuellen Blockmodus von vim). Aber es muss doch einen besseren Weg geben ...


Bei einer Eingabe von zwei Dimensionen, einer Breite und einer Höhe, wird in ASCII-Grafik ein hexagonales Raster mit diesen Dimensionen ausgegeben.

Hier ist das Diagramm, auf das im Intro verwiesen wird (mit geringfügigen Änderungen), das Ihre Ausgabe für die Eingabe sein sollte width=7, height=3:

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -2,-1 \_____/  0,-1 \_____/  2,-1 \_____
 /     \       /     \       /     \       /     \
/ -3,-1 \_____/ -1,-1 \_____/  1,-1 \_____/  3,-1 \
\       /     \       /     \       /     \       /
 \_____/ -2,0  \_____/  0,0  \_____/  2,0  \_____/
 /     \       /     \       /     \       /     \
/ -3,0  \_____/ -1,0  \_____/  1,0  \_____/  3,0  \
\       /     \       /     \       /     \       /
 \_____/ -2,1  \_____/  0,1  \_____/  2,1  \_____/
 /     \       /     \       /     \       /     \
/ -3,1  \_____/ -1,1  \_____/  1,1  \_____/  3,1  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/

Beachten Sie einige Dinge:

  • Die Breite und Höhe entsprechen im Wesentlichen der Anzahl der Sechsecke für eine gegebene y- bzw. x-Koordinate. Dies sind immer ungerade Zahlen.

  • Jedes Sechseck wird durch die ASCII-Kunst dargestellt

      _____
     /     \
    /       \
    \       /
     \_____/
    

    aber Grenzen werden zwischen benachbarten Sechsecken "geteilt".

  • Das Komma in den Koordinaten ist immer genau zwei Zeichen unterhalb der Mitte der Oberkante. Die x-Koordinate wird dann direkt vor dem Komma und die y-Koordinate direkt danach positioniert.

    Sie können davon ausgehen, dass die Koordinaten niemals so groß werden, dass sie die Sechskantgrenzen überlappen.

Die Eingabe kann als durch Leerzeichen / Komma getrennte Zeichenfolge, als Array von Ganzzahlen oder als Argument für zwei Funktionen / Befehlszeilen erfolgen. Die Ausgabe muss eine einzelne Zeichenfolge sein (an STDOUT als Rückgabewert usw.).

Da es sich um , wird der kürzeste Code in Bytes gewinnen.

Das obige Raster kann als Testfall verwendet werden. Es width=199, height=199ist offensichtlich unpraktisch, das Raster mit der maximalen Größe hier einzuschließen, aber die ersten paar Zeilen und Spalten sollten wie folgt aussehen:

         _____         ___
        /     \       /   
  _____/-98,-99\_____/-96,
 /     \       /     \    
/-99,-99\_____/-97,-99\___
\       /     \       /   
 \_____/-98,-98\_____/-96,
 /     \       /     \    
/-99,-98\_____/-97,-98\___
\       /     \       /   
 \_____/-98,-97\_____/-96,
 /     \       /     \    
/-99,-97\_____/-97,-97\___
\       /     \       /   
Türknauf
quelle
Related
Alex A.

Antworten:

2

Ruby, 221 Bytes

->w,h{s=' '
a=(s*9+?_*5)*(w/2)+$/
(2-h*2).upto(h*2+3){|y|c=y<4-h*2 
a+=[b=c ?s:?\\,s+b,s,''][y%4]
(0-w/2).upto(w/2){|x|a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",s*7,?_*5,"/     \\"][(y+x*2+w)%4]%[x,y/4]}
a+='//  '[c ?3:y%4]+$/}
a}

Ungolfed im Testprogramm

f=->w,h{
  s=' '                                #set s to space for golfing reasons
  a=(s*9+?_*5)*(w/2)+$/                #start building the output with a row of just _ and space

  (2-h*2).upto(h*2+3){|y|              #iterate 4 times for each row of hexagons, plus an extra 2 at the end to finish last row
    c=y<4-h*2                          #condition for first two rows
    a+=[b=c ?s:?\\,s+b,s,''][y%4]      #string to be output before main set of hexagons (spaces for top row, \ for certain other rows

    (0-w/2).upto(w/2){|x|              #iterate through hexagons on each row, 4 lines for each with the following printf type string
      a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",#line 1:contains ends / \ and numbers 
         s*7,                          #line 2 padding spaces
         ?_*5,                         #line 3 padding ___
         "/     \\"][(y+x*2+w)%4]%     #line 0 top of hexagon / \; formula to select string to be printed
           [x,y/4]                     #numbers to be printed (if format for current line does not require them they are ignored)
    }

    a+='//  '[c ?3:y%4]+$/             #ending alternates between / and space; / are suppressed for first two rows
  }
  a
}

puts g[7,3]
puts g[5,5]

Ausgabe

Als ich mit dem Debuggen fertig war, bemerkte ich eine Mehrdeutigkeit in der Spezifikation. Wo w+1durch 4 teilbar ist, sind die ersten und letzten x-Koordinaten ungerade und es gibt keine Mehrdeutigkeit. Wo w-1aber durch 4 teilbar ist, sind die ersten und letzten x Koordinaten gerade. Ich ging davon aus, dass die erste und die letzte Spalte unter den nächsten versetzt sein sollten. Aber dann habe ich die vorherige Frage gelesen und festgestellt, dass in diesem Fall die ungeraden Spalten unter den geraden versetzt werden sollten (Anmerkung für w-1durch 4 teilbar, es ist nicht möglich, beide zu tun.)

Diese Unterscheidung wurde in dieser Frage jedoch nicht getroffen. Ich überlasse dies dem Urteil von OP und überarbeite es gegebenenfalls, obwohl ich es vorziehen würde, es nicht zu müssen.

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -2,-1 \_____/  0,-1 \_____/  2,-1 \_____
 /     \       /     \       /     \       /     \
/ -3,-1 \_____/ -1,-1 \_____/  1,-1 \_____/  3,-1 \
\       /     \       /     \       /     \       /
 \_____/ -2,0  \_____/  0,0  \_____/  2,0  \_____/
 /     \       /     \       /     \       /     \
/ -3,0  \_____/ -1,0  \_____/  1,0  \_____/  3,0  \
\       /     \       /     \       /     \       /
 \_____/ -2,1  \_____/  0,1  \_____/  2,1  \_____/
 /     \       /     \       /     \       /     \
/ -3,1  \_____/ -1,1  \_____/  1,1  \_____/  3,1  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/
         _____         _____
        /     \       /     \
  _____/ -1,-2 \_____/  1,-2 \_____
 /     \       /     \       /     \
/ -2,-2 \_____/  0,-2 \_____/  2,-2 \
\       /     \       /     \       /
 \_____/ -1,-1 \_____/  1,-1 \_____/
 /     \       /     \       /     \
/ -2,-1 \_____/  0,-1 \_____/  2,-1 \
\       /     \       /     \       /
 \_____/ -1,0  \_____/  1,0  \_____/
 /     \       /     \       /     \
/ -2,0  \_____/  0,0  \_____/  2,0  \
\       /     \       /     \       /
 \_____/ -1,1  \_____/  1,1  \_____/
 /     \       /     \       /     \
/ -2,1  \_____/  0,1  \_____/  2,1  \
\       /     \       /     \       /
 \_____/ -1,2  \_____/  1,2  \_____/
 /     \       /     \       /     \
/ -2,2  \_____/  0,2  \_____/  2,2  \
\       /     \       /     \       /
 \_____/       \_____/       \_____/
Level River St
quelle