Сделай флаг волной


26

Возьмите флаг, как этот:

-----------------------------
|             |             |
|             |             |
|=============+=============|
|             |             |
|             |             |
-----------------------------

И ввод числа: «длина волны»

Скажем, длина волны была 5. Затем, каждые 5 символов вдоль линии от начала, замените следующий символ a -на \и сдвиньте все символы после него на одну строку вниз. Повторите это до конца. Вы заканчиваете с:

-----\
|     -----\
|           -----\
|=====        |   -----\
|     ======  |         -----
|           ==+===          |
-----\        |   ======    |
      -----\  |         ====|
            -----\          |
                  -----\    |
                        -----

Если вы в конечном итоге не сможете сделать полную длину волны в конце, флаг заканчивается. Просто оставайся плоским до конца.

Можно предположить, что все строки имеют одинаковую длину, а верхняя и нижняя строки полностью состоят из -(0x2D), а остальные символы находятся в пробелах !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~( ). (Так что это значение ascii x, где 31 < x < 127)
Флаг будет по крайней мере 3 в высоту и 3 в ширину.

Длина волны будет неотрицательным целым числом (> = 0).

(Длина волны 1 также может быть наименьшей длиной волны, поэтому приведенный выше пример будет иметь длину волны 6. Это нормально.)

Ваш флаг ввода / вывода может быть массивом строк или строкой с несколькими строками.

Выходной флаг может иметь конечные пробелы, но может иметь только начальные пробелы, если он одинаков для каждого флага. Конечный пробел на флаге ввода может быть удален.

счет

Это код-гольф, поэтому выигрывает самое короткое решение в байтах.

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

---
abc
---
2
--\
abc
--\



-----
| + |
-----
10
-----
| + |
-----



---------------------------------------
|&&&&&&                         &&&&&&|
|&&&&&&                         &&&&&&|
|&&&&&&                         &&&&&&|
|&&&&&&          .\^/.          &&&&&&|
|&&&&&&        . |   | .        &&&&&&|
|&&&&&&        |\|   |/|        &&&&&&|
|&&&&&&     .--'       '--.     &&&&&&|
|&&&&&&      \           /      &&&&&&|
|&&&&&&       >         <       &&&&&&|
|&&&&&&      '~|/~~|~~\|~'      &&&&&&|
|&&&&&&            |            &&&&&&|
|&&&&&&                         &&&&&&|
|&&&&&&                         &&&&&&|
---------------------------------------
12
------------\                          
|&&&&&&      ------------\             
|&&&&&&                   ------------\
|&&&&&&                         &&&&&&|
|&&&&&&                         &&&&&&|
|&&&&&&          .\^/.          &&&&&&|
|&&&&&&        . |   | .        &&&&&&|
|&&&&&&     .  |\|   |/|        &&&&&&|
|&&&&&&      --'       '--      &&&&&&|
|&&&&&&      \           /.     &&&&&&|
|&&&&&&       >         <       &&&&&&|
|&&&&&&      '~|/~~|~~\|~'      &&&&&&|
|&&&&&&            |            &&&&&&|
|&&&&&&                         &&&&&&|
------------\                   &&&&&&|
             ------------\      &&&&&&|
                          ------------\



