Considere estos siete vagones de tren ASCII.
Motor (E)
__
====== \/
| [] |=========
| )
================
O-O-O O-O-O \\
Vehículo de pasajeros (P)
===============
| [] [] [] [] |
===============
O-O O-O
Furgón (B)
===============
|-|-| | |-|-|
===============
O-O O-O
Petrolero (T)
_____---_____
( )
===============
O-O O-O
Tolva (H)
_______________
\ | | | | | | /
===============
O-O O-O
Cama plana (F)
===============
O-O O-O
Caboose (C)
=====
====| |====
| [] [] |
=============
O-O O-O
Escriba un programa que, cuando se le da una secuencia de caracteres EPBTHFC
, genera su representación de tren ASCII, que se utiliza --
para los acoplamientos del automóvil. Los caracteres de entrada más a la izquierda se convierten en los vagones de tren más a la derecha. El tren siempre está mirando a la derecha.
Por ejemplo, una entrada de EEHTBPFC
debería producir
__ __
===== ====== \/ ====== \/
====| |==== =============== =============== _____---_____ _______________ | [] |========= | [] |=========
| [] [] | | [] [] [] [] | |-|-| | |-|-| ( ) \ | | | | | | / | ) | )
=============--===============--===============--===============--===============--===============--================--================
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 \\
Detalles
- Este es el código de golf; gana el programa más corto en bytes.
- Cualquier secuencia de una o más de las letras
EPBTHFC
es una entrada válida. - Su programa debe poder generar los 7 tipos de automóviles exactamente como aparecen arriba.
- Tome información de la línea de comando o directamente del usuario (por ejemplo, cuadro de mensaje). Salida a stdout. (Las citas alrededor de la entrada están bien).
- La altura de la salida debe ser 6 o la altura máxima necesaria para los vagones de tren que se dibujan.
- No coloque acoplamientos (
--
) en la parte delantera del primer automóvil o en la parte posterior del último automóvil.
code-golf
ascii-art
kolmogorov-complexity
Pasatiempos de Calvin
fuente
fuente
E
en el frente y podría haber unaE
en el medio?Respuestas:
Perl, 265 bytes
Como esta entrada contiene bytes que no corresponden a caracteres ASCII imprimibles, no se puede copiar y pegar aquí directamente. En cambio, lo estoy proporcionando como un volcado hexadecimal. Los usuarios en sistemas Unix-ish pueden reconstruir el script al alimentar el siguiente volcado hexadecimal al
xxd -r
comando:El script usa la función Perl 5.10
say
, por lo que debe ejecutarse con élperl -M5.010
. Toma un argumento de línea de comando único que consiste en las letrasEPBTHFC
y genera la disposición correspondiente del vagón de tren. Por ejemplo, la entradaFEH
produce la siguiente salida:El código legible al comienzo del script simplemente descomprimió la cadena comprimida en zlib que contiene el cuerpo del script y lo evalúa. El código descomprimido, a su vez, se ve así:
Tenga en cuenta que todos los vagones del tren tienen sus líneas acolchadas con espacios a una longitud uniforme e incluyen el acoplamiento (que es despojado del vagón más a la derecha por el lazo de salida). La compresión DEFLATE utilizada por zlib es muy buena para comprimir datos tan repetitivos, por lo que no es necesario intentar comprimirlos a mano.
Tenga en cuenta que este es un primer intento rápido. Estoy seguro de que sería posible reducir varios bytes de la longitud jugando con variaciones como reordenar los vagones del tren en la fuente.
fuente
Python, 464
Fui por un enfoque usando maldiciones. Realmente no puede competir, pero me divertí un poco (~ 630 bytes):
fuente
sl
2.0Python (
582488476450 caracteres)La ensalada ascii es una cadena comprimida en zlib codificada en base64 que contiene las figuras ...
fuente
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])
Pitón,
402369¡Gracias por las mejoras, ugoren!
fuente
range(6)
,for x,y in zip("EPBTHFC",range(0,42,6)):
Javascript,> 471 bytes
Bueno, mierda, ya superando el mejor puntaje, y todavía no he podido imprimirlo todo en secuencia. Pero pasé una tarde en esto y todavía quería mostrarlo.
Justo
console.log(c(L)); // L=train car letter
e imprimirá un solo automóvil en la consola. Sé que podría hacer muchos recortes incluso para esto, pero me rindo. :PAGSfuente
<marquee>
demonio diabólico. ¿Por qué te han despreciado alguna vez?Java (583 caracteres)
Con la compresión casera básica, no estoy seguro de que sea tan eficiente :-) La cadena del tren (por ejemplo
EEHTBPFC
) debe pasarse como parámetro.Desplegado:
fuente
C #,
758664603562bytesNo es una gran puntuación, unos 200 bytes en la cadena mal codificada, y unos 80 bytes dedicados a decodificarla. ¡Frustrante cantidad de código invertido en resolver el acoplamiento del motor! Ahora deja un espacio en blanco al frente del tren, que está desordenado pero dentro de las reglas, y también tiene las dimensiones de la cadena de datos codificadas, algo que me resistí a hacer inicialmente.
Formateado un poco:
La cadena se comprime simplemente reemplazando el carácter repetido con una representación de cadena del número de caracteres seguido del carácter (menos 1), o solo el carácter si solo hay uno de ellos (quería seguir con ASCII y evitar hacer algo en el nivel sub-char). Codificador (no incluido en la puntuación):
fuente
Aquí está mi solución en PHP (compatible con v5.4), 512bytes. Podría ser más corto, pero solo hice una compilación rápida para probar esto.
Esta es una versión extendida para una fácil lectura:
fuente
Python, 491 bytes
Me gusta cómo salió, a pesar de que no será un ganador.
fuente
if j==5...x[j]+=y[w[i]][j]+k
ax[j]+=y[w[i]][j]+('\\ 'if j==5 and w[i]=='E'else'--'if j==4 and i!=u-1 else' ')
para ahorrar un poco. (También puede poner una pestaña en lugar de dos espacios delante dex[j]...
.)GNU sed , 491 bytes
Pruébalo en línea!
Explicación
Esto es básicamente un esquema de compresión personalizado súper ingenuo. La primera línea agrega a cada letra en la entrada un espacio y
#
, para marcar el final de cada parte:Las siguientes 7 líneas reemplazan cada letra con una representación comprimida de la imagen ASCII correspondiente:
Las siguientes 14 líneas hacen la "descompresión". Por ejemplo, un
S
descomprime a seiss
es, y uns
descomprime a dos espacios, por lo que seS
convierte en 12 espacios.Descomprimido, las líneas de cada automóvil están precedidas por un número de línea, y cada automóvil está terminado por
#
. El resto del código antecede0123456;
(los números de línea y el delimitador) al espacio del patrón y luego, en un bucle, reemplaza cada dígito con la línea correspondiente de cada automóvil.Finalmente, corta el espacio del patrón en líneas al dividir en dígitos y limpia caracteres extraños:
Aquí hay mucho margen de mejora. No fui riguroso en absoluto para encontrar un conjunto óptimo de compresiones, y usar una tabla de búsqueda en lugar de 14
s///g
s separadas sería una victoria fácil. Puedo o no tallarines con esto un poco más.fuente
Python 3 , 529 bytes
Pruébalo en línea!
Pensé que lo publicaría porque no usa ninguna compresión, a diferencia de la mayoría de las otras respuestas aquí.
fuente
C (gcc) ,
501499490489484 bytes-2 -9 -1 -5 bytes gracias a ceilingcat .
Pruébalo en línea!
fuente