Zapomniałem dnia na ręczniki

15

Zapomniałem dnia na ręczniki

Link do piaskownicy

Skrypt PHP dla obu przykładów (błąd, formatowanie ciągu)

Poprawiony skrypt php, dane wejściowe są zrozumiałe

Skrypt PHP z większą ilością komentarzy / komentarzy, $argvaby zobaczyć różne wyniki

Jak zapewne wiesz, 25 maja jest znany jako Dzień Ręczników , ze względu na wiele zastosowań, które może mieć ręcznik.

Prosty fragment książki „Przewodnik autostopem po galaktyce” (osobiście wziąłem tę książkę jako „codzienny przewodnik” ) stwierdza:

„Ręcznik to najbardziej użyteczna rzecz, jaką może mieć międzygwiezdny autostopowicz. Częściowo ma on wielką wartość praktyczną”.

Jeśli potrzebujesz więcej informacji na temat ręczników, sprawdź tę odpowiedź SE.scifi


Wyzwanie

Mam nadzieję, że zrobisz to z ręcznikiem jako kocem na nogi.

Napisz pełny program lub funkcję w dowolnym poprawnym języku programowania, który wymaga dwóch danych wejściowych

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

Jak narysować ręcznik o tych wartościach?

Pierwsze użyciesize :

Narysuj ręcznik w zależności od wielkości wejściowej, dla naszego ręcznika

  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

Po drugie, daj mu message

Musisz przekazać mu wiadomość, czym jest ręcznik bez pięknej wiadomości wszytej w złotą nić?

Przykład 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

Przykład 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
     """"""""""""""""""""""""   #  

Zaakceptowane kryteria odpowiedzi

  • To jest codegolf, więc obowiązują normalne zasady.

Zasady

  • Masz gwarancję, że wszystkie ciągi wejściowe będą pasować do rozmiaru, więc żadne dane wejściowe nie będą podobne size=1; message="This string is just tooooooooooooooooooooo long to fit the width and height of your towel".

  • Format ciągu zależy od Ciebie, jeśli chcesz na przykład wyśrodkować podłańcuchy.

  • Podziały słów są niedozwolone.

Edycje

Naprawdę przepraszam za jakiekolwiek zamieszanie, ponieważ narysowane przeze mnie ręczniki ansii nie pasowały do ​​parametrów, dodałem skrypt PHP dla obu przykładów , aby sprawdzić oczekiwane wyniki.

Dziękuję również wszystkim osobom, które głosowały i rozważały moje pierwsze wyzwanie: D.

Francisco Hahn
źródło
Daj mi kilka minut na naprawę (właśnie to zobaczyłem). Stało się to, że stworzyłem program do php do rysowania ręcznika, ale był on znacznie prostszy niż ten, który przedstawiłem, miałem program do przykładów i zapomniałem go zmodyfikować.
Francisco Hahn
@Lynn dodał rozwiązanie niestosowane w php do obu przypadków testowych, przepraszam za jakiekolwiek zamieszanie.
Francisco Hahn
Czy możemy wybrać, gdzie podziały się linie?
Jakob
Podział wiersza powinien zostać dodany, gdy current line + next wordprzekroczy limit dozwolony dla twojego ręcznika @Jakob, jak decyduje skrypt php, który opublikowałem.
Francisco Hahn
czy możemy przyjąć odpowiednią szerokość i / lub wysokość tekstu jako argumenty zamiast je obliczać?
JoshM

Odpowiedzi:

4

Python 2 , 223 210 209 204 bajtów

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

Wypróbuj online!

TFeld
źródło
2

JavaScript (Node.js) , 375 bajtów

To najgorsze przesłanie, jakie dostaniesz, ale przynajmniej spróbowałem xD połowa bajtów to spacje

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

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
2

JavaScript (Node.js) , 347 345 343 337 334 328 326 bajtów

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

Wypróbuj online!


Objaśnienie:

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
źródło
2

Węgiel drzewny , 79 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Oblicz rozmiar ręcznika.

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

Narysuj ręcznik.

F⪪S «

Pętla nad każdym słowem wiadomości.

×⸿›⁺ⅈLι⁻δ² ι

Wydrukuj każde słowo bez przepełnienia szerokości.

Neil
źródło
Cudownie i dziękuję za poświęcenie czasu na wyzwanie.
Francisco Hahn
1

V , 142 , 128 , 121 , 119 bajtów

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

Wypróbuj online!

JoshM
źródło
1
Jest to rodzaj kodu, który chciałbym powiedzieć „Hej, jeśli możesz this, możesz zapisać n Bytes” ... ale nie mogę ... jeszcze: D.
Francisco Hahn