Agrandir un hexagone

24

Étant donné un hexagone d'art ASCII en entrée, sortez-en un dont les côtés font tous une unité de plus.

                     _____
  ____              /     \
 /    \            /       \
/      \          /         \
\       \   =>    \          \
 \      /          \         /
  \____/            \       /
                     \_____/

Les hexagones d'entrée auront une symétrie de 180 degrés, mais sinon les côtés peuvent être de longueurs différentes. Au-dessus, les longueurs latérales (2, 4, 3) sont agrandies à (3, 5, 4). Les longueurs latérales seront non nulles.

Les hexagones sont constitués de traits de soulignement _, de barres obliques /et de barres obliques inverses \. Notez que parmi les bords horizontaux (faits avec des traits de soulignement), le bord supérieur est sur sa propre ligne mais pas le bord inférieur.

E / S

Je vais être pointilleux et exiger mise en forme ici: l'entrée et la sortie doivent être une chaîne avec des sauts de ligne représentant l'image, pas une liste de lignes. Bien sûr, votre code peut imprimer chaque ligne tour à tour pour produire l'image, ou lire STDIN une ligne une fois pour la saisie si votre langue peut le faire.

Détails

L'entrée peut inclure une nouvelle ligne de fin facultative si vous le souhaitez, mais n'aura pas de lignes vides. Vous pouvez choisir de ne pas avoir d'espaces de fin dans l'entrée ou de remplir chaque ligne à la même longueur (celle de la ligne la plus longue).

La sortie doit être alignée avec le bord gauche de l'écran, comme l'entrée. Vous pouvez avoir des sauts de ligne supplémentaires au-dessus et en dessous ainsi que des espaces de fin.

Cas de test

Entrée suivie de sortie.

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

  ____
 /    \
/      \
\       \
 \      /
  \____/

   _____
  /     \
 /       \
/         \
\          \
 \         /
  \       /
   \_____/

     _
    / \
   /  /
  /  /
 /  /
/  /
\_/

      __  
     /  \
    /    \
   /     /
  /     /
 /     /
/     /
\    /
 \__/

Classement

<iframe src="https://xmikee1.github.io/ppcg-leaderboard/?id=185760" width="100%" height="100%" style="border: none;">Oops, your browser is too old to view this content! Please upgrade to a newer version of your browser that supports HTML5.</iframe><style>html,body{margin:0;padding:0;height:100%;overflow:hidden}</style>

xnor
la source
L'hexagone de sortie doit-il être le même mais plus grand, ou peut-il s'agir d'un hexagone avec les longueurs de côté appropriées?
Stephen
1
@Stephen Il doit être le même mais plus grand, dans la même orientation.
xnor
2
Ceci est un excellent exemple d'un défi vraiment bien écrit. Court, clair et précis. Puis-je faire une petite suggestion? "Stickler" peut ne pas être clair pour tous les anglophones non natifs. Puis-je suggérer que «je n'accepterai que ...» ou quelque chose de similaire peut être plus facile à comprendre? +1 de toute façon.
ElPedro
Pouvons-nous retourner un tableau / IEnumerablede caractères?
Incarnation de l'ignorance
@EmbodimentofIgnorance Oui, c'est très bien, tant qu'ils ont les caractères de retour à la ligne requis.
xnor

Réponses:

6

Stax , 28 octets