-----------------------
|-._`-._ :| |: _.-'_.-|
|   `-._`:| |:`_.-'   |
|-------`-' '-'-------|
|------_.-. .-._------|
|  _.-'_.:| |:._`-._  |
|-'_.-'  :| |:  `-._`-|
-----------------------
4
----\
|-._`----\
|   `-._ :----\
|-----._`:| |: ----\
|-------`-| |:`_.-'_---
|  _.--_.-' '-'_.-' .-|
|-'_.-'_.:. .-.-----  |
----\-'  :| |:._------|
     ----\| |: _`-._--|
          ----\ `-._  |
               ----\`-|
                    ---



---------------
---------------
---------------
---------------
---------------
5
-----\         
-----------\   
---------------
---------------
-----\---------
      -----\---
            ---



-------------------------------------------
|*  *  *  *  * |##########################|
| *  *  *  *  *|                          |
|*  *  *  *  * |##########################|
| *  *  *  *  *|                          |
|*  *  *  *  * |##########################|
| *  *  *  *  *|                          |
|*  *  *  *  * |##########################|
|---------------                          |
|#########################################|
|                                         |
|#########################################|
|                                         |
|#########################################|
-------------------------------------------
0
\
|\
|*\
|  \
|** \
|   *\
|**   \
|   ** \
|**    *\
|-  **   \
|#-    ** \
| #-**    *\
|# #-  **   \
| # #-    ** \
\# # #-**    *\
 \# # #-  **   \
  \# # #-    **|\
   \# # #-**   |#\
    \# # #-  **| #\
     \# # #-   |# #\
      \# # #-**| # #\
       \# # #- |# # #\
        \# # #-| # # #\
         \# # #-# # # #\
          \# # # # # # #\
           \# # # # # # #\
            \# # # # # # #\
             \# # # # # # #\
              \# # # # # # #\
               \# # # # # # #\
                \# # # # # # #\
                 \# # # # # # #\
                  \# # # # # # #\
                   \# # # # # # #\
                    \# # # # # # #\
                     \# # # # # # #\
                      \# # # # # # #\
                       \# # # # # # #\
                        \# # # # # # #\
                         \# # # # # # #\
                          \# # # # # # #\
                           \# # # # # # #\
                            \# # # # # # #\
                             \# # # # # # |
                              \# # # # # #|
                               \# # # # # |
                                \# # # # #|
                                 \# # # # |
                                  \# # # #|
                                   \# # # |
                                    \# # #|
                                     \# # |
                                      \# #|
                                       \# |
                                        \#|
                                         \|
                                          \

4
Ожидая, что @LuisMendo придет сюда и унесет это в течение следующего дня или около того.
Волшебная Урна Осьминога

Дерьмо ... Забыл @ не связывает тех, кто не ответил ... Кто-то пнул меня в задницу, используя MATL, пожалуйста, чтобы я мог удалить комментарии.
Волшебная урна осьминога

2
Кто-нибудь оживить это
Мэтью Ро

1
@SIGSEGV Готово , хотя, возможно, не то, что вы имели в виду.
Брайан Маккатон

1
@carusocomputing Кто-то звонил мне? 31 байт, хотя
Луис Мендо

Ответы:


11

05AB1E , 25 23 26 25 байтов

-2 благодаря Аднану

-1 спасибо Эмигне

+3 спасибо Джонатану Аллану (спасибо, что потратили время, чтобы поймать эту инвалидность!)

øvyN>²Öi¦¨'\.ø}N²÷ú}).Bø»

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

Это индексируется 1 вместо 0, +2 байта, если это не нормально.

ø                                    # Transpose.
 vy                }                 # For each column...
   N>²Öi¦¨'\.ø}                      # Replace outside dashes with slants.
               N²÷                   # Current index / input #2.
                  ú                  # Prepend that many spaces to current column.
                    ).Bø             # Join, pad, transpose back.
                        »            # Print with newlines.

Emigna / Adnan / Anyone - Должно быть лучшее решение для замены этих сланцев, но я в тупике.


1-индексация в порядке.
Artyer

1
úтак же, как ð×ì:)
Аднан

1
@ Артье совсем нет! +3 спасибо ему за то, что он указал, что мой ответ недействителен, мне нравится, когда люди действительно заботятся о том, чтобы прочитать ответ достаточно долго, чтобы заметить, что он неправильный. Я достаточно перефразировал это, чтобы звучать менее саркастично: P?
Волшебная Урна Осьминога

2
@ Adnan НЕТ ЧУДЕСА, Я НЕ МОГУ ОТВЕТИТЬ ЕГО. Извините за убийство вашего имени Джонатан Аллан .
Волшебная Урна Осьминога

2
На самом деле не проблема :)
Джонатан Аллан



5

Желе , 29 байт

s”\⁹¦€Fð€0,1¦Zsð⁶ẋ;Ѐµ@"J;/z⁶

Флаги ввода и вывода представляют собой списки строк.
Длина волны 1-индексирована.
Всегда производит одну строку пробелов.
(все вышесказанное явно разрешено в размещенном вопросе)

Попробуйте онлайн! (нижний колонтитул, чтобы IO выглядел красиво - принимает и получает флаги в виде многострочного текста)

Как?

Очень похож на метод carusocomputing в ответе 05ab1e , который мне не удавалось больше упасть.

s”\⁹¦€Fð€0,1¦Zsð⁶ẋ;Ѐµ@"J;/z⁶ - Main link: list of lists f, number p
            ¦                 - apply to indexes (of f)
         0,1                  - ... 0 paired with 1 (i.e. last & first -> bottom & top)
       ð€                     - the previous chain with p as right argument for €ach:
s                             -   split into chunks of length p
    ¦€                        -   apply to indexes for €ach
   ⁹                          -   ... link's right argument, p
 ”\                           -   the character '\' (a replacement - if the index is out of bounds this has no effect - although this might change in the future.)
             Z                - transpose the edited flag
              s               - split into chunks of length p
                        J     - range of length = [1,2,...,nChunks]
               ð     µ@"      - zip with reversed arguments (call those i):
                ⁶             -   literal space
                 ẋ            -    repeated i times
                  ;Ѐ         -    concatenate mapped across the chunks
                         ;/   - undo the split (reduce with concatenation)
                           z⁶ - transpose with a filler of space characters

Почему это всегда делает желе?
Грифон - Восстановить Монику

05AB1E явно выиграл этот раунд!
Джонатан Аллан

Хорошо, почему это всегда или Jelly или 05AB1E, которые делают это? (Риторический вопрос, я знаю, это потому, что они
Грифон - Восстановить Монику


2

JavaScript (ES6), 175 байт

f=(s,l,p=++l,t=s.replace(/^-*|-*$/g,s=>s.replace(/-/g,(c,i)=>++i%l?c:`\\`)))=>t.search`
`<p?t:(f(s,l,p+l,t)+`
`+` `.repeat(p)).replace(eval(`/(^|(.*)\\n)(.{${p}})/g`),`
$3$2`)
;
test=(s,l)=>document.write(`<pre>${s}
${l}${f(s,l)}</pre>`);
test(`---
abc
---`,2);
test(`-----
| + |
-----`,10);
test(`---------------------------------------
|&&&&&&                         &&&&&&|
|&&&&&&                         &&&&&&|
|&&&&&&                         &&&&&&|
|&&&&&&          .\\^/.          &&&&&&|
|&&&&&&        . |   | .        &&&&&&|
|&&&&&&        |\\|   |/|        &&&&&&|
|&&&&&&     .--'       '--.     &&&&&&|
|&&&&&&      \\           /      &&&&&&|
|&&&&&&       >         <       &&&&&&|
|&&&&&&      '~|/~~|~~\\|~'      &&&&&&|
|&&&&&&            |            &&&&&&|
|&&&&&&                         &&&&&&|
|&&&&&&                         &&&&&&|
---------------------------------------`,12);
test(`-----------------------
|-._\`-._ :| |: _.-'_.-|
|   \`-._\`:| |:\`_.-'   |
|-------\`-' '-'-------|
|------_.-. .-._------|
|  _.-'_.:| |:._\`-._  |
|-'_.-'  :| |:  \`-._\`-|
-----------------------`,4);
test(`---------------
---------------
---------------
---------------
---------------`,5);
test(`-------------------------------------------
|*  *  *  *  * |##########################|
| *  *  *  *  *|                          |
|*  *  *  *  * |##########################|
| *  *  *  *  *|                          |
|*  *  *  *  * |##########################|
| *  *  *  *  *|                          |
|*  *  *  *  * |##########################|
|---------------                          |
|#########################################|
|                                         |
|#########################################|
|                                         |
|#########################################|
-------------------------------------------`,0);

