Esto es un poco similar a esta entrada cubierta de polvo, pero espero que mi giro lo haga lo suficientemente único. No he podido encontrar nada que me disuade de publicar esto, pero hay bastante mar por ahí.
¡De todas formas! El reto:
Su código recibe una cadena de caracteres; Convierte esto en una versión de estilo ASCII-art de la misma cadena, pero con una captura.
Transformación de entrada
- Los únicos caracteres que se admiten son AZ y 0-9.
- Las letras minúsculas se transforman en mayúsculas
- Todo lo demás se elimina silenciosamente.
Dibujo de personajes
- Cada "píxel" de la fuente ampliada se dibuja desde la cadena de entrada
- El enésimo píxel es igual al enésimo carácter en la cadena de entrada. Si n es mayor que la longitud de la cadena de entrada, regrese al principio
- Las letras individuales se dibujan de izquierda a derecha, de arriba a abajo
- Las letras posteriores recogen su índice de "carácter de píxel" de donde quedó la última letra (por ejemplo, con una longitud de entrada de 10, si la primera letra tenía 9 píxeles, el primer píxel de la segunda letra se dibujará con el décimo carácter de entrada, el segundo el píxel se dibujará con el primer carácter de entrada)
- Cada letra se dibuja en una cuadrícula de 5x5, completamente rellenada con espacios. Puedes encontrar la fuente que vas a usar pre-renderizada para ti en este pastebin o un poco más abajo en esta publicación
- Cada letra se dibuja en la misma línea, por lo que el número total de saltos de línea en su salida será 4
- Cada letra está separada por 2 columnas de espacios
La fuente
000
0 00
0 0 0
00 0
000
111
1
1
1
11111
2222
2
222
2
22222
3333
3
333
3
3333
44
4 4
44444
4
4
55555
5
5555
5
5555
6666
6
6666
6 6
666
77777
7
7
7
7
888
8 8
888
8 8
888
999
9 9
9999
9
9999
AAA
A A
AAAAA
A A
A A
BBBB
B B
BBBB
B B
BBBB
CCCC
C
C
C
CCCC
DDDD
D D
D D
D D
DDDD
EEEEE
E
EEE
E
EEEEE
FFFFF
F
FFF
F
F
GGGG
G
G GG
G G
GGGG
H H
H H
HHHHH
H H
H H
IIIII
I
I
I
IIIII
JJJJJ
J
J
J
JJ
K K
K K
KKK
K K
K K
L
L
L
L
LLLLL
M M
MM MM
M M M
M M
M M
N N
NN N
N N N
N NN
N N
OOO
O O
O O
O O
OOO
PPPP
P P
PPPP
P
P
QQ
Q Q
Q QQ
Q Q
QQ Q
RRRR
R R
RRRR
R R
R R
SSSS
S
SSS
S
SSSS
TTTTT
T
T
T
T
U U
U U
U U
U U
UUU
V V
V V
V V
V V
V
W W
W W
W W W
WW WW
W W
X X
X X
X
X X
X X
Y Y
Y Y
Y
Y
Y
ZZZZZ
Z
Z
Z
ZZZZZ
Sí, sé que 4 y Q son feos
Un ejemplo
Entrada
0123456789
Salida
012 567 6789 0123 34 45678 9012 34567 234 567
3 45 8 0 4 5 6 9 3 8 5 6 8 9
6 7 8 9 123 567 78901 0123 4567 9 789 0123
90 1 0 4 8 2 4 8 9 0 0 1 4
234 12345 56789 9012 3 5678 012 1 234 5678
Otro ejemplo
Entrada
a3 B'2
Salida
A3B B2A3 2A3B 2A3B
2 A B 2 A 2
3B2A3 2A3 3B2A A3B
B 2 B 3 B 2
A 3 2A3B 2A3B A3B2A
Las lagunas estándar están prohibidas. Codifique el golf para que no se dé la marca verde.
[A-Z\d]
: no creo que filtrar caracteres no válidos agregue nada al desafío.Respuestas:
Python 2 ,
413411373364352345 bytes-1 byte gracias a Kevin Cruijssen .
-9 bytes gracias a Jo King .
-1 byte gracias a Lynn .
La cadena de datos contiene versiones no imprimibles, escapadas a continuación
Pruébalo en línea!
Como cada personaje tiene 25 píxeles, puede codificarse fácilmente en 25 bits. El número base 126
'uM\x04<L\x10x\x14Se#ye\x0f>El4NpD@$\tgh>\x1d\x10\x15I,\x0em]a\x0e\x03B>e\x15,\x0c]\x03?kFL\x01\x0byglxV!\x18\x16\x0c\x0b\x10\x0b%w832wGj%uT{Hr*K,*[P\n6.&ED#T\x0c}^\x1c\x0fD\x17LI&p7\x17f\\d`*\x01l\x1bG\x12!Fac\x05\x08\x0eG\rz?!\x1aA'
codifica todos los caracteres,0
está codificado por los 25 bits menos significativos,1
por los siguientes 25 bits yZ
está codificado por los 25 bits más significativos. Se codifica un solo carácter en el siguiente orden:(
00
es el bit menos significativo,25
el más significativo)Los espacios están codificados por un cero, no espacios por uno. Ejemplo :
Sin golf
Pruébalo en línea!
fuente
+' '
debe ser+' '
. Buena respuesta de todos modos, así que +1 de mi parte..upper()
sin embargo, necesita el lugar, de lo contrario las letras internas terminan en minúsculas>1
.APL (Dyalog Unicode) ,
228225224214 bytesPrograma completo Solicita stdin para cadena. Imprime en stdout. Aproximadamente la mitad del código solo decodifica el alfabeto codificado.
_
..._
representa la siguiente cadena codificada LZ4 de 143 bytes entre comillas:"⊥\u0004pæ€}€\\⊃⌿Æ€â<Å€∧€ÀÆ€Ð┬:Ëcü\u0000≥ðè⊤õ⍨¢∧·èý\u0005þÐÕ\u001EÐ :\u001Eè⌊×ßi[B⊂ɫoãà oéìÐ⍙⊃Ý∣à)≥èB⊃\u001B\u001F⊥ä{⌿⍨ G⍺\u001B⌿Æ\u001F∇x└îR`:└è→⊂\u0000ê∧⍒\u0003ɫqè$$ÛD⊥â∊\u001B\u001Eéu|\u001B@4A|⍪┌nàkááЀ€€€€€€"
Pruébalo en línea!
_
…_
Cadena de 143 bytes con codificación LZ4 entre comillas⎕AV⍳
ɩ ndices de que en el A tomic V ector (el juego de caracteres)¯125+
agregue -125 a eso (para obtener enteros de 8 bits firmados)¯1(219⌶)
Descompresión LZ40(220⌶)
deserializar a una matriz booleana de 36 capas, 5 filas y 5 columnas(
...)⌷
indexe eso usando los siguientes índices:⎕A
alfabeto mayúscula A⎕D,
anteponer los D igitsa←
almacenar ena
(para un alfabeto)(
...)∩
intersección de lo siguiente y eso (elimina la entrada no válida):⍞
solicitud de entrada de texto desde stdin (consola)1(819⌶)
doblar a mayúsculas (819
parece queBig
1 es para sí grande en lugar de pequeño)i←
tienda eni
(para i Nput)a⍳
d nices de eso ena
⊂
adjuntar (para indexar con cada uno representando la coordenada principal)t←
almacenar ent
(por t ext),
ravel (aplanar)r←
almacenar enr
(para r avelled)+/
suma que (es decir, la cantidad de caracteres necesarios para pintar la obra de arte)i⍴⍨
cíclicamente r eshape la entrada a la longitudr\
expandir eso; inserte espacios en 0s, consuma letras en 1s(
…) ⍴` remodelar a la siguiente forma:⍴t
la forma del texto↓
dividir la matriz N por 5 por 5 en una matriz N por 5 de líneas artísticas⍉
transponer en una matriz de 5 por N de líneas de arte (esto alinea las líneas correspondientes de los caracteres)Por defecto, APL separa elementos simples de una matriz anidada con 2 espacios.
fuente
Python 2 , 428 bytes
Pruébalo en línea!
Las letras están codificadas de la siguiente manera:
Cada parte única (hay 23) se convierte en binario y se agrega un 1 al frente. Luego se convierte a la base 36.
Los números de base 36 resultantes son:
La inicial
1
se elimina, por lo que tenemos un solo carácter:Cada letra (
A-Z0-9
) se codifica a cinco de estos nuevos caracteres.En cinco listas:
Para asignar la entrada a un índice en estas listas, se modifica el ordinal:
Debido a que los ordinales no son 0-35, sino que están ligeramente mezclados, las 5 listas se reorganizan y se concatenan:
Para cada carácter en la entrada, se encuentran 5 letras y se convierten en ints (base36):
Si el número está debajo
30
,36
se agrega (los que faltamos1
eliminamos anteriormente)Luego, el número se convierte de nuevo a binario, y
0
sy1
s se convierten eny
.
. Se agregan dos espacios al final durante la conversión.P.ej.
Para cada uno
.
en el resultado, se reemplaza por el siguiente carácter de la entrada (iterado porx
)fuente
Java 8,
917907 bytesLo jugará golf desde aquí para reducir al menos a la mitad el conteo de bytes actual con suerte.
Pruébalo en línea.
Explicación:
fuente
i=-1
interior de la lambda. ¿Pero tal vez soy incorrecto y no está permitido según el meta? EDITAR: Algo similar se hace con bastante frecuencia en las respuestas de C.int i;f->{for(;i++<10;)print(i);}
es 1 byte más corto quef->{for(int i=0;i++<10;)print(i);}
.i=-1
está dentro de la función lambda. Su ejemplo no funciona si ejecuta el mismo lambda dos veces, el mío sí, que es la diferencia clave aquí.int i;f->{for(i=0;i++<10;)print(i);}
se permitiría por ejemplo (aunque no sea realmente más corto).Japt v2.0a0
-R
,213211210209206193191190 bytesIncluye un espacio inicial en cada línea.
Pruébelo o pruebe todos los caracteres (los bytes adicionales se deben a que TIO aún no admite Japt v2)
Explicación
Tabla de búsqueda
Cada grupo de 4 caracteres en la cadena (representada
...
aquí para ahorrar espacio y porque contiene un montón de no imprimibles) es la representación binaria de cada carácter (0
para espacios,1
para caracteres) con las nuevas líneas eliminadas y convertidas a base-100.Ejemplo
El código
fuente
Rubí , 366 bytes
Pruébalo en línea!
Esto se puede jugar mucho, pero ahora me he quedado sin tiempo e ideas. Fue más difícil de lo que pensé solo para que funcionara.
Cómo funciona:
No es tan difícil de entender, solo explicaré cómo se codifica el alfabeto con un ejemplo. Cada línea de cada personaje se convierte en binario y luego en base-36.
El primer paso es quitar todos los caracteres no alfanuméricos de la cadena de entrada.
Luego genero una tabla de búsqueda para el renderizado final, porque quiero imprimir línea por línea.
Después de eso, iterando en la línea del alfabeto, creo el patrón binario de las letras.
Finalmente, reemplazo 0 con espacios y 1 con caracteres de la tabla de búsqueda.
Siéntase libre de jugar más golf, sé que esto podría ser 20-30 bytes más corto (usando gsub en lugar de tr, etc.), pero ahora no estoy interesado, a menos que pueda hacer que la tabla del alfabeto sea drásticamente más pequeña.
fuente
Carbón de leña ,
172164 bytesPruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Prefije los dígitos al alfabeto en mayúsculas predefinido.
Ponga en mayúscula la entrada y filtre todos los caracteres no compatibles.
Recorre los personajes restantes.
Pase sobre cada fila, imprimiendo implícitamente cada resultado en su propia línea.
La cadena comprimida es la constante entera grande de @ ovs, convertida a binaria e invertida. Luego se divide en 180 subcadenas de 5 caracteres, y la subcadena relevante para el carácter y la fila actual se repite.
Si se configuró el bit, imprima cíclicamente el siguiente carácter de la entrada filtrada; de lo contrario, imprima un espacio.
Coloque el cursor listo para imprimir el siguiente carácter.
fuente
Perl 5 con
-nlaF/[^A-Za-z0-9]+|/
247 bytesPruébalo en línea!
Explicación
Primero se crea una tabla de búsqueda al
%l
usar lospack
datos ed. Estos datos son una cadena binaria de 900 bits de cada char empaquetada como una cadena binaria de 25 bits (almacenada como 113 bytes, ¡solo 1 byte más que el carbón!), Similar a algunas otras respuestas, asíA
es:que, usando
0
para espacio y1
paraA
es:y sin los saltos de línea es:
Una vez que se inicializa la búsqueda, iteramos sobre cada char válido
@F
(que se completa utilizando la-a
opción utosplit de Perl ) añadiendo a cada uno de los 5 elementos de la lista@;
para cada fila en la matriz de la búsqueda, reemplazando todos los1
s con losuc$F[$i++%@F]
cuales es el$i
th carácter (módulo@F
que es la longitud de@F
) convertido au
pperc
ase, y todos los0
s con los$"
valores predeterminados al espacio. Una vez que@;
se rellena cada índice para cada carácter@F
,say
imprime cada línea con una nueva línea final.Nota : la cadena posterior
unpack
contiene elementos no imprimibles que se escapan utilizando la\xXX
notación. Verificación de puntaje de 247 .fuente
SOGL V0.12 ,
165164163 bytesPruébalo aquí!
Explicación:
fuente
JavaScript (Node.js) ,
365347 bytesGuardado 1 byte gracias a @Scoots
Devuelve una matriz de 5 cadenas. Incluye un espacio inicial en cada fila.
3736 bytes se pierden al convertir todo a mayúsculas y hacer coincidir[A-Z0-9]
: - /Pruébalo en línea!
Codificación de caracteres
Los caracteres se codifican al revés y se convierten en una base 80 personalizada con un desplazamiento de 4 , utilizando el rango ASCII [35..114] .
Los valores 35 a 79 se asignan directamente al carácter ASCII correspondiente, mientras que los valores 0 a 34 se asignan a los caracteres 80 a 114 . Esto permite decodificar simplemente tomando el código ASCII módulo 80 .
Por ejemplo, 'F' se codifica como
"RZW["
:Comenzando con i = v = 4 , se decodifica de nuevo a un entero de 25 bits haciendo:
En el código completo, en realidad procesamos un segmento sin límites () de la secuencia codificada, lo que significa que es probable que iteremos significativamente más de 4 veces. Esto no es un problema porque todas las iteraciones con i <0 solo afectarán la parte decimal del resultado, lo cual es ignorado de todos modos por las operaciones bit a bit que siguen inmediatamente.
Pruébalo en línea!
fuente
toUpperCase
con lai
bandera en el RegEx?[A-Z\d]
lugar de[A-Z0-9]
?C (gcc) ,
792690 bytesPruébalo en línea!
Se las arregló para exprimir esto por debajo de 800 con alguna reutilización variable. Optaron por almacenar la fuente como una matriz deint
s, ya que aunque almacenarla como una cadena larga parecía una idea atractiva, muchos de los fragmentos de 8 bits de la fuente no eran un carácter ASCII conveniente y agradable que los códigos de escape estaban tomando más personajes que laint
matriz.Editar: obtuve menos de 700 al cambiar a una codificación de cadena después de todo, algo inspirado por muchas de las otras respuestas aquí, improvisé una representación de base 92 usando (la mayoría de) los caracteres ASCII imprimibles. La representación incluye barras invertidas que necesitan un extra para escapar pero eso solo ocurre una vez en la fuente.
Aparte de eso, no hay mucho que sea demasiado llamativo: la entrada (que consiste en el primer argumento de la línea de comandos) se copia en una matriz de pila, menos los caracteres que no están en la fuente y con letras minúsculas reemplazadas por sus en mayúsculas, se calcula qué carácter de "píxel" comienza cada letra completa (el uso
__builtin_popcount
tiene un nombre dolorosamente largo pero aún mejor que cualquier método de contar con bits que se me ocurra), y luego la impresión se realiza línea por línea. El compilador, por supuesto, genera varias veces la duración del programa en advertencias.Debajo de un poco de desnivel para su placer visual:
fuente
Excel VBA, 816 bytes
Una función de ventana inmediata anónima VBE que toma la entrada del rango
[A1]
y las salidas a la consola.Hasta donde yo sé, esta es la primera respuesta de VBA para usar la
base64
compresión.Nota: esta respuesta depende de la
Microsoft XML, v3.0
referencia de VBAEjemplo de E / S
No golfista y explicado
La mayor parte de esta solución almacena la fuente grande como una cadena base 64. Esto se realiza convirtiendo primero la fuente a binario, donde
1
representa un píxel0
activado y representa un píxel inactivo. Por ejemplo, para0
, esto se representa comoCon este enfoque, los alfanuméricos se pueden representar como
Estos segmentos se concatenaron y se convirtieron a MSXML base 64, lo que representa
La subrutina a continuación toma esto, convierte de nuevo a binario, y usa esto como referencia a partir de la cual se construye una cadena de salida, línea por línea, tomando primero los 5 píxeles superiores de cada carácter, luego la segunda fila y así sucesivamente hasta que se construya la cadena .
La subrutina luego itera sobre la cadena de salida y reemplaza los píxeles 'on' con caracteres de la cadena de entrada.
fuente
K (NGN / K) ,
230231 bytes(+1 byte después de un cambio en el idioma impl)
Pruébalo en línea!
donde
a
es un literal de cadena citado que codifica la fuente. K ve las cadenas como secuencias de bytes, por lo que un programa que contiene dicho literal es válido, pero no se puede ejecutar en TIO, ya que su forma HTML intenta interpretarlo como UTF-8 y lo estropea.El recuento de bytes se calcula como:
119 reportados por TIO
-2 para nombrar la función
f:
-1 para el marcador de posición
a
2 para un par de citas
""
113 para la longitud del literal de cadena
a
que no contiene ningún carácter que requiera escaparfuente