Я забыл день полотенец


15

Я забыл день полотенец

Песочница ссылка

PHP скрипт для обоих примеров (ошибка, форматирование строки)

Исправлен скрипт php, ввод очевиден

PHP-скрипт с дополнительным комментарием / комментарием для ввода $argvразличных результатов

Как вы знаете, 25 мая хорошо известно как День полотенца , так как он может быть использован во многих случаях.

Простой отрывок из книги «Автостопом по Галактике» (лично я воспринял эту книгу как «ежедневный гид») ) гласит:

«Полотенце - это самая полезная вещь, которую может иметь межзвездный автостопщик. Отчасти это имеет большое практическое значение».

Если вам нужна дополнительная информация о полотенцах, проверьте ответ SE.scifi


Соревнование

Надеюсь, вы сделаете это с помощью полотенца, используемого в качестве одеяла для ваших ног.

Напишите полную программу или функцию на любом допустимом языке программирования, который принимает два входа

size        Integer  : #The size
message     string   : #A sentence

Как нарисовать полотенце с этими значениями?

Первое использованиеsize :

Нарисуйте полотенце в зависимости от размера ввода, для нашего полотенца

  width = 12*size

  #the line that has the "bar" its always present with different sizes

  Width is defined as:
  from the first | to the second | has to be equal to size*12 including both ||

      <-   width-> 
  [===|          |====]  
      | 12 chars ||   1  height starts here, just after the "bar"
      | SIZE = 1 ||   2
      |          ||   3   height = 5*size
      |          ||   4
      |          ||   5  height ends here just before the first line |=======|
      |==========||   # the lines with the # 
      |==========||   # are always fixed
      """"""""""""|   # it means, every towel
       |          |   # always has this 5 rows
       """"""""""""   # no matter the size

Во-вторых, дать ему message

Вы должны дать ему сообщение, что такое полотенце без красивого сообщения, сшитое в золотую нить?

Пример 1

  input: size=1, message="a simple message can stay with size"

  width = 12*size

  #the line that has the "bar" it's always present with different sizes
  #no words allowed at the bar level


  [===|          |====]  
      | a simple ||   1  height starts here, just after the "bar"
      | message  ||   2
      | can stay ||   3   height = 5*size
      | with size||   4
      |          ||   5  height ends here just before the first line |=======|
      |==========||   # the lines with the # 
      |==========||   # are always fixed
      """"""""""""|   # it means, every towel
       |          |   # always has this 5 rows
       """"""""""""   # no matter the size

Пример 2

input size=2 
message="Don't Panic and bring a towel to SE Programming Puzzles and CodeGolf"

The size is 2
That means 24 width and 10 heigth

    <-    24 chars width  ->
[===|                      |====]
    | Don't Panic and bring||   1
    | a towel to SE        ||   2
    | Programming Puzzles  ||   3
    | and CodeGolf         ||   4
    |                      ||   5
    |                      ||   6
    |                      ||   7
    |                      ||   8
    |                      ||   9
    |                      ||   10
    |======================||   #  The lines with the "#"
    |======================||   #  always present and
    """"""""""""""""""""""""|   #  adapted to 
     |                      |   #  the towel width
     """"""""""""""""""""""""   #  

Принятые критерии ответа

  • Это Codegolf, поэтому применяются нормальные правила.

правила

  • Вы гарантированно, что все входные строки будут соответствовать размеру, так что ввод не нравится size=1; message="This string is just tooooooooooooooooooooo long to fit the width and height of your towel".

  • Формат строки зависит от вас, если вы хотите, например, центрировать подстроки.

  • Перерывы на слова запрещены.

Правки

Я искренне сожалею о любой путанице, потому что нарисованные мною полотенца не соответствовали параметрам, для обоих примеров добавлен PHP-скрипт для проверки ожидаемых результатов.

Также спасибо всем людям, которые проголосовали и рассмотрели мой первый вызов: D.


Дайте мне несколько минут, чтобы это исправить (только что видел). Случилось так, что я создал на php программу для рисования полотенца, но она была намного проще, чем та, которую я представил, у меня была программа для примеров, и я забыл ее изменить.
Франциско Хан

@Lynn добавил решение php ungolfed с обоими тестами, извините за путаницу.
Франциско Хан,

Можем ли мы выбрать, куда идут разрывы строк?
Якоб

Разрыв строки должен быть добавлен, когда current line + next wordбудет превышен лимит, разрешенный для вашего полотенца @Jakob, в зависимости от того, какой php-скрипт я разместил, он решает.
Франциско Хан

Можем ли мы взять правильную ширину текста и / или высоту в качестве аргументов вместо их вычисления?
JoshM

Ответы:



2

JavaScript (Node.js) , 375 байт

Это худшее представление, которое вы получите, но, по крайней мере, я попробовал xD, хотя половина байтов - это пробелы