Ввод / вывод выполняется в виде строки с разделителями новой строки. Вывод включает в себя ведущий перевод строки; это может быть удалено по стоимости 3 байта. Я попытался вычислить строку вывода напрямую, но это заняло у меня ... 176 байт:

f=
(a,l,h=a.length)=>[...Array(h+(a[0].length-1)/++l|0)].map((_,i)=>a[0].replace(/./g,(k,j)=>((k=i-(j/l|0))&&h+~k)|-~j%l?(a[k]||'')[j]||' ':'\\'))
;
test=(s,l)=>document.write(`<pre>${s}
${l}
${f(s.split`
`,l).join`
`}</pre>`);
test(`---
abc
---`,2);
test(`-----
| + |
-----`,10);
test(`---------------------------------------
|&&&&&&                         &&&&&&|
|&&&&&&                         &&&&&&|
|&&&&&&                         &&&&&&|
|&&&&&&          .\\^/.          &&&&&&|
|&&&&&&        . |   | .        &&&&&&|
|&&&&&&        |\\|   |/|        &&&&&&|
|&&&&&&     .--'       '--.     &&&&&&|
|&&&&&&      \\           /      &&&&&&|
|&&&&&&       >         <       &&&&&&|
|&&&&&&      '~|/~~|~~\\|~'      &&&&&&|
|&&&&&&            |            &&&&&&|
|&&&&&&                         &&&&&&|
|&&&&&&                         &&&&&&|
---------------------------------------`,12);
test(`-----------------------
|-._\`-._ :| |: _.-'_.-|
|   \`-._\`:| |:\`_.-'   |
|-------\`-' '-'-------|
|------_.-. .-._------|
|  _.-'_.:| |:._\`-._  |
|-'_.-'  :| |:  \`-._\`-|
-----------------------`,4);
test(`---------------
---------------
---------------
---------------
---------------`,5);
test(`-------------------------------------------
|*  *  *  *  * |##########################|
| *  *  *  *  *|                          |
|*  *  *  *  * |##########################|
| *  *  *  *  *|                          |
|*  *  *  *  * |##########################|
| *  *  *  *  *|                          |
|*  *  *  *  * |##########################|
|---------------                          |
|#########################################|
|                                         |
|#########################################|
|                                         |
|#########################################|
-------------------------------------------`,0);

