Advent Challenge 4: Present Assembly Line!

12

<< Zurück Weiter >>

Der Weihnachtsmann konnte alle Geschenke, die die Elfen über Nacht gestohlen hatten, wiederaufbereiten! Jetzt muss er sie zum Verpacken ans Fließband schicken. Er hat in der Regel eine Kamera zur Überwachung der Montage beide Linie um sicherzustellen, dass die Elfen einen guten Job machen und weil Bilder Fließband schön aussehen auf Werbeplakate [citation benötigte]

Leider ist seine Kamera kaputt gegangen, und er möchte, dass Sie eine Simulation des Fließbands erstellen!

Alle vorhandenen Kartons haben die gleiche Breite, damit sie perfekt auf das Förderband passen, damit das Fließband mit maximaler Effizienz weiterarbeitet und das Risiko von Fehlern oder Ausfällen verringert wird.

Herausforderung

Geben Sie eine Liste der Geschenke aus, die durch ihre Abmessungen dargestellt werden, und geben Sie ein Förderband mit allen Geschenken aus.

Ein Geschenk ist wie folgt gezeichnet:

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

Dieses Geschenk hat die Breite 1, die Höhe 2 und die Länge 4. Beachten Sie, dass die Pluszeichen nicht für die Seitenlänge zählen, sodass ein Geschenk mit der Länge 4 tatsächlich 6 Positionen umfasst.

Alle Geschenke werden nebeneinander mit einem Leerzeichen zwischen den nächsten beiden Zeichen gezeichnet. Das heißt, die linken unteren Ecken der Geschenke sind so voneinander beabstandet, dass, wenn ein Geschenkkarton Länge lund Breite hat w, die linke untere Ecke des nächsten Geschenkkartons genau l + w + 4rechts von der linken unteren Ecke des vorherigen Kartons liegt.

Nachdem alle vorhandenen Kartons gezeichnet wurden, wird das Förderband gezeichnet, indem der Abstand zwischen den Kartons in jeder der letzten width + 2Zeilen durch Unterstriche ersetzt wird.

Die endgültige Ausgabe für Geschenkboxen mit (l, w, h)von [(4, 1, 2), (8, 1, 3), (1, 1, 1)]wäre:

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

Formatierungsspezifikationen

Sie können entweder eine Liste mit 3 Tupeln erstellen, wobei eines der Elemente über die gesamte Liste hinweg konsistent ist (das wäre die Breite), oder Sie nehmen die aktuelle Breite und dann eine Liste mit 2 Tupeln, die die Länge und repräsentieren Höhe jedes Geschenks. Sie können die Eingaben in beliebiger Reihenfolge und in einem angemessenen Format vornehmen. Die Geschenke müssen jedoch in der Reihenfolge angezeigt werden, in der sie als Eingabe angegeben wurden.

Sie können jedes vernünftige Ausgabeformat für die ASCII-Grafik auswählen (einschließlich der Rückkehr von einer Funktion).

Testfälle

Diese Testfälle werden als [(l, w, h), ...]Format angegeben.

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

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

Regeln

  • Es gelten Standardlücken
  • Das ist , also gewinnt die kürzeste Antwort in Bytes
  • Es wird keine Antwort akzeptiert

Hinweis: Ich habe mich für diese Herausforderungsserie von Advent Of Code inspirieren lassen . Ich habe keine Zugehörigkeit zu dieser Site

Eine Liste aller Herausforderungen in der Serie finden Sie im Abschnitt "Verknüpft" der ersten Herausforderung hier .

HyperNeutrino
quelle
@AdmBorkBork alle anwesenden Kästen haben die gleiche Breite
Erik der Outgolfer
1
Wenn Kohle nicht Wrack dieses, ich weiß nicht , was wird.
Totalhuman
@totallyhuman tatsächlich wird brainf ** k diese Herausforderung gewinnen: P
HyperNeutrino
Können Sie einen Beitrag auf Meta machen, um all diese Fragen zu indizieren?
RamenChef
@ RamenChef Hm gute Idee. Ich könnte das machen: P
HyperNeutrino

Antworten:

4

Kohle , 96 81 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Eingabe ist die Breite in der ersten Zeile, dann die anderen Dimensionen in den folgenden Zeilen, die mit einer Leerzeile enden. Erläuterung:

Nθ

Geben Sie die Breite ein.

WS«

Die verbleibenden Zeilen durchlaufen, bis die leere Zeile erreicht ist.

→FυG↗→↙⁺²θ_

Ziehe den Gürtel zwischen den Geschenken. Die uVariable ist für eine leere Liste vordefiniert, die daher beim ersten Durchlauf nichts unternimmt, während sie später ein einzelnes Element enthält, wodurch dieser Code einmal ausgeführt wird. (Mit einem ifwäre weniger Golf.)

≔I⪪ι υ

Teilen Sie die Dimensionen im Raum auf, wandeln Sie sie in eine Ganzzahl um und speichern Sie sie in u.

≔⊟υπ

Entfernen Sie die letzte Abmessung und speichern Sie sie in p.

≔§υ⁰ρ

Kopieren Sie die erste Bemaßung nach r, lassen Sie sie jedoch uso, dass der Gürtel in der nächsten Schleife gezogen wird.

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

Löschen Sie das Innere der Gegenwart, falls der Gürtel es überlappt.

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

Zeichnen Sie die inneren Linien der Gegenwart.

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

Zeichnen Sie halb um das Äußere der Gegenwart herum und wiederholen Sie dies für die andere Hälfte.

Neil
quelle
1

Pip , 160 bis 154 Bytes

153 Byte Code, +1 für -lFlag.

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

Dies ist eine Funktion, die eine Liste von Listen enthält [width height length]. Probieren Sie es online!

Wie?

Erklärung auf oberster Ebene:

  • Definieren Sie eine Funktion, die eine Liste von Zeilen zurückgibt, die ein Feld darstellen
  • Ordnen Sie die Funktion jeder angegebenen Liste von Dimensionen zu
  • Verketten Sie die resultierenden Zeilenlisten nach Elementen
  • Führen Sie eine kleine Nachbearbeitung mit Regex-Ersetzungen durch, damit sich die Unterstriche ordnungsgemäß verhalten

Hinterlasse einen Kommentar und ich werde eine detailliertere Erklärung hinzufügen.

DLosc
quelle
0

Python 2 , 508 Bytes

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

Probieren Sie es online!

Nimmt eine Liste von Listen von [height, width, length]

TFeld
quelle