Espandi un esagono


24

Dato un esagono di arte ASCII come input, ne esce uno i cui lati sono tutti più lunghi di un'unità.

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

Gli esagoni di input avranno una simmetria di 180 gradi, ma per il resto i lati possono avere lunghezze diverse. Sopra, le lunghezze laterali (2, 4, 3) vengono ingrandite a (3, 5, 4). Le lunghezze laterali saranno diverse da zero.

Gli esagoni sono costituiti da trattini _bassi /, barre e barre rovesciate \. Si noti che dei bordi orizzontali (realizzati con caratteri di sottolineatura), il bordo superiore si trova sulla propria linea ma il bordo inferiore no.

I / O

Sarò un pignolo e richiederò la formattazione di qui: l'input e l'output dovrebbero essere una stringa con le nuove linee che rappresentano l'immagine, non un elenco di linee. Ovviamente, il tuo codice può stampare ogni riga a turno per produrre l'immagine o leggere STDIN una riga alla volta per l'input se la tua lingua può farlo.

Dettagli

L'input può includere una nuova riga finale facoltativa, se lo si desidera, ma non avrà righe vuote. Puoi scegliere di non avere spazi finali nell'input o spazi per riempire ogni linea della stessa lunghezza (quella della linea più lunga).

L'output dovrebbe essere a filo con il bordo sinistro dello schermo, come l'input. Potresti avere nuove righe extra sopra e sotto e spazi finali.

Casi test

Input seguito da output.

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

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

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

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

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

Classifica

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


L'esagono di uscita deve essere lo stesso ma più grande o può essere qualsiasi esagono con le lunghezze laterali appropriate?
Stephen,

1
@Stephen Deve essere lo stesso ma più grande, con lo stesso orientamento.
xnor

2
Questo è un ottimo esempio di una sfida davvero ben scritta. Breve, chiaro e al punto. Posso dare un piccolo suggerimento? "Stickler" potrebbe non essere chiaro per tutti i non madrelingua inglese. Posso suggerire che "Accetterò solo ..." o qualcosa di simile potrebbe essere più facile da capire? +1 comunque.
ElPedro,

Possiamo restituire un array / IEnumerabledi caratteri?
Incarnazione dell'ignoranza

@EmbodimentofIgnorance Sì, quelli vanno bene, purché abbiano i caratteri di nuova riga richiesti.
xnor

Risposte:



5

Retina 0.8.2 , 84 byte

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

Provalo online! Funziona con esagoni irregolari. L'I / O non è imbottito. Spiegazione:

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

Allarga l'interno dell'esagono.

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

Risolvi la parte superiore.

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

Risolvi il fondo.


5

JavaScript (ES6),  159 156 153  150 byte

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

Provalo online!

Commentate

NB: I caratteri alternativi sono usati di seguito per i delimitatori regex per evitare che l'evidenziatore della sintassi SE diventi impazzito.

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
  )                        //

2

Carbone , 48 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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

Immettere e concatenare tutte le righe tranne la prima. (L'immissione in formato JSON renderebbe la maggior parte inutile con un risparmio di 11 byte.)

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

Contare il numero di /s, /s e _s nella stringa e utilizzarlo per calcolare le nuove lunghezze laterali (nel caso di _s, come una stringa di _s di quella lunghezza).

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

Disegna l'esagono ingrandito.

Soluzione alternativa, anche 48 byte:

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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

Inserisci tutte le linee. (L'immissione in formato JSON lo renderebbe superfluo con un risparmio di 17 byte.)

F²«

Disegna le sezioni in alto a destra e in basso a sinistra dell'esagono separatamente.

≔E\/_⊕⊘№θκ

Contare il numero di /s, /s e _s nella stringa e utilizzarlo per calcolare le nuove lunghezze laterali.

η×_⊟ηM⁰¬ι

Stampa la parte superiore o inferiore e sposta verso il basso di una riga se questa era la riga superiore.

Fη«↷¹κ↷¹¶

Disegna entrambi i lati destro o sinistro.


2

APL (Dyalog Unicode) , 75 74 byte SBCS

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

Provalo online!

'.+'⎕s'&' dividere l'input in righe

↑⍵ mescolare le linee in una matrice

⍺⍳sostituire ' /\_'con0 1 2 3

(0,0,⍨⍉)⍣3⍉ circondare con uno strato di 0 in alto e in basso e due strati di 0 a sinistra e a destra

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 per ogni cella scegli il primo diverso da 0 da: superiore, inferiore, sinistro, destro dal quartiere 3x3 centrato su di esso

2⌈/ max in coppia in orizzontale

a×1=(+⍀×a)⌊⊖+⍀⊖×a← mantiene solo il limite esterno di non-0

⍺[ ]sostituire 0 1 2 3con' /\_'



0

Perl 5 , 177 156 145 byte

@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

Potrebbe essere più breve? Non vedo come ancora. Con commenti e aggiunte nuove righe e intestazione + piè di pagina:

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
}

Provalo online!

La riga 1 divide la stringa di input multilinea nell'array @l.

La riga n. 2 duplica la seconda e l'ultima riga senza i caratteri _.

La riga n. 3 aggiunge gli spazi necessari alla riga 2 fino alla penultima.

La riga n. 4 allarga i due ___ lati con uno _ e restituisce l'array di righe @l come una stringa multi-riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.