Considérez ces sept wagons de train ASCII.
Moteur (E)
__
====== \/
| [] |=========
| )
================
O-O-O O-O-O \\
Voiture de tourisme (P)
===============
| [] [] [] [] |
===============
O-O O-O
Wagon de marchandises (B)
===============
|-|-| | |-|-|
===============
O-O O-O
Tanker (T)
_____---_____
( )
===============
O-O O-O
Trémie (H)
_______________
\ | | | | | | /
===============
O-O O-O
À plat (F)
===============
O-O O-O
Le fourgon de queue (C)
=====
====| |====
| [] [] |
=============
O-O O-O
Ecrivez un programme qui, lorsqu'il reçoit une séquence de caractères EPBTHFC
, affiche sa représentation de train ASCII, en utilisant --
pour les attelages de voiture. Les caractères saisis le plus à gauche deviennent les wagons les plus à droite. Le train est toujours tourné à droite.
Par exemple, une entrée de EEHTBPFC
devrait produire
__ __
===== ====== \/ ====== \/
====| |==== =============== =============== _____---_____ _______________ | [] |========= | [] |=========
| [] [] | | [] [] [] [] | |-|-| | |-|-| ( ) \ | | | | | | / | ) | )
=============--===============--===============--===============--===============--===============--================--================
O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O-O O-O-O \\ O-O-O O-O-O \\
Détails
- C'est du code golf; le programme le plus court en octets gagne.
- Toute séquence d'une ou de plusieurs lettres
EPBTHFC
constitue une entrée valide. - Votre programme doit pouvoir afficher les 7 types de voiture exactement tels qu'ils apparaissent ci-dessus.
- Prenez les entrées à partir de la ligne de commande ou directement de l'utilisateur (par exemple, une boîte de message). Sortie sur stdout. (Les citations autour de l'entrée sont très bien.)
- La hauteur de sortie doit être égale à 6 ou à la hauteur maximale requise pour les wagons de train en train d’être tractés.
- Ne mettez pas les attelages (
--
) à l'avant de la première voiture ou à l'arrière de la dernière voiture.
code-golf
ascii-art
kolmogorov-complexity
Les passe-temps de Calvin
la source
la source
E
à l'avant et pourrait-il y avoir unE
quelque part au milieu?Réponses:
Perl, 265 octets
Étant donné que cette entrée contient des octets qui ne correspondent pas à des caractères ASCII imprimables, elle ne peut pas être copiée-collée directement ici. Au lieu de cela, je le fournis comme un vidage hexadécimal. Les utilisateurs de systèmes Unix-ish peuvent reconstruire le script en fournissant à la
xxd -r
commande le vidage hexadécimal suivant :Le script utilise la fonctionnalité Perl 5.10
say
et doit donc être exécuté avecperl -M5.010
. Il prend un seul argument de ligne de commande composé des lettresEPBTHFC
et génère l'arrangement correspondant du wagon. Par exemple, l'entréeFEH
produit la sortie suivante:Le code lisible au début du script décompresse simplement la chaîne compressée par zlib contenant le corps du script et l’évalue. Le code décompressé, à son tour, ressemble à ceci:
Notez que toutes les voitures de train ont leurs lignes rembourrées d'espaces de longueur uniforme et incluent l'accouplement (qui est retiré de la voiture la plus à droite par la boucle de sortie). La compression DEFLATE utilisée par zlib est très efficace pour la compression de telles données répétitives. Il n'est donc pas nécessaire de tenter de la compresser à la main.
Notez qu'il s'agit d'une première tentative rapide. Je suis sûr qu'il serait possible de gagner plusieurs octets en jouant avec des variantes telles que la réorganisation des wagons dans la source.
la source
Python, 464
Je suis allé pour une approche en utilisant des malédictions. Il ne peut pas vraiment rivaliser, mais je me suis bien amusé (~ 630 octets):
la source
sl
2.0Python (
582488476450 Chars)Ascii-salad est une chaîne compressée en zlib codée en base64 contenant les chiffres ...
la source
string.decode('base64')
2.j=lambda y:y==4and'--'or' '
3.for c in A[::-1]:i.append(C[c][y])
f.append(j(y).join(i)
for l in((y==4and'--'or' ').join(C[c][y]for c in A[::-1])for y in range(6-h,6)):print l
for y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
Python,
402369Merci pour les améliorations, Ugoren!
la source
range(6)
,for x,y in zip("EPBTHFC",range(0,42,6)):
Javascript,> 471 octets
Bien merde, déjà sur le meilleur score, et je n'ai toujours pas eu à le faire imprimer tout en séquence. Mais j'ai passé un après-midi là-dessus et je voulais toujours le montrer.
Juste
console.log(c(L)); // L=train car letter
et cela imprimera une seule voiture dans la console. Je sais que je pourrais faire beaucoup de retouches pour y arriver, mais j'abandonne. : Pla source
<marquee>
diable diabolique. Pourquoi vous ont-ils jamais déprécié?Java (583 caractères)
Avec la compression maison basique - pas sûr que ce soit si efficace cependant :-) La chaîne de train (par exemple
EEHTBPFC
) doit être passée en paramètre.Déplié:
la source
C #,
758664603562 octetsPas un gros score, environ 200 octets dans la chaîne mal codée, et environ 80 octets consacrés au décodage. Frustrant quantité de code passé à trier l'accouplement sur le moteur! Cela laisse maintenant un espace blanc derrière le train, ce qui est désordonné mais conforme aux règles, et il a également les dimensions de la chaîne de données codée en dur, ce que j’étais réticent à faire au début.
Un peu formaté:
La chaîne est compressée très simplement en remplaçant le caractère répété par une représentation sous forme de chaîne du nombre de caractères suivis du caractère (moins 1), ou tout simplement du caractère s'il n'y en a qu'un (je voulais coller avec ASCII et éviter de faire quoi que ce soit au niveau des sous-caractères). Encodeur (non inclus dans la partition):
la source
Voici ma solution en PHP (compatible v5.4), 512bytes. Pourrait être plus court, mais juste fait un montage rapide pour essayer ceci.
Ceci est une version étendue pour une lecture facile:
la source
Python, 491 octets
J'aime la façon dont c'est sorti, même si ce ne sera pas un gagnant.
la source
if j==5...x[j]+=y[w[i]][j]+k
pourx[j]+=y[w[i]][j]+('\\ 'if j==5 and w[i]=='E'else'--'if j==4 and i!=u-1 else' ')
économiser un peu. (Vous pouvez aussi mettre un onglet au lieu de deux espaces devantx[j]...
.)GNU sed , 491 bytes
Essayez-le en ligne!
Explication
Il s’agit d’un schéma de compression personnalisé super naïf. La première ligne ajoute à chaque lettre de l’entrée un espace et
#
, pour marquer la fin de chaque partie:Les 7 lignes suivantes remplacent chaque lettre par une représentation comprimée de l’image ASCII correspondante:
Les 14 lignes suivantes font la "décompression". Par exemple, une
S
décompression à sixs
es et unes
décompression à deux espacesS
deviennent ainsi 12 espaces.Décompressé, les lignes de chaque voiture sont précédées d'un numéro de ligne et chaque voiture est terminée par
#
. Le reste du code ajoute0123456;
le numéro de ligne et le délimiteur à l'espace-modèle, puis, en boucle, remplace chaque chiffre par la ligne correspondante de chaque voiture.Enfin, il divise l’espace du motif en lignes en séparant les chiffres et nettoie les caractères superflus:
Il y a beaucoup de place à l'amélioration ici. Je n’étais pas du tout rigoureux dans la recherche d’un ensemble optimal de compressions, et l’utilisation d’une table de correspondance au lieu de 14 secondes
s///g
serait une solution facile. Je peux ou ne peux pas nouille avec cela un peu plus.la source
Python 3 , 529 octets
Essayez-le en ligne!
Je pensais le poster car il n'utilise aucune compression, contrairement à la plupart des autres réponses ici.
la source
C (gcc) ,
501499490489484 octets-2 -9 -1 -5 octets grâce à ceilingcat .
Essayez-le en ligne!
la source