สุขสันต์วันเกิดขอเค้กกันเถอะ!


12

มันเป็นวันเกิดของเพื่อนฉันในไม่ช้าและเนื่องจากเขาเป็นโปรแกรมเมอร์และคนรักงานศิลปะ ASCII ฉันคิดว่าฉันจะทำให้เขาเป็นเค้ก ASCII!

น่าเศร้าที่ฉันลืมอายุปัจจุบันของเขาดังนั้นฉันจึงต้องการมีโปรแกรมสำหรับเตาอบ ASCII ของฉันที่อบเค้กด้วยจำนวนเทียนที่ระบุดังนั้นฉันไม่ต้องทำเองถ้าฉันทำผิดกับเขา อายุ.

ASCII เตาอบเพียง แต่มีหน่วยความจำและความจุที่ จำกัด ดังนั้นจึงควรใช้ไบต์น้อยที่สุดที่เป็นไปได้


งานของคุณ:

เขียนโปรแกรมที่ส่งเค้กวันเกิดไปยังคอนโซลโดยมีเทียนให้มากที่สุดเท่าที่อินพุตระบุ

ข้อกำหนดเค้กคือ:

  • มันจะต้องมีเส้นขอบสร้างขึ้นจากแนวนอน-และแนวตั้งเส้นและจุด|+
  • อย่างน้อย 5 ตัวอักษรกว้าง (รวมถึงชายแดนเค้ก|)
  • อย่างน้อย 5 ตัวอักษรสูง (รวมถึงชายแดนเค้ก-)
  • จะต้องมีตัวอักษรช่องว่างระหว่างชายแดนเค้กและฐานเทียนแรก (ไม่ใช่เปลวไฟ) ในแต่ละด้านยกเว้นว่ามีเปลวไฟในพื้นที่นั้น เปลวไฟหรือเทียนฐานไม่ควรซ้อนทับขอบเค้ก
  • ความกว้างสูงสุดของเค้กคือ 9 ตัวอักษรดังนั้นจึงมีสูงสุด 5 เทียนต่อแถว
  • เนื่องจากเราไม่ต้องการให้เค้กของเราเป็นแบบสองมิติมันจะต้องมีความสูงเพิ่มอีก 2 แถวเพื่อให้ได้ปริมาตร เพิ่มชายแดนอื่นที่ด้านล่างและเชื่อมต่อจุดกับคนที่เหนือกว่าพวกเขาอีกครั้งใช้อักขระ ASCII จากด้านบน ( -, |และ+)

ความต้องการเทียนคือ:

  • ประกอบด้วยฐาน|และเปลวไฟ*โดยมีเปลวไฟซ้อนอยู่ด้านบนของฐาน
  • เทียนอาจไม่ได้อยู่ติดกันกับคนอื่น ๆ ยกเว้นเส้นทแยงมุม
  • เทียนถูกวางจากซ้ายไปขวาจากนั้นจากบนลงล่างโดยมี 5 ในหนึ่งบรรทัดที่สูงสุด
    (หมายเหตุ: หากมีเทียน 5 อันในแถวก่อนหน้าแถวถัดไปอาจจะไม่ได้ 5 รวมทั้งเนื่องจากจะติดกัน)

หมายเหตุเพิ่มเติม:

  • ความกว้างของเค้กขึ้นอยู่กับจำนวนเทียนในแถวแรกแต่ต้องมีอย่างน้อย 5 ตัวอักษรและสูงสุด 9 ตัว
  • เทียนจะถูกเติมเต็มโดยเริ่มจากแถวบนสุดจากซ้ายไปขวา เมื่อหนึ่งแถวหากเต็มแล้วแถวถัดไปควรเริ่มต้นในแถวด้านล่างแถวแรก

การป้อนข้อมูล:

คุณอาจยอมรับตัวเลขในรูปแบบ (สมเหตุสมผล) ที่คุณต้องการ

สำหรับความท้าทายนี้คุณอาจคิดว่าตัวเลขอยู่ระหว่าง 0 ถึง 2 31 (ไม่รวม 0) แม้ว่าฉันจะไม่ยอมรับคนที่มีอายุเท่านี้

เอาท์พุท:

