Ich habe den Handtuchtag vergessen


15

Ich habe den Handtuchtag vergessen

Sandbox-Link

PHP-Skript für beide Beispiele (Fehler, Formatierung des Strings)

Korrigiertes PHP-Skript, die Eingabe ist selbsterklärend

PHP-Skript mit mehr Kommentaren / Kommentaren $argv, um unterschiedliche Ergebnisse zu sehen

Wie Sie vielleicht wissen, ist der 25. Mai wegen der vielen Verwendungsmöglichkeiten, die ein Handtuch haben kann, als Handtuch-Tag bekannt .

Ein einfacher Auszug aus dem Buch "Per Anhalter durch die Galaxis" (ich persönlich habe dieses Buch als "Alltagsführer" angesehen ) besagt:

"Ein Handtuch ist ungefähr das Nützlichste, was ein interstellarer Anhalter haben kann. Zum Teil hat es einen großen praktischen Wert."

Wenn Sie weitere Informationen zu Handtüchern benötigen, klicken Sie auf diese Antwort


Die Herausforderung

Hoffentlich tun Sie dies mit einem Handtuch, das als Decke für Ihre Beine dient.

Schreiben Sie ein vollständiges Programm oder eine Funktion in einer gültigen Programmiersprache, die zwei Eingaben akzeptiert

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

Wie zeichnet man ein Handtuch mit diesen Werten?

Erste Verwendungsize :

Zeichnen Sie ein Handtuch in Abhängigkeit von der Größe Eingang, für unser Handtuch

  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

Zweitens geben Sie es die message

Sie müssen es eine Nachricht geben, was ist ein Handtuch ohne eine schöne Nachricht in goldenen Faden genäht?

Beispiel 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

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

Akzeptierte Antwortkriterien

  • Dies ist Codegolf, daher gelten die normalen Regeln.

Regeln

  • Sie werden garantiert, dass alle Eingabezeichenfolgen der Größe entsprechen, also keine Eingabe wie size=1; message="This string is just tooooooooooooooooooooo long to fit the width and height of your towel".

  • Das Format der Zeichenfolge liegt bei Ihnen, wenn Sie beispielsweise die Teilzeichenfolgen zentrieren möchten.

  • Wortumbrüche sind nicht erlaubt.

Bearbeitungen

Es tut mir wirklich leid, dass ich etwas verwirrt habe, da die von mir gezeichneten Ansii-Handtücher nicht mit den Parametern übereinstimmten. Für beide Beispiele wurde ein PHP-Skript hinzugefügt, mit dem Sie die erwarteten Ausgaben überprüfen können.

Vielen Dank auch an alle, die für meine erste Herausforderung gestimmt haben: D.


Geben Sie mir ein paar Minuten, um das Problem zu beheben (ich habe es gerade gesehen). Was passierte war, dass ich ein Programm auf PHP gemacht habe, um das Handtuch zu zeichnen, aber es war viel einfacher als das, das ich vorgestellt habe. Ich hatte ein Programm für die Beispiele und vergaß, es zu modifizieren.
Francisco Hahn

@Lynn fügte eine php ungolfed Lösung mit beiden Testfällen hinzu.
Francisco Hahn

Können wir wählen, wohin die Zeilenumbrüche gehen?
Jakob

Der Zeilenumbruch sollte hinzugefügt werden, wenn der current line + next wordzulässige Grenzwert für Ihr Handtuch @Jakob überschritten wird, da das von mir bereitgestellte PHP-Skript darüber entscheidet.
Francisco Hahn

Können wir die richtige Textbreite und / oder -höhe als Argumente verwenden, anstatt sie zu berechnen?
JoshM

Antworten:


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

Probieren Sie es online!


2

JavaScript (Node.js) , 375 Byte

Dies ist die schlechteste Einsendung, die Sie erhalten, aber zumindest habe ich versucht, xD die Hälfte der Bytes sind Leerzeichen

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

Probieren Sie es online!


2

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

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

Probieren Sie es online!


Erklärung:

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

Kohle , 79 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

Berechnen Sie die Größe des Handtuchs.

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

Zeichne das Handtuch.

F⪪S «

Schleife über jedes Wort der Nachricht.

×⸿›⁺ⅈLι⁻δ² ι

Drucken Sie jedes Wort aus, ohne die Breite zu überschreiten.


Großartig und danke, dass Sie sich Zeit für die Herausforderung genommen haben.
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Á|

Probieren Sie es online!


1
Dies ist die Art von Code, die ich gerne sagen würde: "Hey, wenn du das tust, kannst thisdu sparen n Bytes" ... aber ich kann nicht ... noch: D.
Francisco Hahn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.