Розгорніть шестикутник


24

Враховуючи шестикутник мистецтва ASCII як вихідний, виведіть той, чиї сторони всі на одну одиницю довші.

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

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

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

I / O

Я буду стикером і вимагаю тут формату : вхід і вихід повинні бути рядком з новими рядками, що представляють зображення, а не списком рядків. Звичайно, ваш код може надрукувати кожен рядок по черзі, щоб створити зображення, або прочитати STDIN рядок час для введення, якщо ваша мова може це зробити.

Деталі

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

Вихід повинен бути врівень з лівим краєм екрана, як і вхід. У вас можуть бути додаткові нові рядки вище та нижче, а також пробіли.

Тестові справи

Введення з подальшим виходом.

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

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

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

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

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

Таблиця лідерів

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


Повинно бути вихідним шестикутником однаковим, але більшим, чи це може бути будь-який шестикутник із відповідною довжиною сторони?
Стефан

1
@Stephen Це має бути той самий, але більший, в тій же орієнтації.
xnor

2
Це чудовий приклад дійсно добре написаного виклику. Короткий, чіткий і суттєвий. Чи можу я зробити невелику пропозицію? "Стикер" може бути незрозумілим для всіх, хто не є носієм англійської мови. Чи можу я припустити, що "я прийму тільки ..." чи щось подібне може бути легше зрозуміти? +1 у будь-якому випадку
ElPedro

Чи можемо ми повернути масив / IEnumerableсимволів?
Втілення Невідомості

@EmbodimentofIgnorance Так, це добре, якщо у них є необхідні символи нового рядка.
xnor

Відповіді:



5

Сітківка 0,8,2 , 84 байти

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

Спробуйте в Інтернеті! Працює з неправильними шестикутниками. I / O не встановлено. Пояснення:

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

Спробуйте в Інтернеті!

Прокоментував

Примітка: Альтернативні символи використовуються нижче для роздільників регулярних виразів, щоб запобігти виділенню синтаксису 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
  )                        //

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 вгорі та внизу та двома шарами 0s зліва та справа

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 для кожної комірки виберіть перший не-0 із верхнього, нижнього, лівого, правого з 3x3, зосередженого на ньому

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

a×1=(+⍀×a)⌊⊖+⍀⊖×a← зберігайте лише зовнішню межу не-0

⍺[ ]замінити 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 додає пробіли, де це потрібно в другому другому рядку.

Рядок №4 розширює дві ___ сторони одним _ і повертає масив рядків @l як один багаторядковий рядок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.