La maison du Père Noël

16

La maison du Père Noël

Remarque: Il s'agit du premier défi que j'ai tenté de définir. Il est passé par le Sandbox mais si vous trouvez quelque chose qui ne va pas, veuillez ne pas simplement downvote mais laissez un commentaire afin que je puisse l'améliorer.

Contexte

Il y a un vieux puzzle pour enfants où le défi est de dessiner une boîte avec un toit et une croix au milieu sans soulever votre stylo du papier ou passer deux fois n'importe quelle ligne.

En Allemagne, il est connu comme "das Haus des Nikolaus" ou "La Maison du Père Noël". Honnêtement, je ne me souviens plus de ce que nous appelions autrefois. Pour tous ceux qui ne connaissent pas le puzzle, tous les détails sont disponibles ici .

Voici une représentation artistique ASCII de la maison.

 /\
/__\
|\/|
|/\|
----

Défi

Écrivez un programme ou une fonction pour dessiner la maison du Père Noël dans la langue de votre choix.

Cela semble trop facile? Eh bien, voici le hic. Il doit également sortir chaque étape du dessin et respecter les règles du puzzle. Votre programme n'est pas tenu de prendre aucune entrée. La maison finie doit ressembler exactement à celle ci-dessus.

Selon le site ci-dessus, il existe 44 solutions possibles. Vous pouvez utiliser n'importe lequel d'entre eux. Ceci est un défi artistique ASCII, vous n'êtes donc pas obligé de calculer la solution mais seulement de la dessiner.

Production

Un exemple de la sortie requise de l'une des 44 solutions est illustré ci-dessous:

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

 /\
/__\
|\
| \
----

 /\
/__\
|\/
|/\
----

 /\
/__\
|\/|
|/\|
----

Règles

  • J'ai ajouté 1 nouvelle ligne supplémentaire entre chaque sortie attendue pour essayer de rendre les exigences plus claires. C'est facultatif. N'importe quel nombre de lignes vides entre chaque sortie est autorisé.
  • Votre sortie ne doit comprendre que les caractères /, \, -, _ et l'espace comme indiqué ci-dessus. Les espaces de fin sont autorisés.
  • Chaque ligne de votre dessin doit continuer à partir de la fin de la ligne précédente et vous ne pouvez répéter aucune ligne.
  • Failles standard interdites.
  • Vous n'êtes pas obligé de sortir la rime mentionnée dans le lien ci-dessus.
  • Il s'agit du code golf, donc la réponse la plus courte en octets sera le gagnant.

Résultat

Quelques bonnes réponses et merci et respect à tous ceux qui ont posté. J'ai dit le nombre d'octets le plus bas, mais j'ai marqué comme première réponse non seulement pour cela, mais aussi pour la grande explication du code. Bravo @Dennis.

ElPedro
la source
Cela aurait pu passer du temps dans le bac à sable . Essayez d'ajouter un paramètre pour la taille de la maison - ou le nombre de maisons concaténées (ou les deux). Je trouve ça trop facile comme ça. Vous pouvez également ajouter la rime à votre exemple de sortie - ou ne pas le mentionner du tout. Je trouve ce gif sympa, ou celui-ci .
Titus
4
@Titus Merci pour la rétroaction. Mon intention n'était pas de créer un défi particulièrement difficile mais d'en créer un qui soit assez facilement réalisable et donc d'encourager le plus de personnes possible à proposer des solutions. Je prendrai en compte vos suggestions pour ma prochaine tentative.
ElPedro
1
Ma faute; Je m'attendais à des choses trop complexes pour l'art ascii. :) Mais j'aime toujours les gifs.
Titus
Les gifs sont sympas et j'aime aussi l'idée d'inclure la rime aussi dans un choix de langue :)
ElPedro

Réponses:

10

Gelée , 40 39 36 octets

“ḥ%DtƊVḍI’ḃ9W;“|_/-\/\|‘Ė¤y@\FỌ»⁶s4Y

Essayez-le en ligne!

Comment ça fonctionne

“ḥ%DtƊVḍI’

est un bijectif base-250 littéral; chaque caractère correspond à son point de code dans la page de codes de Jelly . Le résultat est l'entier 13192938935880491074 .

          ḃ9

convertit l'entier généré en base bijective 9, donnant le tableau d'entiers
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Les entiers correspondent à l'ordre du trait, à l'exception de 9 , qui indique un espace.

            W

