Advent Challenge 4: Present Assembly Line!


12

<< Precedente Successivo >>

Babbo Natale è stato in grado di ricostruire tutti i regali rubati dagli elfi durante la notte! Ora deve inviarli alla catena di montaggio per l'imballaggio. Di solito ha una telecamera per sorvegliare la catena di montaggio sia per assicurarsi che gli elfi stiano facendo un buon lavoro sia perché le immagini della catena di montaggio sembrano belle sui poster pubblicitari [citazione necessaria]

Sfortunatamente, la sua macchina fotografica si è rotta, quindi vorrebbe che tu disegnassi una simulazione di come sarebbe stata la catena di montaggio!

Al fine di mantenere la catena di montaggio alla massima efficienza e ridurre il rischio di errori o guasti, tutte le scatole presenti hanno la stessa larghezza in modo da adattarsi perfettamente al nastro trasportatore.

Sfida

Dato un elenco di regali rappresentati dalle loro dimensioni, emettere un nastro trasportatore con tutti i regali.

Un regalo viene disegnato in questo modo:

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

Questo regalo ha larghezza 1, altezza 2 e lunghezza 4. Nota che i segni più non contano per la lunghezza laterale, quindi un regalo con lunghezza 4 si estende su 6 posizioni.

Tutti i regali sono disegnati uno accanto all'altro con uno spazio tra i due personaggi più vicini; vale a dire, gli angoli in basso a sinistra dei presenti sono distanziati in modo tale che se una casella presente ha lunghezza le larghezza w, l'angolo in basso a sinistra della casella attuale successiva sarà esattamente in l + w + 4posizione a destra dell'angolo in basso a sinistra della casella precedente.

Dopo che tutte le caselle presenti sono state disegnate, il nastro trasportatore viene disegnato sostituendo lo spazio tra le caselle su ciascuna delle ultime width + 2linee con caratteri di sottolineatura.

L'output finale per le caselle attuali con (l, w, h)of [(4, 1, 2), (8, 1, 3), (1, 1, 1)]sarebbe:

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

Specifiche di formattazione

Puoi scegliere di prendere un elenco di 3 tuple in cui uno degli elementi è coerente in tutto l'elenco (che sarebbe la larghezza), oppure puoi prendere la larghezza attuale e quindi un elenco di 2 tuple che rappresentano la lunghezza e altezza di ogni regalo. Puoi prendere gli input in qualsiasi ordine e in qualsiasi formato ragionevole, ma i regali devono essere visualizzati nello stesso ordine in cui sono dati come input.

Puoi scegliere qualsiasi formato di output ragionevole per l'arte ASCII (incluso il ritorno da una funzione).

Casi test

Questi casi di test sono forniti come [(l, w, h), ...]formato.

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

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

Regole

  • Si applicano scappatoie standard
  • Questo è , quindi vince la risposta più breve in byte
  • Nessuna risposta sarà accettata

Nota: ho tratto ispirazione per questa serie di sfide da Advent Of Code . Non ho alcuna affiliazione con questo sito

Puoi vedere un elenco di tutte le sfide della serie guardando la sezione "Linked" della prima sfida qui .


@AdmBorkBork tutte le caselle presenti hanno la stessa larghezza
Erik the Outgolfer

1
Se il carbone non distrugge questo, non so cosa lo farà.
totalmente umano il

@totallyhuman in realtà, brainf ** k vincerà questa sfida: P
HyperNeutrino il

Puoi pubblicare un post su meta per indicizzare tutte queste domande?
RamenChef il

@RamenChef Hm buona idea. Potrei farlo: P
HyperNeutrino il

Risposte:


4

Carbone di legna , 96 81 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. L'input è la larghezza sulla prima riga, quindi le altre dimensioni sulle righe seguenti, che termina con una riga vuota. Spiegazione:

Nθ

Inserisci la larghezza.

WS«

Passa sopra le linee rimanenti fino a quando non viene raggiunta la linea vuota.

→FυG↗→↙⁺²θ_

Disegna la cintura tra i regali. La uvariabile è predefinita in un elenco vuoto, che pertanto non fa nulla al primo passaggio, mentre in seguito finisce con un singolo elemento, facendo eseguire questo codice una volta. (Usando un ifsarebbe meno golfy.)

≔I⪪ι υ

Dividi le dimensioni nello spazio, gettale in numeri interi e salvale in u.

≔⊟υπ

Rimuovi l'ultima dimensione e salvala in p.

≔§υ⁰ρ

Copia la prima dimensione in r, ma lasciala in umodo che la cintura venga disegnata sul ciclo successivo.

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

Cancella l'interno del presente, nel caso in cui la cintura si sovrapponga.

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

Disegna le linee interne del presente.

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

Disegna a metà intorno all'esterno del presente, quindi ripeti per l'altra metà.


1

Pip , 160 154 byte

153 byte di codice, +1 per la -lbandiera.

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

Questa è una funzione che accetta un elenco di elenchi contenenti [width height length]. Provalo online!

Come?

Spiegazione di alto livello:

  • Definire una funzione che restituisce un elenco di righe che rappresentano una casella
  • Mappa la funzione su ciascun elenco di dimensioni indicate
  • Concatena gli elenchi risultanti di righe in base all'elemento
  • Fai un po 'di post-elaborazione con le sostituzioni regex per far sì che i caratteri di sottolineatura si comportino correttamente

Lascia un commento e aggiungerò una spiegazione più dettagliata.


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

Provalo online!

Prende un elenco di elenchi di [height, width, length]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.