ฉันลืมวันผ้าเช็ดตัว


15

ฉันลืมวันผ้าเช็ดตัว

ลิงก์ Sandbox

สคริปต์ PHP สำหรับทั้งสองตัวอย่าง (ข้อผิดพลาดการจัดรูปแบบสตริง)

สคริปต์ PHP ที่ถูกต้องอินพุตเป็นแบบอธิบายตนเอง

สคริปต์ PHP พร้อมความเห็นเพิ่มเติม / ไม่ใส่ข้อคิดเห็น$argvเพื่อดูผลลัพธ์ที่แตกต่าง

อย่างที่คุณอาจทราบว่าวันที่ 25 พฤษภาคมเป็นที่รู้จักกันดีในชื่อ ผ้าเช็ดตัววันเพราะมีประโยชน์หลายอย่างที่สามารถใช้ผ้าเช็ดตัวได้

สารสกัดที่เรียบง่ายของหนังสือ"The Hitchhiker Guide to the Galaxy" (โดยส่วนตัวฉันใช้หนังสือเล่มนี้เป็น"คู่มือประจำวัน" ) ระบุ:

"ผ้าเช็ดตัวเป็นเรื่องเกี่ยวกับสิ่งที่มีประโยชน์มากที่สุดอย่างที่โบกรถระหว่างดวงดาวสามารถมีได้ส่วนหนึ่งมันมีคุณค่าในทางปฏิบัติที่ดี"

หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับผ้าเช็ดตัวให้ตรวจสอบคำตอบ 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"กัน

  • รูปแบบสตริงขึ้นอยู่กับคุณถ้าคุณต้องการจัดกึ่งกลางของสตริงย่อย

  • การแบ่งคำไม่ได้รับอนุญาต

การแก้ไข

ฉันเสียใจอย่างแท้จริงเกี่ยวกับการถูกกระทบกระเทือนใด ๆ เพราะ ansii towels ฉันวาดไม่ตรงกับพารามิเตอร์เพิ่มสคริปต์ PHP สำหรับทั้งสองตัวอย่างเพื่อให้คุณตรวจสอบผลลัพธ์ที่คาดหวัง

ขอขอบคุณทุกคนที่ลงคะแนนและพิจารณาความท้าทายครั้งแรกของฉัน: D


ให้เวลาฉันสองสามนาทีในการแก้ไข (เพิ่งเห็นสิ่งนี้) สิ่งที่เกิดขึ้นคือฉันทำโปรแกรมบน php เพื่อวาดผ้าเช็ดตัว แต่มันง่ายกว่าที่ฉันนำเสนอมากฉันมีโปรแกรมสำหรับตัวอย่างและฉันลืมที่จะแก้ไข
Francisco Hahn

@Lynn เพิ่ม php ungolfed solution กับทั้งสองกรณีทดสอบขออภัยเกี่ยวกับการถูกรบกวน
Francisco Hahn

เราสามารถเลือกได้ว่าจะขึ้นบรรทัดใหม่หรือไม่
Jakob

ควรเพิ่มตัวแบ่งบรรทัดเมื่อcurrent line + next wordจะเกินขีด จำกัด ที่อนุญาตสำหรับผ้าเช็ดตัวของคุณ @Jakob เมื่อสคริปต์ php ที่ฉันโพสต์ตัดสินใจ
Francisco Hahn

เราสามารถนำความกว้างของข้อความและ / หรือความสูงที่เหมาะสมมาเป็นอาร์กิวเมนต์แทนการคำนวณได้หรือไม่?
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ι⁻δ² ι

พิมพ์แต่ละคำโดยไม่ล้นความกว้าง


มหัศจรรย์และขอบคุณที่สละเวลาสำหรับความท้าทาย
Francisco Hahn

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
Francisco Hahn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.