╙Σ■♀♪«G[▀[TÖe╟╗ê'○▀ÄT→│╧(╡¢╩

Exécuter et déboguer

Il semble qu'il devrait y avoir un moyen de le faire principalement avec regex, mais je cherche toujours ...

récursif
la source
5

Retina 0.8.2 , 84 octets

m`(¶.*)( .)$
$1   $2
(_+¶)(( */)  ( *.))
 _$1 $3$4¶$2
( *.)(_+/)$
$1$.2$*   /¶ $1_$2

Essayez-le en ligne! Fonctionne avec des hexagones irréguliers. Les E / S ne sont pas rembourrées. Explication:

m`(¶.*)( .)$
$1   $2

Élargissez l'intérieur de l'hexagone.

(_+¶)(( */)  ( *.))
 _$1 $3$4¶$2

Fixez le haut.

( *.)(_+/)$
$1$.2$*   /¶ $1_$2

Fixez le bas.

Neil
la source
5

JavaScript (ES6),  159 156 153  150 octets

s=>s[r='replace'](/\S /g,'$&   ')[r](/.*/,s=>s[r](e=/_+/,` $&_
`+s[r](e,'/$& \\')[r](e=/_/g,' ')))[r](/ *\\_+/,s=>s[r](e,' ')+`   /
 `+s[r](/_/,'__'))

Essayez-le en ligne!

Commenté

NB: Des caractères alternatifs sont utilisés ci-dessous pour les délimiteurs d'expressions régulières afin d'empêcher le surligneur de syntaxe SE de devenir fou.

s =>                       // s = input
  s[r = 'replace'](        // r = alias for 'replace'
                           // STEP #1
    \S g,                // insert two middle spaces for all lines
    '$&   '                // that contain a border, followed by a space
  )                        // (i.e. all lines except the first and the last one)
  [r](                     // STEP #2
    ∕.*∕,                  // isolate the first line
    s =>                   // let s be this first line
      s[r](                //
        e = _+∕,          // find the sequence of underscores and replace it with:
        ` $&_\n` +         //   the same sequence preceded by a space and followed by '_'
        s[r](              //   followed by a linefeed and:
          e,               //     the same sequence preceded by '/' and followed by ' \'
          '/$& \\'         //     
        )                  //     with:
        [r](e = _g, ' ') //     all underscores replaced with spaces
  ))                       //
  [r](                     // STEP #3
     *\\_+∕,              // isolate the last line, without the trailing '/'
    s =>                   // let s be this last line
      s[r](e, ' ') +       // replace all underscores with spaces
      `   /\n ` +          // append 3 spaces and a trailing '/', followed by a linefeed
      s[r](∕_∕, '__')      // append s with an extra underscore
  )                        //
Arnauld
la source
2

Fusain , 48 octets

SθW¬№ω_≔⁺ωSω≔⊕⊘№ω\η≔⊕⊘№ω/ζ≔×_⊕№ω_θ↗ζθ↓↘η←↙ζ↑←θ↖η

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

SθW¬№ω_≔⁺ωSω

Saisissez et concaténez toutes les lignes sauf la première. (L'entrée au format JSON rendrait la plupart de cela inutile avec une économie de 11 octets.)

≔⊕⊘№ω\η≔⊕⊘№ω/ζ≔×_⊕№ω_θ

Comptez le nombre de /s, /s et _s dans la chaîne et utilisez-le pour calculer les nouvelles longueurs de côté (dans le cas de _s, comme une chaîne de _s de cette longueur).

↗ζθ↓↘η←↙ζ↑←θ↖η

Dessinez l'hexagone agrandi.

Solution alternative, également 48 octets:

SθW¬№ω_≔⁺ωSω≔⁺θωθF²«≔E\/_⊕⊘№θκη×_⊟ηM⁰¬ιFη«↷¹κ↷¹¶

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

SθW¬№ω_≔⁺ωSω≔⁺θωθ

Saisissez toutes les lignes. (L'entrée au format JSON rendrait cela inutile avec une économie de 17 octets.)

F²«

Dessinez séparément les sections supérieure droite et inférieure gauche de l'hexagone.

≔E\/_⊕⊘№θκ

Comptez le nombre de /s, /s et _s dans la chaîne et utilisez-le pour calculer les nouvelles longueurs de côté.

η×_⊟ηM⁰¬ι

Sortez le haut ou le bas et descendez d'une ligne si c'était la ligne du haut.

Fη«↷¹κ↷¹¶

Dessinez les deux côtés droit ou gauche.

Neil
la source
2

APL (Dyalog Unicode) , 75 74 octets SBCS

' /\_'∘{⍺[a×1=(+⍀×a)⌊⊖+⍀⊖×a2⌈/{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3(0,0,⍨⍉)⍣3⍉⍺⍳↑⍵]}'.+'s'&'

Essayez-le en ligne!

'.+'⎕s'&' diviser l'entrée en lignes

↑⍵ mélanger les lignes dans une matrice

⍺⍳remplacer ' /\_'par0 1 2 3

(0,0,⍨⍉)⍣3⍉ entourer avec une couche de 0 en haut et en bas et deux couches de 0 à gauche et à droite

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 pour chaque cellule, choisissez le premier non-0 parmi: en haut, en bas, à gauche, à droite du voisinage 3x3 centré sur elle

2⌈/ max par paires horizontalement

a×1=(+⍀×a)⌊⊖+⍀⊖×a← ne garder que la limite extérieure des non-0

⍺[ ]remplacer 0 1 2 3par' /\_'

ngn
la source
1

PowerShell , 126 octets

$args-replace' *\S +','$0   '-replace'( +)(_+)','$1 $2_
$1/$2 \'-replace'( *)(\\_+)/','$1$2   /
$1 $2_/'-replace'_(?=.* )',' '

Essayez-le en ligne!

mazzy
la source
0

Perl 5 , 177 156 145 145 octets

@l=pop=~/.+/g;splice@l,$_,0,$l[$_]=~s,_, ,gr for-1,1;$l[$_]=~s, (\S)( +)(\S),$_<2?" $1$2 $3":"$1$2   $3",e for 1..@l-2;join("\n",@l)=~s,_+,$&_,gr

Pourrait être plus court? Je ne vois pas encore comment. Avec commentaires et ajouts de nouvelles lignes et en-tête + pied de page:

sub f {
@l=pop=~/.+/g;                                                      #1
splice@l,$_,0,$l[$_]=~s,_, ,gr for-1,1;                             #2
$l[$_]=~s, (\S)( +)(\S),$_<2?" $1$2 $3":"$1$2   $3",e for 1..@l-2;  #3
join("\n",@l)=~s,_+,$&_,gr                                          #4
}

Essayez-le en ligne!

La ligne # 1 divise la chaîne d'entrée multi-lignes dans le tableau @l.

La ligne n ° 2 duplique les deuxième et dernière lignes sans les caractères _.

La ligne # 3 ajoute des espaces là où c'est nécessaire sur la ligne 2 à l'avant-dernier.

La ligne # 4 élargit les deux côtés ___ avec un _ et retourne le tableau de lignes @l comme une chaîne multi-lignes.

Kjetil S.
la source