Advent Challenge 4: Hadir Lini Perakitan!

12

<< Sebelumnya Berikutnya >>

Santa mampu membuat ulang semua hadiah yang mencuri peri semalaman! Sekarang dia harus mengirim mereka ke jalur perakitan untuk pengemasan. Dia biasanya memiliki kamera untuk mengawasi perakitan baris kedua untuk memastikan para elf melakukan pekerjaan yang baik dan karena jalur perakitan gambar terlihat bagus di poster iklan [kutipan dibutuhkan]

Sayangnya, kameranya rusak, jadi dia ingin Anda menggambar simulasi seperti apa garis perakitan nantinya!

Agar jalur perakitan tetap bekerja pada efisiensi maksimum dan untuk mengurangi risiko kesalahan atau kegagalan, semua kotak yang ada memiliki lebar yang sama sehingga pas di sabuk konveyor.

Tantangan

Diberikan daftar hadiah yang diwakili oleh dimensi mereka, menampilkan sabuk konveyor dengan semua hadiah.

Hadiah diambil seperti ini:

  +----+
 /    /|
+----+ |
|    | +
|    |/
+----+

Hadiah ini memiliki lebar 1, tinggi 2, dan panjang 4. Perhatikan bahwa tanda plus tidak dihitung untuk panjang sisi, jadi hadiah dengan panjang 4 sebenarnya mencakup 6 posisi.

Semua hadiah digambar bersebelahan dengan satu ruang di antara dua karakter terdekat; yaitu, sudut kiri bawah dari hadiah diberi jarak sedemikian rupa sehingga jika kotak sekarang memiliki panjang ldan lebar w, sudut kiri bawah kotak hadiah berikutnya akan persis l + w + 4posisi tepat dari sudut kiri bawah kotak sebelumnya.

Setelah semua kotak yang ada digambar, ban berjalan ditarik dengan mengganti ruang antar kotak pada masing-masing width + 2garis terakhir dengan garis bawah.

Hasil akhir untuk kotak hadir dengan (l, w, h)dari [(4, 1, 2), (8, 1, 3), (1, 1, 1)]akan menjadi:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

Spesifikasi Format

Anda dapat memilih untuk mengambil daftar 3-tupel di mana salah satu elemen konsisten di seluruh daftar (yang akan menjadi lebar), atau Anda dapat mengambil lebar sekarang dan kemudian daftar 2-tupel mewakili panjang dan ketinggian setiap hadiah. Anda dapat mengambil input dalam urutan apa pun dan dalam format apa pun yang masuk akal, tetapi hadiah harus ditampilkan dalam urutan yang sama dengan yang diberikan sebagai input.

Anda dapat memilih format output yang wajar untuk seni ASCII (termasuk kembali dari fungsi).

Uji Kasus

Kasing uji ini diberikan sebagai [(l, w, h), ...]format.

[(4, 1, 2), (8, 1, 3), (1, 1, 1)]:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

[(5, 3, 4), (8, 3, 1), (1, 3, 7)]:

                               +-+
                              / /|
                             / / |
    +-----+                 / /  |
   /     /|                +-+   |
  /     / |                | |   |
 /     /  |     +--------+ | |   |
+-----+   |    /        /| | |   |
|     |   +___/        / +_| |   +
|     |  /___/        / /__| |  /
|     | /___+--------+ /___| | /
|     |/____|        |/____| |/
+-----+_____+--------+_____+-+

[(0, 0, 0)] (this is the most interesting test case ever :P)

 ++
+++
++

[(8, 3, 0), (0, 3, 8)] (more zero cases)

                   ++
                  //|
                 // |
                //  |
               ++   |
               ||   |
               ||   |
               ||   |
    +--------+ ||   |
   /        /+_||   +
  /        //__||  /
 /        //___|| /
+--------+/____||/
+--------+_____++

Aturan

  • Celah Standar Berlaku
  • Ini adalah , jadi jawaban tersingkat dalam byte menang
  • Tidak ada jawaban yang akan diterima

Catatan: Saya mendapat inspirasi untuk seri tantangan ini dari Advent Of Code . Saya tidak memiliki afiliasi dengan situs ini

Anda dapat melihat daftar semua tantangan dalam seri dengan melihat bagian 'Tertaut' dari tantangan pertama di sini .

