Dessinez et étiquetez une grille hexagonale ASCII

12

Dans mon défi précédent , j'ai dessiné le premier diagramme principalement à la main (à l'aide du mode bloc visuel de vim). Mais il doit sûrement y avoir un meilleur moyen ...


Étant donné une entrée de deux dimensions, une largeur et une hauteur, sortez une grille hexagonale avec ces dimensions dans l'art ASCII.

Voici le diagramme référencé dans l'intro (avec des modifications mineures), qui devrait être votre sortie pour l'entrée 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  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/

Remarquez plusieurs choses:

  • La largeur et la hauteur sont essentiellement équivalentes au nombre d'hexagones qu'il y a respectivement pour une coordonnée y et x donnée. Ce seront toujours des nombres impairs.

  • Chaque hexagone est représenté par l'art ASCII

      _____
     /     \
    /       \
    \       /
     \_____/
    

    mais les frontières sont «partagées» entre les hexagones voisins.

  • La virgule dans les coordonnées est toujours exactement deux caractères sous le centre du bord supérieur. La coordonnée x est ensuite positionnée directement avant la virgule, et la coordonnée y directement après.

    Vous pouvez supposer que les coordonnées ne seront jamais trop grandes de sorte qu'elles chevaucheraient les frontières de l'hexagone.

L'entrée peut être considérée comme une chaîne séparée par des espaces / virgules, un tableau d'entiers ou deux arguments de fonction / ligne de commande. La sortie doit être une chaîne unique (vers STDOUT, comme valeur de retour, etc.).

Puisqu'il s'agit de , le code le plus court en octets gagnera.

La grille ci-dessus peut être utilisée comme cas de test. La width=199, height=199grille de taille maximale n'est évidemment pas pratique à inclure ici, mais les premières lignes et colonnes devraient ressembler à ceci:

         _____         ___
        /     \       /   
  _____/-98,-99\_____/-96,
 /     \       /     \    
/-99,-99\_____/-97,-99\___
\       /     \       /   
 \_____/-98,-98\_____/-96,
 /     \       /     \    
/-99,-98\_____/-97,-98\___
\       /     \       /   
 \_____/-98,-97\_____/-96,
 /     \       /     \    
/-99,-97\_____/-97,-97\___
\       /     \       /   
Poignée de porte
la source
En relation
Alex A.

Réponses:

2

Rubis, 221 octets

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

Non testé dans le programme de test

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]

Production

Alors que je terminais le débogage, j'ai remarqué une ambiguïté dans la spécification. Où w+1est divisible par 4, les première et dernière coordonnées x sont impaires et il n'y a pas d'ambiguïté. Mais où w-1est divisible par 4, les première et dernière coordonnées x sont paires. J'ai supposé que les première et dernière colonnes devraient être décalées en dessous des suivantes. Mais j'ai lu la question précédente et j'ai noté que dans ce cas, ce sont les colonnes impaires qui devraient être décalées en dessous des paires (note pour w-1divisible par 4, il n'est pas possible de faire les deux.)

Cette distinction n'a cependant pas été faite dans cette question. Je vais laisser cela au jugement de OP et retravailler si nécessaire, bien que je préfère ne pas avoir à le faire.

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -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
la source