Le défi
Votre programme ou votre fonction acceptera une seule chaîne d'entrée de STDIN ou un paramètre de fonction. Vous pouvez supposer que l'entrée ne contiendra que des caractères alphabétiques (a-zA-Z), des espaces et des points. La saisie est insensible à la casse, vous devez donc traiter "a" exactement de la même façon que vous traiteriez "A".
Pour chaque caractère de la chaîne, vous allez générer une représentation d'un bâtiment conformément à la spécification suivante.
Chaque bâtiment doit avoir un toit, désigné par un trait de soulignement sur la ligne supérieure, puis par une barre oblique, une espace, une barre oblique inverse sur la deuxième ligne.
_
/ \
Vous aurez alors un nombre d'étages, correspondant au numéro de lettre (a = 1, b = 2, c = 3, etc.) qui sont représentés par un mur (|) de chaque côté et un espace au milieu. Le plancher inférieur (et seulement le plancher inférieur) devrait avoir une fondation, qui est un soulignement entre les murs. Comme ça...
|_|
Ainsi, par exemple, 'b' ressemblerait à ceci
_
/ \
| |
|_|
Nous savons maintenant que les bâtiments très hauts et étroits ne peuvent pas subsister et doivent s'élargir à la base, de sorte qu'aucun bâtiment ne peut supporter plus de trois étages sans un soutien supplémentaire. Donc, tous les trois niveaux (pas moins), vous devriez ajouter un "calque élargissant". La couche d’élargissement consiste en une barre oblique et une barre oblique inverse directement au-dessus des murs de la section située en dessous, la section ci-dessous devant être plus large de deux espaces que la section ci-dessus. La couche supplémentaire ne compte pas pour la hauteur du bâtiment.
Les bâtiments ne doivent pas se chevaucher mais ne doivent pas comporter d'espaces inutiles, et le sol étant toujours plat, tous les bâtiments doivent avoir leur base au même niveau.
Par exemple, "abcdefga" ressemblera à ceci.
_
/ \
_ | |
_ / \ | |
_ / \ | | | |
/ \ | | | | / \
_ | | | | | | | |
_ / \ | | | | / \ | |
_ / \| | | | / \| | | | _
/ \| || |/ \| || |/ \/ \
|_||_||_||___||___||___||_____||_|
Les espaces dans l'entrée de chaîne doivent être représentés par un double espace.
Les arrêts complets dans l'entrée de chaîne doivent être représentés par des gravats comme celui-ci.
/\/\
Autres exemples
Entrée = Hello world.
Sortie =
_
/ \
| |
| |
| |
/ \
| |
| | _
| | / \
/ \ | |
| | | |
_ | | _ | |
/ \ | | / \ / \
| | / \ | | | |
| | | | | | | |
_ _ | | | | | | | | _
/ \ / \ / \ | | / \ / \ / \
| | | | | | / \ | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
_ / \ / \ / \ | | / \ / \ / \
/ \ | | | | | | / \ | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | _ / \ / \ / \ | | / \ / \ / \
/ \ / \ | | | | | | / \ | | | | | | _
| | | | | | | | | | | | | | | | | | / \
| | | | | | | | | | | | | | | | | | | |
| | | | / \/ \/ \ | | / \/ \/ \ | |
/ \/ \| || || | / \| || || | | |
| || || || || | | || || || |/ \
|_____||___||_______||_______||_________| |_______________||_________||___________||_______||___|/\/\
Entrée = lorem ipsum
_
/ \
_ | |
/ \ | |
_ | | | |
/ \ | | / \
| | _ | | | |
| | / \ / \ | |
_ | | | | | | | |
/ \ / \ | | | | / \
| | | | _ | | | | | | _
| | | | / \ / \ / \ | | / \
_ | | | | | | | | | | | | | |
/ \ / \ / \ | | | | | | / \ | |
| | | | | | | | | | | | | | | |
| | | | | | / \ / \ / \ | | / \
| | | | | | | | _ | | | | | | | |
/ \ / \ / \ | | / \ | | | | / \ | |
| | | | | | | | | | | | | | | | | |
| | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | |
/ \ / \ / \ _ | | / \ | | | | / \ | |
| | | | | | / \ | | | | | | | | | | | |
| | | | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | | | |
/ \/ \/ \ | | | | / \ | | | | / \ | |
| || || |/ \ | | | | | | | | | | | |
| || || || |/ \ | |/ \/ \| |/ \
|_______||_________||___________||___||_________| |_____||___________||_____________||_____________||_________|
Entrée = a.a.a.x.x.x.a.a.a
_ _ _
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
_ _ _ | | | | | | _ _ _
/ \ / \ / \ | | | | | | / \ / \ / \
|_|/\/\|_|/\/\|_|/\/\|_______________|/\/\|_______________|/\/\|_______________|/\/\|_|/\/\|_|/\/\|_|
Règles
- Bien sûr, c'est du golf de code, le score le plus bas en octets gagne
- Les règles standard relatives aux échappatoires s'appliquent
- N'importe quel nombre de lignes vides supplémentaires avant ou après la sortie est autorisé
- Vous pouvez choisir d'afficher le résultat entier dans une chaîne ou d'offrir la sortie sous forme de tableau dans lequel chaque élément représente une ligne de sortie, ou de l'envoyer à STDOUT.
Remarque
Ceci est mon premier message sur PPCG, alors je vous en prie, allez-y doucement. Il a traversé le bac à sable. Des points négatifs ou des améliorations possibles s'il vous plaît poster comme un commentaire et je ferai ce que je peux
[a,z]
et[A,Z]
en[1,26]
semble être une exigence inutile. Il serait bien mieux d’utiliser simplement une liste de nombres entiers comme entrée (ayant0
été l’entrée pour les décombres). De plus, publier votre défi après seulement 21 heures de jeu dans le bac à sable , sans attendre d'obtenir des votes ou des commentaires de plus d'un utilisateur, n'est pas pris en compte, car il a été "passé par le bac à sable". Il est recommandé de laisser les défis dans le bac à sable pendant 48 à 72 heures au minimum, afin de donner aux gens suffisamment de temps pour les examiner.[a,z]
, les[1.26]
parties ont mentionné le Mego. Le faire en option est souvent le meilleur (à moins que ce soit un élément clé du défi (ce n'est pas ici).Réponses:
JavaScript (ES6),
330326...315309 octetsConstruit l'art ASCII de manière récursive, en commençant par l'étage inférieur et en appliquant plusieurs expressions régulières entre chaque étape:
Comment ça marche
1) rez-de-chaussée
Nous commençons par traduire la chaîne d'entrée en un étage inférieur tel que:
où:
y
est un alias plus court pour la barre oblique inverse (qui nécessite une évasion)0
,1
ou2
) juste avant une séquence de_
est le mur de gauche du bâtiment. Il représente le nombre de murs qui doivent être placés au-dessus avant la prochaine "couche d'élargissement"._
correspond au mur de droite du bâtiment et est toujours défini sur0
.2) Expressions régulières appliquées entre chaque étape
Le processus récursif consiste à appliquer 9 remplacements à l'étage précédent, en utilisant les expressions régulières suivantes:
/\/y/g
=>" "
(enlever les décombres)/_/g
=>"x"
(remplacez la fondation ou le sommet du bâtiment par un bloc solide)/\/xy/g
=>" _ "
(remplace la dernière couche d'élargissement par le haut du bâtiment)/1/g
=>"3"
(remplacer temporairement1
par3
- voir dernière étape)/2/g
=>"1"
(remplacer2
par1
)/\/xx(x+)y/g
=>" 2$10 "
(remplace une couche d'élargissement par un nouveau mur plus étroit)/0(x+)0/g
=>"/$1y"
(remplacez le haut du mur par une couche d'élargissement)/3/g
=>"0"
(remplacer3
par0
)Par exemple, voici les transformations successives de
2___0
(étage inférieur généré par a'f'
):NB : Le sommet du bâtiment est alors remplacé par un
x
. Ceci n'est pas montré dans le diagramme ci-dessus.3) Expressions régulières appliquées au résultat final
La récursivité s'arrête lorsqu'il n'y a plus rien à remplacer, ce qui signifie que nous sommes au-delà du sommet du bâtiment le plus élevé.
Nous devons maintenant tout nettoyer avec encore quelques expressions régulières:
/\d/g
=>"|"
(remplace les chiffres par des tuyaux)/x/g
=>" "
(remplace les blocs pleins par des espaces)/y/g
=>"\"
(remplacery
par des barres obliques inverses)Par exemple:
Démo
Contributeurs:
4 octets sauvés grâce à Hedi
8 octets sauvés grâce à Not that Charles
la source
.charCodeAt()
.new
denew RegExp(e,'g')
y
celui-ci ne nécessite pas d'échapper à votre barre oblique. 2. Si vous utilisez_
pour le rez - de - chaussée, vous pouvez toujours différencier le haut avec l'expression rationnelle:/_ /
.PHP,
386376367364362358356 octetspremière approche; peut encore être golfable.
PHP,
366362361360357 octetsapproche similaire avec une sous-fonction:
ventilation pour la seconde approche
+16 octets si les nouvelles lignes principales ne sont pas autorisées:
remplacez
echo"$o[$y]\n;
parif($s=rtrim($o[$y]))echo"$s\n";
.-3 octets pour les
;<=>?[\]^_{|}~
gravats: Remplacer 1)($n=31&ord($c))
par$n
, 2)$n=28,$w='.'!=$c
par($n=31&ord($c))<27
et 3)4
par($n=28)/7
.Un autre -8 pour
>
,^
ou en~
tant que décombres: Annuler 3)la source
if(!$n){$o[$y++].=str_pad(_,$w," ",2);}
-2 octets pour les crochetsfor($y=36;$y--;)echo"$o[$y]\n";
; mais j'ai une nouvelle approche qui sauve un autre 2 octets.use
ne fonctionne que pour les fonctions anonymes. cela économiserait 2 octets; mais je devrais stocker cette fonction dans une variable$a=
au lieu de lui donner un nom (+3 octets) et d’ajouter un$
à chacun des quatre appels.Pyth,
9379 octetsEssayez-le en ligne. Suite de tests.
Explication
Je l'ai caché par défaut car c'est beaucoup trop long.
Afficher l'extrait de code
la source
Perl,
147146 octetsInclut +1 pour
-p
Exécuter avec une entrée sur STDIN, par exemple
citysky.pl
:Fonctionne comme indiqué, mais remplacez les
\xhh
échappés par leur valeur littérale pour obtenir le score revendiqué. Vous pouvez le faire en utilisant cette ligne de commande:Je n'ai pas vraiment exploré d'autres approches, donc ça peut être très battable ...
la source
Haskell, 289 octets
la source
Ruby, 245
Vous autorisez autant de nouvelles lignes que vous le souhaitez, je prends donc cette liberté. En dehors de cela, le processus est le suivant:
a
.a[0]
/\/\
àa[0]
c.upcase.ord + (c.upcase.ord-1)/3
)a
:a[t]+=w*(a[0].size-a[t].size)
h
- dessus , centrez un_
| |
ou/ \
de la largeur appropriée (1+2*((h-t)/4
), selon sih-t%4==0
"|___|"
de la bonne largeur àa[0]
a.reverse
Je parie que je peux le réduire si je fais le calcul pour éviter
reverse
la source
PHP, 297 octets
Une version plus lisible:
la source