J'ai oublié le jour des serviettes

15

J'ai oublié le jour des serviettes

Lien Sandbox

Script PHP pour les deux exemples (erreur, formatage de la chaîne)

Script php corrigé, l'entrée est explicite

Script PHP avec plus de commentaires d'entrée / décommentation $argvpour voir différents résultats

Comme vous le savez peut-être, le 25 mai est bien connu sous le nom de Towel Day , en raison des nombreuses utilisations qu'une serviette peut avoir.

Un simple extrait du livre "Le guide de l'auto-stoppeur de la galaxie" (personnellement, j'ai pris ce livre comme un "guide de tous les jours" ) déclare:

"Une serviette est la chose la plus massivement utile qu'un auto-stoppeur interstellaire puisse avoir. En partie, elle a une grande valeur pratique."

Si vous avez besoin de plus d'informations sur les serviettes, consultez cette réponse SE.scifi


Le défi

J'espère que vous le ferez avec une serviette utilisée comme couverture pour vos jambes.

Écrivez un programme ou une fonction complète dans n'importe quel langage de programmation valide qui prend deux entrées

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

Comment dessiner une serviette avec ces valeurs?

Première utilisationsize :

Dessinez une serviette en fonction de la taille saisie, pour notre serviette

  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

Deuxièmement, donnez-lui message

Vous devez lui donner un message, qu'est-ce qu'une serviette sans un beau message cousu en fil d'or?

Exemple 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

Exemple 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ères de réponse acceptés

  • Il s'agit de codegolf, donc les règles normales s'appliquent.

Règles

  • Vous êtes assuré que toutes les chaînes d'entrée s'adapteront à la taille, donc aucune entrée comme size=1; message="This string is just tooooooooooooooooooooo long to fit the width and height of your towel".

  • Le format de chaîne dépend de vous, si vous voulez centrer les sous-chaînes par exemple.

  • Les sauts de mots sont interdits.

Modifications

Je suis vraiment désolé pour toute confusion, car les serviettes ansii que je dessine ne correspondaient pas aux paramètres, a ajouté un script PHP pour les deux exemples pour que vous puissiez vérifier les sorties attendues.

Merci également à toutes les personnes qui ont voté et qui ont considéré mon premier défi: D.

Francisco Hahn
la source
Donnez-moi quelques minutes pour le réparer (je viens de le voir). Ce qui s'est passé, c'est que j'ai fait un programme sur php pour dessiner la serviette mais c'était beaucoup plus simple que celui que j'ai présenté, j'avais un programme pour les exemples et j'ai oublié de le modifier.
Francisco Hahn
@Lynn a ajouté une solution php non golfée avec les deux cas de test, désolé pour toute confusion.
Francisco Hahn
Pouvons-nous choisir où vont les sauts de ligne?
Jakob
Le saut de ligne doit être ajouté lorsque le current line + next worddépassera la limite autorisée pour votre serviette @Jakob comme le script php que j'ai publié le décide.
Francisco Hahn
pouvons-nous prendre la largeur et / ou la hauteur de texte appropriées comme arguments au lieu de les calculer?
JoshM

Réponses:

4

Python 2 , 223 210 209 204 octets

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

Essayez-le en ligne!

TFeld
la source
2

JavaScript (Node.js) , 375 octets

C'est la pire soumission que vous obtiendrez, mais au moins j'ai essayé xD la moitié des octets sont des espaces

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

Essayez-le en ligne!

Luis felipe De jesus Munoz
la source
2

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

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

Essayez-le en ligne!


Explication:

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
la source
2

Fusain , 79 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

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

Calculez la taille de la serviette.

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

Dessinez la serviette.

F⪪S «

Faites une boucle sur chaque mot du message.

×⸿›⁺ⅈLι⁻δ² ι

Imprimez chaque mot sans déborder la largeur.

Neil
la source
Merveilleux et merci d'avoir pris le temps de relever le défi.
Francisco Hahn
1

V , 142 , 128 , 121 , 119 octets

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

Essayez-le en ligne!

JoshM
la source
1
C'est le genre de code que j'aimerais dire "Hé, si vous le faites, thisvous pouvez enregistrer n Bytes" .... mais je ne peux pas ... encore: D.
Francisco Hahn