คุณสามารถส่งคืนสตริงหรือเขียนผลลัพธ์เค้กลงในเอาต์พุตคอนโซลโดยตรง

กฎ:

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือดังนั้นรหัสที่สั้นที่สุดเป็นไบต์ในภาษาใดก็ได้จะเป็นผู้ชนะ

ตัวอย่าง:

การป้อนข้อมูล: 8

+-----------+
| * * * * * |
| |*|*|*| | |
|  | | |    |
|           |
+-----------+
|           |
+-----------+

การป้อนข้อมูล: 2

+-----+
| * * |
| | | |
|     |
+-----+
|     |
+-----+

การป้อนข้อมูล: 12

+-----------+
| * * * * * |
| |*|*|*|*| |
| *|*|*| |  |
| | | |     |
|           |
+-----------+
|           |
+-----------+

โชคดี!


มีวิธีแก้ไขปัญหาที่ถูกต้องหลายอย่างสำหรับอินพุตหรือไม่?
เป็นทางการ

1
@officialaimm เนื่องจากมีข้อกำหนดสำหรับการสั่งเทียนและการปรับขนาดเค้กจึงไม่สามารถทำได้
เอียนเอช.

2
ความจริงที่ไร้ประโยชน์: ถ้าคุณฉลองวันเกิดทุก ๆ วินาทีแทนทุก ๆ ปีดังนั้น 2 ^ 31 ~ = 68 ปี แต่นั่นทำให้เค้กมากทุกวันและอาจกลายเป็นน่าเบื่อหลังจากเวลา
Arnauld

1
@Arnauld แต่แล้ว 99% ของเวลาที่มันไม่ได้เป็นวันเกิดของคุณ :( ... ยกเว้นถ้าคุณมีการเฉลิมฉลองความเป็นจริงทั่วไปที่คุณเกิด.
เอียนเอช

3
@IanH สมมติว่าคุณกำลังเฉลิมฉลองการประทับเวลาของคุณแล้ว :-)
Arnauld

คำตอบ:


10

ถ่าน , 76 71 70 66 46 ไบต์

NθF=+B⁺³⌊⟦χ⁺θθ⟧÷⁺℅ι⁺θθ⁹↘↘Fθ«↑|*¶¶¿‹⁶﹪⁺ιι⁹«M⁹←↓

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด แก้ไข: บันทึก 1 ไบต์ขอบคุณ @ASCII_Only บันทึกขนาดใหญ่ 20 ไบต์โดยค้นพบวิธีการวาดเทียนอย่างประณีต คำอธิบาย:

NθF=+B⁺³⌊⟦χ⁺θθ⟧÷⁺℅ι⁺θθ⁹

คำนวณขนาดทั้งเค้กทั้งหมดรวมทั้งปริมาตรพิเศษและด้านบนสุดของเค้กเพื่อให้สามารถวาดได้ (( == ASCII 61) = ( += ASCII 43) + 9 * 2 สำหรับปริมาณเพิ่มเติม)

↘↘Fθ«

เลื่อนเคอร์เซอร์ไปที่แถวแรกของเทียน 5 อัน วนผ่านเทียนแต่ละอัน

↑|*¶¶

พิมพ์เทียนและเลื่อนไปทางขวาสองตัวอักษรสำหรับเทียนถัดไป

¿‹⁶﹪⁺ιι⁹«

อย่างไรก็ตามหลังจากที่เทียน (ที่มีดัชนีเป็นศูนย์) อันดับ 4, 8, 13, 17, 22 และอื่น ๆ เทียน (ที่อยู่ท้ายแถว)

M⁹←↓

เลื่อนเคอร์เซอร์ไปที่เทียนแรกในแถวถัดไป สิ่งนี้ใช้ได้กับทั้งแถวคู่และแถวคู่!


1
วิธีการแก้ปัญหาของคุณทำให้ (การที่ไม่พึงประสงค์) แถวพิเศษสำหรับการป้อนตัวเลขจำนวนขนาดเล็กกว่า 6. :)
เอียนเอช

