Rozwiń sześciokąt

24

Biorąc pod uwagę sześciokąt artystyczny ASCII jako dane wejściowe, wyjmij taki, którego boki są o jedną jednostkę dłuższe.

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

Sześciokąty wejściowe będą miały symetrię 180 stopni, ale w przeciwnym razie boki mogą mieć różne długości. Powyżej długości boczne (2, 4, 3) zostają powiększone do (3, 5, 4). Długości boków będą niezerowe.

Sześciokąty są wykonane z podkreślników _, ukośników/ i odwrotnych ukośników \. Zwróć uwagę, że w przypadku poziomych krawędzi (wykonanych za pomocą podkreślników) górna krawędź znajduje się na własnej linii, ale dolna krawędź nie.

I / O

Mam zamiar zostać kozłem ofiarnym i wymagać tutaj formatowania : wejście i wyjście powinno być ciągiem znaków z nowymi liniami reprezentującymi obraz, a nie listą linii. Oczywiście, twój kod może wydrukować każdą linię po kolei, aby wygenerować obraz, lub odczytać STDIN linię do wprowadzenia, jeśli twój język to potrafi.

Detale

Dane wejściowe mogą zawierać opcjonalny znak nowej linii, jeśli chcesz, ale w przeciwnym razie nie będą zawierać pustych linii. Możesz wybrać brak spacji na wejściu lub spacje, aby wstawić każdą linię na tej samej długości (długość najdłuższej linii).

Wyjście powinno być wyrównane do lewej krawędzi ekranu, podobnie jak wejście. Możesz mieć dodatkowe znaki nowej linii powyżej i poniżej, a także spacje końcowe.

Przypadki testowe

Wejście, a następnie wyjście.

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

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

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

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

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

Tabela liderów

<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
źródło
Czy sześciokąt wyjściowy musi być taki sam, ale większy, czy może to być sześciokąt o odpowiedniej długości boków?
Stephen
1
@Stephen Musi być ten sam, ale większy, w tej samej orientacji.
xnor
2
To świetny przykład naprawdę dobrze napisanego wyzwania. Krótko, jasno i na temat. Czy mogę zrobić małą sugestię? „Stickler” może nie być jasny dla wszystkich osób, które nie są rodzimymi użytkownikami języka angielskiego. Czy mogę zasugerować, że „zaakceptuję tylko ...” lub coś podobnego może być łatwiejsze do zrozumienia? W każdym razie +1.
ElPedro
Czy możemy zwrócić tablicę / IEnumerableznaków?
Embodiment of Ignorance
@EmbodimentofIgnorance Tak, są w porządku, o ile mają wymagane znaki nowej linii.
xnor

Odpowiedzi:

6

Stax , 28 bajtów

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

Uruchom i debuguj

Wydaje się, że powinien istnieć sposób, aby to zrobić głównie za pomocą wyrażenia regularnego, ale wciąż szukam ...

rekurencyjny
źródło
5

Retina 0.8.2 , 84 bajtów

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

Wypróbuj online! Działa z nieregularnymi sześciokątami. I / O nie jest wypełnione. Wyjaśnienie:

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

Poszerz wnętrze sześciokąta.

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

Napraw górę.

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

Napraw dno.

Neil
źródło
5

JavaScript (ES6),  159 156 153  150 bajtów

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

Wypróbuj online!

Skomentował

Uwaga: Poniższe znaki alternatywne są używane poniżej ograniczników wyrażeń regularnych, aby nie dopuścić do szału zakreślacza składni SE.

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
źródło
2

Węgiel drzewny , 48 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Wprowadź i połącz wszystkie linie z wyjątkiem pierwszej. (Wprowadzenie danych w formacie JSON sprawiłoby, że większość tego nie byłaby potrzebna przy oszczędności 11 bajtów.)

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

Policz liczbę /s, /s i _sznurka i użyj jej do obliczenia nowych długości boków (w przypadku _s jako ciąg _s tej długości).

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

Narysuj powiększony sześciokąt.

Alternatywne rozwiązanie, również 48 bajtów:

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Wprowadź wszystkie linie. (Wprowadzanie w formacie JSON sprawiłoby, że nie byłoby to konieczne przy oszczędności 17 bajtów.)

F²«

Narysuj osobno prawą górną i lewą dolną sekcję sześciokąta.

≔E\/_⊕⊘№θκ

Policz liczbę /s, /si _w ciągu i użyj jej do obliczenia nowych długości boków.

η×_⊟ηM⁰¬ι

Wyprowadzaj górę lub dół i przesuń w dół linii, jeśli była to linia górna.

Fη«↷¹κ↷¹¶

Narysuj prawą lub lewą stronę.

Neil
źródło
2

APL (Dyalog Unicode) , 75 74 bajtów SBCS

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

Wypróbuj online!

'.+'⎕s'&' podzielić dane wejściowe na linie

↑⍵ mieszaj linie w macierz

⍺⍳wymienić ' /\_'z0 1 2 3

(0,0,⍨⍉)⍣3⍉ otaczaj warstwą 0 na górze i dole oraz dwiema warstwami 0 po lewej i prawej stronie

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 dla każdej komórki wybierz pierwszą niezerową z: górną, dolną, lewą, prawą z sąsiedztwa 3x3 na środku

2⌈/ maks. w parach w poziomie

a×1=(+⍀×a)⌊⊖+⍀⊖×a← zachowaj tylko zewnętrzną granicę wartości innych niż 0

⍺[ ]wymienić 0 1 2 3z' /\_'

ngn
źródło
1

PowerShell , 126 bajtów

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

Wypróbuj online!

mazzy
źródło
0

Perl 5 , 177 156 145 bajtów

@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

Czy może być krótszy? Nie wiem jak jeszcze. Z komentarzami i dodanymi nowymi wierszami oraz nagłówkiem i stopką:

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
}

Wypróbuj online!

Wiersz nr 1 dzieli wielowierszowy ciąg wejściowy na tablicę @l.

Wiersz nr 2 powiela drugi i ostatni wiersz bez znaków _.

Wiersz nr 3 dodaje spacje w razie potrzeby w wierszu 2 do drugiego na końcu.

Linia nr 4 poszerza dwa boki ___ o jeden _ i zwraca tablicę @l linii jako jeden ciąg wielu linii.

Kjetil S.
źródło