enveloppe le tableau généré dans un tableau singleton, qui sera nécessaire pour l'ajouter au tableau que nous allons générer maintenant.

              “|_/-\/\|‘Ė¤

fonctionne comme suit. ¤combine les deux maillons à gauche en une chaîne niladique. Le premier “|_/-\/\|‘donne les points de code des caractères spécifiés, ce qui donne [124, 95, 47, 45, 92, 47, 92, 124] . Ensuite, Ėénumère les points de code, donnant
[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] , [8, 124]] . La paire [n, c] signifie que le n ème trait sera le caractère ASCII avec le point de code c .

             ;

concatène les tableaux générés. Le résultat est le tableau
[[9,6,7,9,6,2,2,7,1,5,3,8,1,3,5,8,4,4,4,4], [1,124 ], [2,95], [3,47], [4,45], [5,92], [6,47], [7,92], [8,124]] .

                          y@\

effectue une réduction cumulative (c'est-à-dire montrant toutes les étapes intermédiaires) en utilisant la translittération ( y) avec des arguments échangés ( @). Dans la première étape, par exemple, nous remplaçons chaque 1 du tableau d'origine par 124 , qui est le point de code du caractère | .

                             FỌ

aplatit le résultat et remplace tous les points de code par les caractères ASCII correspondants. Dans toutes les étapes, cela générera des caractères non imprimables avec les points de code 1 à 9 .

                               »⁶

prend le maximum par caractère avec le caractère espace, en remplaçant tous les caractères non imprimables par des espaces.

                                 s4Y

divise la chaîne générée en morceaux de longueur quatre et les joint avec un saut de ligne comme séparateur.

Dennis
la source
2
Sensationnel. Tout simplement génial. +1
ElPedro
Mais attendez, ce sont des octets?
Leif Willerts
1
@LeifWillerts Oui. Pour éviter les caractères non imprimables, Jelly utilise une page de codes personnalisée qui code les 256 caractères qu'il comprend comme un seul octet chacun. Le lien octets dans l'en-tête pointe vers lui.
Dennis
Désolé alors de ne pas avoir pensé à cliquer sur ce lien: D
Leif Willerts
Il gagne autant pour l'explication que n'importe quoi. Le respect.
ElPedro
13

Javascript (ES6), 119 116 96 92 91 octets

for(i=8;i--;)console.log(`834
3554
2610
2160
7777`.replace(/./g,c=>'|/|/\\_\\- '[c<i?8:c]))

Arnauld
la source
Bonne réponse. J'avais le sentiment que Javascript serait là ou à peu près :-)
ElPedro
Désolé pour les multiples modifications. Je ne devrais pas poster avant le 2ème café.
Arnauld
Les modifications multiples sont bonnes. Ravi de voir le nombre d'octets baisser.
ElPedro
Est-il utile d'avoir deux copies identiques du code dans votre réponse?
Neil
@Neil - Je n'en garderai qu'un jusqu'à ce que je trouve une bonne raison d'en avoir deux. ^^
Arnauld
9

Lot, 356 344 341 337 octets

@set s=@set "
%s%g=@goto 1
%s%r=
%s%c=
%s%u=|
%s%l=|
%s%f=
@for /l %%i in (1,1,7)do @call:%%i
%s%u=|\/|
%s%l=|/\|
%g%
:7
%s%u=|\/
%s%l=|/\
%g%
:6
%s%f=----
%g%
:5
%s%u=|\
%s%l=| \
%g%
:4
%s%c=/__\
%g%
:3
%s%r= /\
%s%c=/  \
%g%
:2
%s%r= /
%s%c=/
:1
@for %%l in ("%r%" "%c%" "%u%" "%l%" "%f%")do @echo(%%~l

Lot stupide |Règles de citation ... si vous voulez un |dans une variable, vous devez le citer avec trois ^s, il est donc moins cher d'utiliser à la @place et de le remplacer en sortie, bien que pour y parvenir, je dois commencer par le mur de gauche. La première ligne a un espace de fin. echo(est utilisé parce que la r, cet les fvariables pourraient être vides et nous ne voulons pasECHO is off. imprimés.

Edit: enregistré 12 octets en utilisant fallthrough pour la dernière partie. Enregistré 3 octets en utilisant une forboucle pour imprimer chaque partie, cela signifie que j'utilise maintenant |s dans mes variables, ce qui rend le code légèrement plus facile à lire. 4 octets enregistrés en utilisant des @caractères explicites au lieu de @echo off. Je pense que commencer par le mur de gauche nécessite toujours le moins d'octets.

Neil
la source
2
Ce n'est peut-être pas le plus court, mais je reçois un vote positif de ma part pour avoir réussi à le faire dans le lot +1
ElPedro
echo:est plus standard, mais il echo(semble que vous abusez d'une fonctionnalité linguistique, alors +1.
wizzwizz4
@ wizzwizz4 echo:échoue dans certains cas de bord obscurs, mais je ne connais aucun cas d'échec pour echo(.
Neil
@ wizzwizz4 Si vous avez un fichier foo.batdans le répertoire courant, echo(\..\foo.batéchos \..\foo.batmais echo:\..\foo.bats'exécute foo.bat.
Neil
@Neil Savez-vous pourquoi c'est? Il semble queecho:.\foo.bat cela aurait plutôt cet effet. Est-ce à cause d'un problème de pile de répertoires, où le "UP" du répertoire racine est le répertoire actuel?
wizzwizz4
7

C, 118 octets

main(){char *p,n;for(n='B';n++<'J';)for(p="ZFEAFDDEAGCHIAGHCIABBBBAA";*p;p++)putchar(" \n-\\_\\/|/|"[(*p<n)**p&15]);}
Martin Rosenau
la source
Impressionnant! Belle première réponse, et bienvenue sur le site!
DJMcMayhem
1
Pour enregistrer 3 octets: char*p(pas d'espace) et modifiez 'B'et 'J'leurs codes ASCII.
Level River St
Merci d'avoir répondu. Je ne m'attendais pas à ce que C soit même en compétition. C'est vraiment impressionnant et vaut bien un +1
ElPedro
6

/// , 112 octets

/!/\/\///*/----
 !@/\\\\!$/ @@!^/
*@\/@@
@\/__@@
/*@
 $
*__
$
 $
*$
 __@
$
 $^$
 $^|@
|$^|@\/
|\/@^|@\/|
|\/@|
*

Essayez-le en ligne!

Erik le Outgolfer
la source
Je ne comprends pas un seul octet du 112 mais je l'ai essayé en ligne et il fait exactement ce qu'il dit sur l'étain donc +1
ElPedro
1
@ElPedro Essayez de cliquer sur le lien dans l'en-tête, vous comprendrez peut-être le concept, mais sinon, revenez à moi. Je veux que de plus en plus de gens puissent comprendre une langue et, si vous ne le faites pas, c'est un triste fait. Je sais que je ne peux pas simplement faire comprendre à tout le monde /// (certaines personnes veulent juste de la nourriture et de l'eau, /// et PPCG sont loin de cela, bien que ce ne soit pas impossible).
Erik the Outgolfer
Merci. Il y a tellement de langues à apprendre! Je vais certainement y jeter un œil. Je joue toujours au golf en Python et en Lotus Formula, mais j'y vais plus. Plus de langues est plus amusant. Merci encore pour votre contribution :)
ElPedro
2

PHP, 98 95 octets

inspiré par la solution d'Arnauld

for($i=8;$i--;)for($p=24;$p--;)echo"|/|/\\_\\- 
"[($c="977779061290162945539438"[$p])<$i?8:$c];

Remarque: La première ligne de code a un espace de fin.

Titus
la source
Joli @Titus. Les espaces de fin sont autorisés.
ElPedro
@ElPedro: Je connais juste des gens qui y ont configuré des éditeurs pour les couper automatiquement; c'est pourquoi je l'ai mentionné.
Titus
1

PHP avec GD, 348 338 octets (pas en concurrence)

pas exactement ce qui était demandé, mais ...

function f($v,$w){global$x,$y,$i;imageline($i,$x,$y,$x=$v,$y=$w,1);ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';}$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

enregistrer dans un fichier, appeler dans un navigateur

panne

function f($v,$w)
{
    global$x,$y,$i;
    imageline($i,$x,$y,$x=$v,$y=$w,1);      // draw line, set end coords as new start coords
    ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();           // get image output
    echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';    // print <img> tag
}
// calculate dimensions, create image, allocate background color (foreground implicitly black)
$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);
// paint lines: implicit `$x=0`
f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

Pour dessiner une maison plus grande, changez $w=9à la largeur désirée.

Titus
la source
Et je donne à celui-ci un +1 également. Même s'il ne répond pas au défi direct, il couvre les améliorations que vous avez suggérées et a l'air très cool :)
ElPedro