Ввод / вывод в виде строкового массива.


Похоже, что единственный тест, который вы проходите, это тот, который не меняется.
Мари

Да, это не работает должным образом для большинства тестовых случаев. (Первым было то, что я попробовал)
Artyer

2
@Artyer Извините, это было незаметно; Я не заметил единственную ошибку.
Нил

2

PHP, 168 164 187 172 167 153 150 152 149 байт

for($r=count($f=file(a));$y<$r+$e/$n=$argn;$y+=print"
")for($x=0;$x+1<$e=strlen($f[0])-1;)echo("\\".$f[$z=$y-($x/$n|0)][$x++]." ")[$z%($r-1)||$x%$n];

берет флаг из статического файла aи длину волны (минимум 1) из STDIN.
Запустите как трубу с php -nrили попробуйте онлайн .

сломать

for($r=count($f=file(a));       # import file, count lines
    $y<$r+$e/$n=$argn;          # loop $y through lines
    $y+=print"\n")                      # 2. print newline
    for($x=0;$x+1<$e=strlen($f[0])-1;)  # 1. loop $x through columns
    echo("\\".$f[                           # 3. create string=backslash+character+space
            $z=$y-($x/$n|0)                 # 1. line no. = $y - wave offset
        ][$x++]." "                         # 2. pick character from line
        )
    [
        $z%($r-1)                           # if not first or last line
        ||$x%$n                             # or not last position of wave
    ]                                       # then index 1 (character or space), else "\\"
    ;

Не работает для линий посередине: sandbox.onlinephpfunctions.com/code/…
Artyer

Это не должно превращать средние линии в ``. Смотрите тестовый пример после британского
Artyer

Похоже, что отсекаются некоторые основания флагов, которые сильно увеличиваются в размере: sandbox.onlinephpfunctions.com/code/…
Artyer

@Artyer Так и должно быть.
Тит

1
$z&&$z!=$r-1должно быть эквивалентно $z%($r-1)сохранению 3 байтов.
Кристоф
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.