HyperNeutrino
sumber
@AdmBorkBork semua kotak yang ada memiliki lebar yang sama
Erik the Outgolfer
1
Jika Charcoal tidak merusak ini, saya tidak tahu apa yang akan terjadi.
manusia
@ sebenarnya manusia, brainf ** k akan memenangkan tantangan ini: P
HyperNeutrino
Bisakah Anda membuat posting tentang meta untuk mengindeks semua pertanyaan ini?
RamenChef
@RamenChef Hm ide bagus. Saya mungkin melakukan itu: P
HyperNeutrino

Jawaban:

4

Arang , 96 81 byte

NθWS«→FυG↗→↙⁺²θ_≔I⪪ι υ≔⊟υπ≔§υ⁰ρ→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ ↑πP↗⊕θP←⊕ρ↓+↓πF²«↷⁴+ρ↷²+π↷¹+θ↶³

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Input adalah lebar pada baris pertama, kemudian dimensi lain pada baris berikut, diakhiri dengan baris kosong. Penjelasan:

Nθ

Masukkan lebar.

WS«

Lingkarkan ke garis yang tersisa sampai garis kosong tercapai.

→FυG↗→↙⁺²θ_

Tarik sabuk di antara hadiah. The uvariabel adalah standar untuk daftar kosong, yang karenanya tidak apa-apa pada lulus pertama, sementara nanti itu berakhir dengan satu elemen, menyebabkan kode ini untuk menjalankan sekali. (Menggunakan ifakan kurang golf.)

≔I⪪ι υ

Membagi dimensi di ruang, melemparkannya ke bilangan bulat, dan menyimpannya u.

≔⊟υπ

Hapus dimensi terakhir dan simpan di p.

≔§υ⁰ρ

Salin dimensi pertama r, tetapi biarkan uhingga sabuk ditarik pada loop berikutnya.

→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ 

Hapus bagian dalam hadiah, jika ikat pinggang tumpang tindih.

↑πP↗⊕θP←⊕ρ↓+↓π

Gambarlah garis interior masa kini.

F²«↷⁴+ρ↷²+π↷¹+θ↶³

Gambarlah setengah di sekitar bagian luar hadiah, lalu ulangi untuk setengah lainnya.

Neil
sumber
1

Pip , 160 154 byte

153 byte kode, +1 untuk -lbendera.

{YMX:_+B+3MUaRV$.({UwhlWg+^11{a<=h+w?J[sXa-haN[0hh+w]?'-XlWR'+sXlWR("/|"a<h)RV(("+|/"aCMw).sXw)@<MN[ah+w-awh]'_Xw-a+1|s]sXl+w+3}M,y}MUa)R`_ +`'_X#_<|:'_}

Ini adalah fungsi yang mengambil daftar daftar yang berisi [width height length]. Cobalah online!

Bagaimana?

Penjelasan tingkat atas:

  • Tetapkan fungsi yang mengembalikan daftar garis yang mewakili satu kotak
  • Petakan fungsi untuk setiap daftar dimensi yang diberikan
  • Gabungkan daftar baris yang dihasilkan item-bijaksana
  • Lakukan sedikit pemrosesan pasca dengan penggantian regex untuk mendapatkan garis bawah untuk berperilaku dengan benar

Tinggalkan komentar dan saya akan menambahkan penjelasan yang lebih rinci.

DLosc
sumber
0

Python 2 , 508 byte

def f(B):
 d=B[0][1]+2;H=max(B)[0]+d+1;W=sum(sum(b[1:])+3for b in B)+len(B);r=[[' ']*i+W*['_']for i in range(d)]+[W*[' ']for _ in' '*H];o=0
 for h,w,l in B:
	for i in range(w+2,1,-1):r[i-1][o+i-2:o+l+i]=[' ']*(l+2)+['/'];r[h+i][o+i-1]=r[h+i][o+l+i]='/'
	r[0][o:o+l+2]=r[h+1][o:o+l+2]=r[w+h+2][o+w+1:o+w+l+3]=['+']+['-']*l+['+']
	for i in range(1,h+1):m=min(i,w)-1;r[i][o:o+l+2+m]=['|']+[' ']*l+['|']+[' ']*m;r[i+w+1][o+l+w+2]='|'
	r[w+1][o+l+w+2]='+';o+=l+w+4
 for l in r[H-1::-1]:print''.join(l).rstrip('_')

Cobalah online!

Mengambil daftar daftar [height, width, length]

TFeld
sumber