Развернуть шестиугольник

24

Если в качестве входных данных указан арт-шестиугольник ASCII, выведите тот, у которого все стороны на одну единицу длиннее.

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

Входные шестиугольники будут иметь симметрию 180 градусов, но в противном случае стороны могут быть разной длины. Выше боковые длины (2, 4, 3) увеличены до (3, 5, 4). Длина стороны будет отлична от нуля.

Шестиугольники состоят из подчеркивания _, косой черты /и обратной косой черты\ . Обратите внимание, что из горизонтальных краев (сделанных с подчеркиванием) верхний край находится на отдельной линии, а нижний - нет.

I / O

Я собираюсь быть сторонником и требовать форматирования здесь: ввод и вывод должны быть строкой с символами новой строки, представляющими изображение, а не списком строк. Конечно, ваш код может печатать каждую строку по очереди, чтобы получить изображение, или читать STDIN строку за раз для ввода, если ваш язык может сделать это.

Детали

Ввод может включать необязательный завершающий перевод строки, если вы хотите, но в противном случае не будет пустых строк. Вы можете выбрать либо отсутствие пробелов на входе, либо пробелы для заполнения каждой строки одинаковой длиной (самой длинной строки).

Вывод должен быть на одном уровне с левым краем экрана, как и ввод. Вы можете иметь дополнительные новые строки выше и ниже, а также завершающие пробелы.

Контрольные примеры

Ввод с последующим выводом.

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

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

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

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

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

Leaderboard

<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
источник
Должен ли выходной шестиугольник быть таким же, но больше, или это может быть любой шестиугольник с соответствующей длиной стороны?
Стивен
1
@ Стефан Это должно быть то же самое, но больше, в той же ориентации.
XNOR
2
Это отличный пример действительно хорошо написанного вызова. Коротко, ясно и точно. Могу ли я сделать небольшое предложение? «Stickler» может быть не понятен для всех не носителей английского языка. Могу ли я предположить, что «я только приму ...» или что-то подобное может быть легче понять? +1 в любом случае.
ElPedro
Можем ли мы вернуть массив / IEnumerableсимволов?
Воплощение Неведения
@EmbodimentofIgnorance Да, все в порядке, если в них есть необходимые символы новой строки.
xnor

Ответы:

5

Сетчатка 0.8.2 , 84 байта

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

Попробуйте онлайн! Работает с неправильными шестиугольниками. Ввод / вывод не дополняется. Объяснение:

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

Расширьте внутренность шестиугольника.

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

Зафиксируйте вершину.

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

Зафиксируйте дно.

Нил
источник
5

JavaScript (ES6),  159 156 153  150 байт

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

Попробуйте онлайн!

комментарии

NB: альтернативные символы используются ниже для разделителей регулярных выражений, чтобы не допустить схода с ума подсветки синтаксиса 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
источник
2

Древесный уголь , 48 байтов

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

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

Введите и объедините все строки, кроме первой. (Ввод в формате JSON сделает большую часть этого ненужным при экономии 11 байт.)

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

Подсчитайте количество /s, /s и _s в строке и используйте его для вычисления длины новой стороны (в случае _s как строки _s этой длины).

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

Нарисуйте увеличенный шестиугольник.

Альтернативное решение, также 48 байтов:

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

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

Введите все строки. (Ввод в формате JSON сделает это ненужным при экономии 17 байт.)

F²«

Нарисуйте верхнюю правую и нижнюю левую части шестиугольника отдельно.

≔E\/_⊕⊘№θκ

Подсчитайте количество /s, /s и _s в строке и используйте его для вычисления длины новой стороны.

η×_⊟ηM⁰¬ι

Выведите верх или низ и двигайтесь вниз по строке, если это была верхняя строка.

Fη«↷¹κ↷¹¶

Нарисуйте обе стороны справа или слева.

Нил
источник
2

APL (Dyalog Unicode) , 75 74 байта SBCS

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

Попробуйте онлайн!

'.+'⎕s'&' разделить ввод на строки

↑⍵ смешать строки в матрицу

⍺⍳заменить ' /\_'на0 1 2 3

(0,0,⍨⍉)⍣3⍉ окружить слоем 0s сверху и снизу и двумя слоями 0 слева и справа

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 для каждой ячейки выберите первый ненулевой из: верхний, нижний, левый, правый из окрестности 3х3 с центром в ней

2⌈/ макс в парах по горизонтали

a×1=(+⍀×a)⌊⊖+⍀⊖×a← сохранить только внешнюю границу ненулевых

⍺[ ]заменить 0 1 2 3на' /\_'

СПП
источник
0

Perl 5 , 177 156 145 байт

@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

Может быть короче? Пока не вижу как. С комментариями и добавлением новых строк и заголовка + нижнего колонтитула:

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
}

Попробуйте онлайн!

Строка # 1 разбивает многострочную строку ввода в массив @l.

Строка № 2 дублирует вторую и последнюю строки без символов _.

Строка № 3 добавляет пробелы, где это необходимо, в строке 2 до второй последней.

Строка # 4 расширяет две стороны ___ одной _ и возвращает массив строк @l в виде одной многострочной строки.

Кжетил С.
источник