Eu esqueci o dia da toalha

15

Eu esqueci o dia da toalha

Link sandbox

Script PHP para os dois exemplos (erro, formatação da string)

Script php corrigido, a entrada é auto-explicativa

Script PHP com mais comentários / comentários $argvpara ver resultados diferentes

Como você deve saber, 25 de maio é conhecido como Dia da Toalha , devido aos muitos usos que uma toalha pode ter.

Um simples extrato do livro "O Guia do Mochileiro das Galáxias" (pessoalmente, tomei este livro como um "guia do dia a dia" ) afirma:

"Uma toalha é a coisa mais útil que um caroneiro interestelar pode ter. Em parte, tem um grande valor prático".

Se precisar de mais informações sobre toalhas, consulte esta resposta SE.scifi


O desafio

Espero que você faça isso com uma toalha usada como cobertor para as pernas.

Escreva um programa ou função completa em qualquer linguagem de programação válida que aceite duas entradas

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

Como desenhar uma toalha com esses valores?

Primeiro usosize :

Desenhe uma toalha, dependendo do tamanho da entrada, para a nossa toalha

  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

Segundo, dê a ele message

Você tem que dar uma mensagem, o que é uma toalha sem uma linda mensagem costurada em fio dourado?

Exemplo 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

Exemplo 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
     """"""""""""""""""""""""   #  

Critérios de resposta aceitos

  • Este é um codegolf, portanto as regras normais se aplicam.

Regras

  • Você tem a garantia de que todas as seqüências de entrada caberão no tamanho, portanto, nenhuma entrada será como size=1; message="This string is just tooooooooooooooooooooo long to fit the width and height of your towel".

  • O formato da sequência é com você, se você quiser centralizar as substrings, por exemplo.

  • Quebras de palavras não são permitidas.

Editar% s

Eu realmente sinto muito por qualquer confusão, porque as toalhas ansii que desenhei não correspondiam aos parâmetros, adicionou um script PHP para os dois exemplos para você verificar as saídas esperadas.

Agradeço também a todas as pessoas que votaram e consideraram meu primeiro desafio: D.

Francisco Hahn
fonte
Dê-me alguns minutos para corrigi-lo (acabei de ver isso). O que aconteceu foi que eu criei um programa em php para desenhar a toalha, mas era muito mais simples do que o que apresentei, tinha um programa para os exemplos e esqueci de modificá-lo.
Francisco Hahn
O @Lynn adicionou uma solução php ungolfed com os dois casos de teste, desculpe-me por qualquer confusão.
Francisco Hahn
Podemos escolher para onde vão as quebras de linha?
Jakob
A quebra de linha deve ser adicionada quando current line + next wordexceder o limite permitido para a sua toalha @Jakob, conforme o script php que eu publiquei.
Francisco Hahn
podemos considerar a largura e / ou a altura adequadas do texto como argumentos em vez de calculá-las?
21918 JoshM

Respostas:

4

Python 2 , 223 210 209 204 bytes

def f(s,m):w=12*s-2;l='    |';print'[===|'+' '*w+'|====]';exec"j=(m+' ').rfind(' ',0,-~w);print l+'%*s||'%(w,m[:j]);m=m[j+1:];"*s*5;print(l+w*'='+'||\n')*2+' '*4+'"'*12*s+'|\n '+l+' '*w+'|\n    ','"'*12*s

Experimente online!

TFeld
fonte
2

JavaScript (Node.js) , 375 bytes

Este é o pior envio que você receberá, mas pelo menos tentei xD metade dos bytes são espaços

(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}
`

Experimente online!

Luis felipe De jesus Munoz
fonte
2

JavaScript (Node.js) , 347 345 343 337 334 328 326 bytes

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

Experimente online!


Explicação:

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.
Muhammad Salman
fonte
2

Carvão , 79 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

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

Calcule o tamanho da toalha.

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

Desenhe a toalha.

F⪪S «

Faça um loop sobre cada palavra da mensagem.

×⸿›⁺ⅈLι⁻δ² ι

Imprima cada palavra sem exceder a largura.

Neil
fonte
Maravilhoso, e obrigado por dedicar seu tempo ao desafio.
Francisco Hahn
1

V , 142 , 128 , 121 , 119 bytes

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

Experimente online!

JoshM
fonte
1
Este é o tipo de código que eu adoraria dizer "Ei, se thisvocê puder salvar n Bytes" .... mas eu não posso ... ainda: D.
Francisco Hahn