Advent Challenge 4: Présentez la chaîne de montage!

12

<< Précédent Suivant >>

Le Père Noël a pu reconditionner tous les cadeaux que les elfes ont volés pendant la nuit! Il doit maintenant les envoyer à la chaîne de montage pour l'emballage. Il a généralement une caméra pour superviser la chaîne de montage à la fois pour s'assurer que les elfes font du bon travail et parce que les photos de la chaîne de montage sont belles sur les affiches publicitaires [citation nécessaire]

Malheureusement, son appareil photo s'est cassé, alors il aimerait que vous dessiniez une simulation de ce à quoi ressemblerait la chaîne de montage!

Afin de maintenir le fonctionnement de la chaîne de montage avec une efficacité maximale et de réduire les risques d'erreur ou de défaillance, toutes les boîtes présentes ont la même largeur afin de s'adapter parfaitement à la bande transporteuse.

Défi

Étant donné une liste de cadeaux représentés par leurs dimensions, sortez un tapis roulant avec tous les cadeaux.

Un cadeau est dessiné comme tel:

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

Ce cadeau a une largeur 1, une hauteur 2 et une longueur 4. Notez que les signes plus ne comptent pas pour la longueur du côté, donc un cadeau de longueur 4 s'étend sur 6 positions.

Tous les cadeaux sont dessinés les uns à côté des autres avec un espace entre les deux personnages les plus proches; c'est-à-dire que les coins en bas à gauche des cadeaux sont espacés de sorte que si une boîte présente a une longueur let une largeur w, le coin en bas à gauche de la boîte présente sera exactement à la l + w + 4droite du coin en bas à gauche de la boîte précédente.

Une fois toutes les boîtes présentes dessinées, la bande transporteuse est tirée en remplaçant l'espace entre les boîtes de chacune des dernières width + 2lignes par des traits de soulignement.

Le résultat final pour les cases actuelles avec (l, w, h)de [(4, 1, 2), (8, 1, 3), (1, 1, 1)]serait:

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

Spécifications de formatage

Vous pouvez choisir de prendre une liste de 3-tuples où l'un des éléments est cohérent sur toute la liste (ce serait la largeur), ou vous pouvez prendre la largeur actuelle puis une liste de 2-tuples représentant la longueur et hauteur de chaque cadeau. Vous pouvez prendre les entrées dans n'importe quel ordre et dans n'importe quel format raisonnable, mais les cadeaux doivent être affichés dans le même ordre qu'ils sont donnés en entrée.

Vous pouvez choisir n'importe quel format de sortie raisonnable pour l'art ASCII (y compris le retour d'une fonction).

Cas de test

Ces cas de test sont donnés sous [(l, w, h), ...]forme de 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)

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

Règles

  • Les échappatoires standard s'appliquent
  • Il s'agit de , donc la réponse la plus courte en octets l'emporte
  • Aucune réponse ne sera acceptée

Remarque: je me suis inspiré de cette série de défis d' Advent Of Code . Je n'ai aucune affiliation avec ce site

Vous pouvez voir une liste de tous les défis de la série en consultant la section 'Linked' du premier défi ici .

HyperNeutrino
la source
@AdmBorkBork toutes les boîtes présentes ont la même largeur
Erik the Outgolfer
1
Si charbon n'épave , je ne sais pas ce qui va.
2017 totalement humain
@totallyhuman en fait, brainf ** k remportera ce défi: P
HyperNeutrino
Pouvez-vous faire un post sur meta pour indexer toutes ces questions?
RamenChef
@RamenChef Hm bonne idée. Je pourrais faire ça: P
HyperNeutrino

Réponses:

4

Fusain , 96 81 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. L'entrée est la largeur sur la première ligne, puis les autres dimensions sur les lignes suivantes, se terminant par une ligne vierge. Explication:

Nθ

Saisissez la largeur.

WS«

Faites une boucle sur les lignes restantes jusqu'à ce que la ligne vierge soit atteinte.

→FυG↗→↙⁺²θ_

Tirez la ceinture entre les cadeaux. La uvariable est prédéfinie sur une liste vide, qui ne fait donc rien lors de la première passe, tandis que plus tard elle se retrouve avec un seul élément, ce qui provoque l'exécution de ce code une seule fois. (Utiliser un ifserait moins golfique.)

≔I⪪ι υ

Divisez les dimensions de l'espace, convertissez-les en nombre entier et enregistrez-les u.

≔⊟υπ

Supprimez la dernière dimension et enregistrez-la p.

≔§υ⁰ρ

Copiez la première dimension dans r, mais laissez-la uafin que la ceinture soit tirée sur la boucle suivante.

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

Effacez l'intérieur du présent, au cas où la ceinture le chevaucherait.

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

Dessinez les lignes intérieures du présent.

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

Dessinez à mi-chemin autour de l'extérieur du présent, puis répétez pour l'autre moitié.

Neil
la source
1

Pip , 160 154 octets

153 octets de code, +1 pour l' -lindicateur.

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

Il s'agit d'une fonction qui prend une liste de listes contenant [width height length]. Essayez-le en ligne!

Comment?

Explication de haut niveau:

  • Définissez une fonction qui renvoie une liste de lignes représentant une case
  • Mappez la fonction à chaque liste de dimensions donnée
  • Concaténer les listes de lignes résultantes par élément
  • Faites un peu de post-traitement avec des remplacements d'expressions régulières pour que les traits de soulignement se comportent correctement

Laissez un commentaire et j'ajouterai une explication plus détaillée.

DLosc
la source
0

Python 2 , 508 octets

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

Essayez-le en ligne!

Prend une liste de listes de [height, width, length]

TFeld
la source