Erweitern Sie ein Sechseck

24

Geben Sie ein ASCII-Hexagon als Eingabe aus, dessen Seiten alle eine Einheit länger sind.

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

Die Eingabesechsecke haben eine 180-Grad-Symmetrie, ansonsten können die Seiten unterschiedlich lang sein. Oben werden die Seitenlängen (2, 4, 3) auf (3, 5, 4) vergrößert. Die Seitenlängen sind ungleich Null.

Die Sechsecke bestehen aus Unterstrichen _, Schrägstrichen /und umgekehrten Schrägstrichen \. Beachten Sie, dass sich die Oberkante der horizontalen Kanten (mit Unterstrichen) in einer eigenen Linie befindet, die Unterkante jedoch nicht.

I / O

Ich werde ein Stickler sein und hier eine Formatierung erfordern : Die Eingabe und Ausgabe sollte eine Zeichenfolge mit Zeilenumbrüchen sein, die das Bild darstellen, nicht eine Liste von Zeilen. Natürlich kann Ihr Code jede Zeile der Reihe nach drucken, um das Bild zu erzeugen, oder STDIN eine Zeile pro Eingabezeit lesen, wenn Ihre Sprache dies kann.

Einzelheiten

Die Eingabe kann optional einen nachgestellten Zeilenumbruch enthalten, ansonsten jedoch keine Leerzeilen. Sie können entweder festlegen, dass die Eingabe keine nachgestellten Leerzeichen enthält, oder dass jede Zeile auf dieselbe Länge (die der längsten Zeile) aufgefüllt wird.

Die Ausgabe sollte wie die Eingabe bündig mit dem linken Bildschirmrand abschließen. Es können zusätzliche Zeilenumbrüche über und unter sowie Leerzeichen am Ende vorhanden sein.

Testfälle

Eingabe gefolgt von Ausgabe.

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

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

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

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

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

Bestenliste

<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
quelle
Muss das Ausgangssechskant dasselbe, aber größer sein, oder kann es ein beliebiges Sechskant mit den entsprechenden Seitenlängen sein?
Stephen
1
@Stephen Es muss das gleiche sein, aber größer, in der gleichen Ausrichtung.
18.
2
Dies ist ein großartiges Beispiel für eine wirklich gut geschriebene Herausforderung. Kurz, klar und auf den Punkt. Darf ich einen kleinen Vorschlag machen? "Stickler" ist möglicherweise nicht für alle Nicht-Englisch-Muttersprachler eindeutig. Darf ich vorschlagen, dass "Ich akzeptiere nur ..." oder etwas ähnliches leichter zu verstehen ist? +1 sowieso.
ElPedro
Können wir ein Array / IEnumerableZeichen zurückgeben?
Verkörperung der Ignoranz
@EmbodimentofIgnorance Ja, diese sind in Ordnung, solange sie die erforderlichen Zeilenumbrüche enthalten.
19.

Antworten:

5

Retina 0.8.2 , 84 Bytes

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

Probieren Sie es online! Arbeitet mit unregelmäßigen Sechsecken. I / O ist nicht gepolstert. Erläuterung:

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

Erweitern Sie das Innere des Sechsecks.

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

Befestigen Sie die Oberseite.

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

Befestigen Sie den Boden.

Neil
quelle
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](/_/,'__'))

Probieren Sie es online!

Kommentiert

NB: Nachfolgend werden alternative Zeichen für die Regex-Trennzeichen verwendet, um zu verhindern, dass der SE-Syntax-Textmarker wütend wird.

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

Kohle , 48 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

Geben Sie alle Zeilen außer der ersten ein und verketten Sie sie. (Die Eingabe im JSON-Format würde das meiste bei einer Einsparung von 11 Bytes überflüssig machen.)

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

Zählen Sie die Anzahl von /s, /s und _s in der Zeichenfolge und verwenden Sie diese, um die neuen Seitenlängen zu berechnen (im Fall von _s als Zeichenfolge von _s dieser Länge).

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

Zeichne das vergrößerte Sechseck.

Alternative Lösung, auch 48 Bytes:

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

Geben Sie alle Zeilen ein. (Eine Eingabe im JSON-Format würde dies bei einer Einsparung von 17 Byte überflüssig machen.)

F²«

Zeichnen Sie die oberen rechten und unteren linken Abschnitte des Sechsecks getrennt.

≔E\/_⊕⊘№θκ

Zählen Sie die Anzahl von /s, /s und _s in der Zeichenfolge und berechnen Sie daraus die neuen Seitenlängen.

η×_⊟ηM⁰¬ι

Geben Sie oben oder unten aus und bewegen Sie sich eine Zeile nach unten, wenn dies die oberste Zeile war.

Fη«↷¹κ↷¹¶

Zeichnen Sie die rechte oder linke Seite.

Neil
quelle
2

APL (Dyalog Unicode) , 75 bis 74 Byte SBCS

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

Probieren Sie es online!

'.+'⎕s'&' Eingabe in Zeilen aufteilen

↑⍵ Linien in eine Matrix mischen

⍺⍳ersetzen ' /\_'mit0 1 2 3

(0,0,⍨⍉)⍣3⍉ Oben und unten mit einer 0-Schicht und links und rechts mit zwei 0-Schichten umgeben

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 Wählen Sie für jede Zelle die erste Nicht-0 aus: oben, unten, links, rechts aus der darauf zentrierten 3x3-Nachbarschaft

2⌈/ maximal paarweise horizontal

a×1=(+⍀×a)⌊⊖+⍀⊖×a← Behalten Sie nur die äußere Grenze von Nicht-Nullen bei

⍺[ ]ersetzen 0 1 2 3mit' /\_'

ngn
quelle
1

PowerShell , 126 Byte

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

Probieren Sie es online!

mazzy
quelle
0

Perl 5 , 177 156 145 Bytes

@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

Könnte kürzer sein? Weiß noch nicht wie. Mit Kommentaren und hinzugefügten Zeilenumbrüchen sowie Kopf- und Fußzeile:

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
}

Probieren Sie es online!

Zeile 1 teilt eine mehrzeilige Eingabezeichenfolge in das @ l-Array auf.

Zeile 2 dupliziert die zweite und letzte Zeile ohne die Zeichen _.

Zeile 3 fügt Leerzeichen in Zeile 2 bis zum vorletzten hinzu.

Zeile 4 erweitert die beiden ___ Seiten mit einem _ und gibt das @ l-Array von Zeilen als eine mehrzeilige Zeichenfolge zurück.

Kjetil S.
quelle