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.
Réponses:
Gelée ,
403936 octetsEssayez-le en ligne!
Comment ça fonctionne
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 .
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.
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]] .
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 | .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.
divise la chaîne générée en morceaux de longueur quatre et les joint avec un saut de ligne comme séparateur.
la source
Javascript (ES6),
119116969291 octetsla source
Lot,
356344341337 octetsLot 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 lar
,c
et lesf
variables 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
for
boucle 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.la source
echo:
est plus standard, mais ilecho(
semble que vous abusez d'une fonctionnalité linguistique, alors +1.echo:
échoue dans certains cas de bord obscurs, mais je ne connais aucun cas d'échec pourecho(
.foo.bat
dans le répertoire courant,echo(\..\foo.bat
échos\..\foo.bat
maisecho:\..\foo.bat
s'exécutefoo.bat
.echo:.\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?C, 118 octets
la source
char*p
(pas d'espace) et modifiez'B'
et'J'
leurs codes ASCII./// , 112 octets
Essayez-le en ligne!
la source
PHP,
9895 octetsinspiré par la solution d'Arnauld
Remarque: La première ligne de code a un espace de fin.
la source
PHP avec GD,
348338 octets (pas en concurrence)pas exactement ce qui était demandé, mais ...
enregistrer dans un fichier, appeler dans un navigateur
panne
Pour dessiner une maison plus grande, changez
$w=9
à la largeur désirée.la source