@IanH ขออภัยฉันคิดว่านั่นเป็นความสูงขั้นต่ำด้วยเหตุผลบางอย่าง การแก้ไขที่ช่วยฉัน 4 ไบต์ได้จริง!
Neil

ยังคงแสดงข้อผิดพลาดใน TIO: /
Ian H.

1
@IanH ลองออนไลน์! ให้ผลลัพธ์ที่เหมือนกันกับตัวอย่างของคุณ ...
Neil

1
@ ไม่มีโปรดจำไว้ว่าคุณไม่จำเป็นต้องเริ่มต้น: P (btw ขอบคุณสำหรับการค้นหากรณีนักกอล์ฟอีกคน (ไม่พอดู))
ASCII- เท่านั้น

3

เยลลี่ , 67 ไบต์

s9s€5Ẏa;⁶;⁶z⁶Z
ç”|ṙ-ż"ç”*$U⁸RḤ’¤¦Ẏ€j@€“| “|”Zj@€⁾--Z”+®¦€0,1©¦;ṫ¥-Y

ลิงก์ monadic ที่ใช้ตัวเลขและส่งคืนรายการอักขระหรือโปรแกรมเต็มรูปแบบที่พิมพ์เอาต์พุต

ลองออนไลน์!

อย่างไร?

s9s€5Ẏa;⁶;⁶z⁶Z - Link 1, make some candle parts & topping: number, age; character, part
s9             - split (implicit range(age)) into chunks of 9 (or remainder)
  s€5          - split each chunk of 9 into chunks of 5 (a 5 and a 4 or remainder)
     Ẏ         - tighten (to a list of lists of length 5, 4, 5, 4, ..., remainder)
      a        - logical and with the part character (either | or * here)
       ;⁶      - concatenate a space (we all still want topping when no candles)
         ;⁶    - ...and another (we also want some extra topping below the last row)
           z⁶  - transpose with filler space (fill the top with topping!)
             Z - transpose (put it back around the right way again chef)

ç”|ṙ-ż"ç”*$U⁸RḤ’¤¦Ẏ€j@€“| “|”Zj@€⁾--Z”+®¦€0,1©¦;ṫ¥-Y - Main link: number, age
ç”|                                                  - call last link (1) as a dyad with '|'
   ṙ-                                                - rotate left by -1
          $                                          - last two links as a monad:
       ç”*                                           -   call (1) as a dyad with '*'
      "                                              - zip with the dyadic operation:
     ż                                               -   zip (interleave each)
                 ¦                                   - sparse application:
           U                                         - ...of: upend (reverse each)
                ¤                                    - ...to indexes: nilad+links as a nilad:
            ⁸                                        -   chain's left argument, age
             R                                       -   range
              Ḥ                                      -   double (vectorises)
               ’                                     -   increment
                  Ẏ€                                 - tighten €ach (from '|*' or '*|' pairs)
                       “| “|”                        - literal ["| ", "|"]
                    j@€                              - join (swap arguments) for €ach (add a little extra topping to the left, and add piping to the sides)
                             Z                       - transpose
                                 ⁾--                 - literal "--"
                              j@€                    - join (swap arguments) for €ach (add piping to the top and bottom edges)
                                    Z                - transpose (time to invest in a potters wheel!)
                                              ¦      - sparse application:
                                          0,1        - ...to indexes: [0,1] (both ends)
                                             ©       -   (copy that to the register)
                                         €           - ...of: for each:
                                        ¦            -   sparse application:
                                     ”+              -   ...of: '+' character
                                       ®             -   ...to indexes: recall from register (both ends)
                                                  -  - literal -1
                                                 ¥   - last two links as a dyad
                                                ṫ    -   tail from index (gets last two rows)
                                               ;     -   concatenate (repeats them underneath)
                                                   Y - join with newlines
                                                     - as a full program: implicit print

1
ศักดิ์สิทธิ์อะไร +1 สำหรับการตีถ่าน
ASCII เท่านั้น

@ ASCII เท่านั้นขออภัยฉันพบการประหยัดแบบ 4 ไบต์ ...
Neil

@Neil ก็ดีเช่นกันถ่านควรจะดีที่ ASCII art (ดีกว่า jelly) หลังจากทั้งหมด: P
ASCII เท่านั้น

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