Advent Challenge 4: Mevcut Montaj Hattı!


12

<< Önceki Sonraki >>

Santa, elflerin bir gecede çaldığı tüm hediyeleri yeniden üretmeyi başardı! Şimdi onları paketleme için montaj hattına göndermek zorunda. Genellikle elflerin iyi bir iş yaptığından emin olmak için montaj hattını denetleyecek bir kameraya sahiptir ve çünkü montaj hattı resimleri reklam afişlerinde güzel görünür [alıntı gerekli]

Ne yazık ki, kamerası bozuldu, bu yüzden montaj hattının nasıl görüneceğine dair bir simülasyon çizmenizi istiyor!

Montaj hattının maksimum verimlilikte çalışmasını sağlamak ve hata veya arıza riskini azaltmak için, mevcut tüm kutular aynı genişliğe sahiptir, böylece konveyör bandına mükemmel şekilde otururlar.

Meydan okuma

Boyutlarıyla temsil edilen hediyeler listesi verildiğinde, tüm hediyelerle birlikte bir konveyör bandı üretin.

Bir hediye şöyle çizilir:

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

Bu hediye genişlik 1, yükseklik 2 ve uzunluk 4'e sahiptir. Artı işaretlerinin yan uzunluk için sayılmadığına dikkat edin, bu nedenle 4 uzunluğundaki bir hediye aslında 6 pozisyona yayılır.

Tüm hediyeler, en yakın iki karakter arasında bir boşluk olacak şekilde yan yana çizilir; yani, hediyelerin sol alt köşeleri, mevcut bir kutunun uzunluğu lve genişliği varsa w, bir sonraki mevcut kutunun sol l + w + 4alt köşesi, bir önceki kutunun sol alt köşesinin tam olarak sağında olacak şekilde aralıklıdır .

Mevcut tüm kutular çizildikten sonra, konveyör bandı, son width + 2hatların her biri üzerindeki kutular arasındaki boşluğun alt çizgilerle değiştirilmesiyle çizilir .

Mevcut kutuları için son çıkış (l, w, h)arasında [(4, 1, 2), (8, 1, 3), (1, 1, 1)]olacaktır:

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

Biçimlendirme Spesifikasyonları

Öğelerden birinin tüm liste boyunca tutarlı olduğu 3 genişliğin bir listesini almayı seçebilirsiniz (bu, genişlik olacaktır) veya mevcut genişliği ve ardından uzunluğu ve her bir yüksekliğin yüksekliği. Girişleri herhangi bir sırada ve makul bir formatta alabilirsiniz, ancak hediyeler giriş olarak verildiği sırada gösterilmelidir.

ASCII-art için herhangi bir makul çıktı formatı seçebilirsiniz (bir işlevden döndürme dahil).

Test Durumları

Bu test senaryoları [(l, w, h), ...]format olarak verilmiştir .

[(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)

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

kurallar

  • Standart Loopholes Uygula
  • Bu , bu yüzden bayttaki en kısa cevap kazanıyor
  • Hiçbir cevap kabul edilmeyecek

Not: Advent Of Code'dan bu meydan okuma serisi için ilham aldım . Bu siteyle hiçbir bağlantım yok

Buradaki ilk zorluğun 'Bağlantılı' bölümüne bakarak dizideki tüm zorlukların bir listesini görebilirsiniz .


@AdmBorkBork mevcut tüm kutular aynı genişliğe sahip
Erik the Outgolfer

1
Charcoal bunu mahvedemezse , ne olacağını bilmiyorum.
totallyhuman

@totallyhuman aslında, brainf ** k bu mücadeleyi kazanır: P
HyperNeutrino

Tüm bu soruları dizine eklemek için meta'da bir yayın yapabilir misiniz?
RamenChef

@RamenChef Hm iyi fikir. Bunu yapabilirim: P
HyperNeutrino

Yanıtlar:


4

Kömür , 96 81 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Girdi, ilk satırdaki genişlik, ardından sonraki satırlardaki boş bir çizgi ile biten diğer boyutlardır. Açıklama:

Nθ

Genişliği girin.

WS«

Boş satıra ulaşılana kadar kalan çizgilerin üzerinden geçin.

→FυG↗→↙⁺²θ_

Kemeri hediyeler arasında çizin. uBir kez çalıştırmak için bu kodu neden tek eleman ile biter sonradan ise değişken, bu nedenle ilk geçişte şey yapmaz boş bir listeye, önceden tanımlanmıştır. ( ifBirini kullanmak daha az golf olur.)

≔I⪪ι υ

Boyutları boşlukta bölün, tamsayıya dönüştürün ve kaydedin u.

≔⊟υπ

Son boyutu kaldırın ve kaydedin p.

≔§υ⁰ρ

İlk boyutu olarak kopyalayın r, ancak ukemerin bir sonraki döngüde çizilmesi için bırakın .

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

Kemerin üst üste gelmesi durumunda, hediyenin iç kısmını silin.

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

Şimdinin iç çizgilerini çizin.

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

Şimdinin dışının yarısını çizin, sonra diğer yarısı için tekrarlayın.


1

Pip , 160 154 bayt

153 bayt kod, -lbayrak için +1 .

{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#_<|:'_}

Bu, içeren listelerin listesini alan bir işlevdir [width height length]. Çevrimiçi deneyin!

Nasıl?

Üst düzey açıklama:

  • Bir kutuyu temsil eden satırların listesini döndüren bir işlev tanımlama
  • İşlevi verilen her boyut listesiyle eşleştirin
  • Ortaya çıkan satır listelerini öğe bazında birleştirin
  • Alt çizgilerin düzgün davranmasını sağlamak için normal ifade değiştirmeleriyle küçük bir son işlem yapın

Bir yorum bırakın, daha ayrıntılı bir açıklama ekleyeceğim.


0

Python 2 , 508 bayt

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('_')

Çevrimiçi deneyin!

Listelerini alır [height, width, length]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.