Selamat Ulang Tahun, mari kita makan kue!

12

Ini adalah ulang tahun teman saya segera dan karena dia adalah seorang programmer dan pecinta seni ASCII, saya pikir saya akan membuatnya kue ASCII!

Sayangnya, saya terus melupakan usianya saat ini, jadi saya ingin memiliki program untuk oven ASCII saya, yang membuat kue dengan jumlah lilin tertentu, jadi saya tidak perlu melakukannya sendiri lagi jika saya salah dengan nya usia.

Oven ASCII hanya memiliki memori terbatas dan kapasitas penyimpanan, sehingga harus menggunakan byte sesedikit mungkin .


Tugas Anda:

Tulis program yang menampilkan kue ulang tahun ke konsol, dengan lilin sebanyak yang ditentukan input.

Persyaratan kue adalah:

  • Itu harus memiliki perbatasan, dibangun dari garis horizontal -dan vertikal |, dan simpul +.
  • Lebar minimal 5 karakter (termasuk batas kue |)
  • Tinggi minimal 5 karakter (termasuk batas kue -)
  • Harus ada karakter spasi putih antara batas kue dan dasar lilin pertama (bukan nyala api), di setiap sisi, kecuali jika ada nyala api di ruang itu. Dasar nyala api atau lilin tidak akan bisa menumpuk batas kue.
  • Lebar maksimum kue adalah 9 karakter, jadi ada maksimum 5 lilin per baris.
  • Karena kita tidak ingin kue kita menjadi 2 dimensi, itu harus 2 baris ekstra tinggi, untuk memberikannya volume. Tambahkan batas lain di bagian bawah dan hubungkan simpul dengan yang di atasnya, lagi menggunakan karakter ASCII dari atas ( -, |dan +).

Persyaratan lilin adalah:

  • Terdiri dari dasar |dan nyala *, dengan nyala ditumpuk di atas dasar.
  • Lilin mungkin tidak berbatasan langsung dengan satu sama lain, kecuali secara diagonal.
  • Lilin ditempatkan dari kiri ke kanan, kemudian dari atas ke bawah, dengan maksimum 5 dalam satu baris.
    (Catatan: Jika ada 5 lilin di baris sebelumnya, baris berikutnya tidak mungkin memiliki 5 juga, karena itu mereka akan berdekatan.)

Catatan tambahan:

  • Lebar kue tergantung pada jumlah lilin di baris pertama , tetapi harus minimal 5 karakter dan lebar maksimum 9 karakter.
  • Lilin diisi mulai dari baris paling atas, dari kiri ke kanan. Sekali satu baris jika penuh, yang berikutnya harus dimulai pada baris di bawah yang pertama.

Memasukkan:

Anda dapat menerima nomor dalam format (wajar) yang Anda suka.

Untuk tantangan ini, Anda dapat mengasumsikan bahwa jumlahnya antara 0 dan 2 31 (tidak termasuk 0), meskipun saya tidak mengakui seseorang yang setua ini.

Keluaran:

Anda dapat mengembalikan string atau langsung menulis kue yang dihasilkan ke konsol output.

Aturan:

  • Celah standar dilarang.
  • Ini adalah , jadi kode terpendek dalam byte, dalam bahasa apa pun, menang.

Contoh:

Memasukkan: 8

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

Memasukkan: 2

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

Memasukkan: 12

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

Semoga berhasil!

Ian H.
sumber
Bisakah ada beberapa solusi yang valid untuk suatu input?
officialaimm
1
@officialaimm Karena ada spesifikasi untuk pemesanan lilin dan ukuran kue, seharusnya tidak mungkin.
Ian H.
2
Fakta tidak berguna: Jika Anda merayakan ulang tahun Anda setiap detik, bukan setiap tahun, maka 2 ^ 31 ~ = 68 tahun. Tapi itu membuat banyak kue setiap hari dan mungkin menjadi membosankan setelah beberapa waktu.
Arnauld
1
@Arnauld Tetapi 99% waktu itu bukan hari ulang tahun Anda :( ... kecuali jika Anda merayakan fakta umum bahwa Anda dilahirkan.
Ian H.
3
@IanH. Katakanlah Anda merayakan cap waktu awal Anda. :-)
Arnauld

Jawaban:

10

Arang , 76 71 70 66 46 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 1 byte berkat @ASCII_Only. Menyimpan 20 byte besar dengan menemukan cara yang rapi untuk menggambar lilin. Penjelasan:

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

Hitung ukuran kedua kue keseluruhan termasuk volume tambahan dan hanya bagian atas kue sehingga bisa ditarik. (( == ASCII 61) = ( += ASCII 43) + 9 * 2 untuk volume tambahan.)

↘↘Fθ«

Pindahkan kursor ke baris pertama 5 lilin. Lingkari setiap lilin.

↑|*¶¶

Cetak lilin dan gerakkan ke kanan dua karakter untuk lilin berikutnya.

¿‹⁶﹪⁺ιι⁹«

Namun setelah lilin (diindeks-nol) ke-4, ke-8, ke-13, ke-17, ke-22, dll. (Yang ada di akhir baris),

M⁹←↓

pindahkan kursor ke lilin pertama di baris berikutnya. Ini berfungsi pada baris aneh dan genap!

Neil
sumber
1
Solusi Anda menempatkan baris ekstra (yang tidak diinginkan) untuk nomor input yang lebih kecil dari 6. :)
Ian H.
@IanH. Maaf, saya pikir itu adalah ketinggian minimum untuk beberapa alasan. Memperbaiki yang benar-benar menyelamatkan saya 4 byte!
Neil
Tampilan yang salah di TIO: /
Ian H.
1
@IanH. Cobalah online! memberi saya hasil yang identik dengan contoh Anda ...
Neil
1
@Neil ingat Anda tidak perlu di awal: P (btw terima kasih telah menemukan pegolf lain (tidak-begitu-) tepi kasus)
ASCII-satunya
3

Jelly , 67 byte

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

Tautan monadik yang mengambil nomor dan mengembalikan daftar karakter atau program lengkap untuk mencetak hasilnya.

Cobalah online!

Bagaimana?

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
Jonathan Allan
sumber
1
Hebat apa +1 untuk mengalahkan Arang
ASCII
@ Khusus ASCII Maaf, saya menemukan penghematan 4-byte ...
Neil
@Neil well itu bagus juga, Charcoal seharusnya bagus dalam seni ASCII (lebih baik daripada jelly): P
ASCII-only
1

Japt , 94 byte

/4½ c ÆYu ç +Um5-Yu)ÇV°<U?Q:Sø+(1+Yu)ç
"| {Ug ç}|"
Vd"|+ -"
[W¡"| {X}|"ÃVVWVW]c ·y rQ+S"*|" y

Cobalah online!

Justin Mariner
sumber