(s,_,w=12*s-2,h=5*s)=>`
[===|${j=' '.repeat(w)}|====]
${[...Array(h)].map((g,i)=>_.split` `.reduce((a,b)=>((l=a.split`,`)[l.length-1]+b).length>w-1?a+','+b:a+' '+b,'').split`,`[i]).map(a=>`    |${a?(r=a.length)<w?a+' '.repeat(w-r):a:j}||    `).join`\n`+
`
    |${'='.repeat(w)}||    `.repeat(2)}
    ${y='"'.repeat(w+2)}|    
     |${j}|    
     ${y}
`

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


2

JavaScript (Node.js) , 347 345 343 337 334 328 326 байт

b=>d=>`
[===|${M=" "[X="repeat"](c=12*b-2)}|====]
${[...Array(5*b)].map((a,b)=>d[Y="split"]` `.reduce((a,b)=>((l=a[Y]`,`)[l[Z="length"]-1]+b)[Z]>c-1?a+","+b:a+" "+b)[Y]`,`[b]).map(a=>`    |${a?(r=a[Z])<c?a+" "[X](c-r):a:" "[X](c)}||    `).join`
`+`
    |${"="[X](c)}||    `[X](2)}
    ${y='"'[X](c+2)}|
     |${M}|
     ${y}
`

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


Пояснение:

b =>                                   // lambda function taking arg 1 : size
    d =>                               // arg 2 : message
        `                              // begin string template for drawing
[===|${                                // draw first part and now open literal 
        M = ' '[X='repeat'(c=12*b-2)]  // set 3 variables, M, X , c to be used again
    }|====]                            // close and draw the next part ====]
${[...Array(5*b)]                      // open and create an array of length 5 * b =width
.map(a,b=>                             // begin map function two args : a,b
        d[Y='split']` `                // use d(message), split at whitespace, set to Y
.reduce((a,b) =>                       // reduce to single value, arg 1 : a, arg 2 : b
        ((l = a[Y]`,`)                 // declare l and then find in l
        [l[Z='length']-1]              // set Z as length
        + b)                           // add value of b
        [Z]                            // find the length 
        > c-1 ?                        // check if it's less than c - 1
        a+','+b                        // then add `${a},${b}`
        : a + ' ' + b                  // otherwise `${a} ${b}`
        )[Y]`,`                        // close and split at comma
        [b]                            // use b again
        )                              // close
        .map(a =>                      // map over that arg 1 : a
                `    |${               // four space + | and open 
        a ?                            // if a is true or a truthy value
            (r=a[Z])                   // set value of r as a's length
            < c ?                      // check if it's less than c
                a+' '[X](c-r)          // then draw a + space repeated c-r times
                : a + ' '[X](c)        // else draw a + space repeated c times
            }                          // close
            ||    `                    // add || and 4 spaces and close
        )                              // end
        .join`
`                                      // and turn to string with new line as separator 
    +                                  // add to that
    `
    |{                                 // new line , 4 spaces and | 
        '='[X](c)}                     // repeat = c times
        ||    `[X](2)}                 // and repeat that 2 times
    ${                                 // new line + 4 space
    y = '"'[X](c+2)                    // repeat " c + 2 times and set to y
    }|                                 // close and add |
    |{                                 // add | and open
        M}|                            // put M and close and add |
    {y}                                // new line , 4 spaces and variable y
`                                      // end with new line.

2

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

Nθ≔×⁵θε≔×¹²θδ←P←====[↓⁺³ε×"δ↖P↑⁺³ε←G↑²←⁻δ²↓²=↓↓↓¹×"δ↖↑⁺⁴ε====]F⪪S «×⸿›⁺ⅈLι⁻δ² ι

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

Nθ≔×⁵θε≔×¹²θδ

Рассчитайте размер полотенца.

←P←====[↓⁺³ε×"δ↖P↑⁺³ε←G↑²←⁻δ²↓²=↓↓↓¹×"δ↖↑⁺⁴ε====]

Нарисуй полотенце.

F⪪S «

Зацикливайтесь на каждом слове сообщения.

×⸿›⁺ⅈLι⁻δ² ι

Напечатайте каждое слово, не превышая ширину.


Чудесно, и спасибо, что нашли время для испытания.
Франциско Хан

1

V , 142 , 128 , 121 , 119 байтов

:let @h=5*@a
:let @w=12*@a-2
O[===|@wá 4á=á]
:set tw=w
Vgq@hï{+@hjI    |kf|@hjjyt=pjp+@hjkl@wr=Ùjlr|Ù@w««r"YkP0xÁ|

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


1
Это тот код, который я хотел бы сказать: «Эй, если ты это сделаешь, thisты можешь сохранить n Bytes»… но я не могу… пока: D.
Франсиско Хан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.