Espero que esta imagen te resulte familiar.
Es uno de los fantasmas de Pacman en su estado "vulnerable" , después de que Pacman ha comido una píldora de poder.
El reto
Imagina a nuestro fantasma en un pequeño marco, usando el arte ASCII. A escala normal (más sobre esto más adelante), cada cuadrado en la imagen de arriba debe corresponder a un carácter, y el marco debe tener una separación de un carácter hacia arriba y hacia abajo, y una separación de dos caracteres a la izquierda y derecha del fantasma :
####################
# #
# #### #
# ######## #
# ########## #
# ############ #
# ############ #
# ### ## ### #
# #### ## #### #
# ############## #
# ############## #
# ## ## ## ## #
# # ## ## ## # #
# ############## #
# ## ### ### ## #
# # ## ## # #
# #
####################
Pero esto no se ve muy bonito. #
puede no ser la mejor opción para los píxeles activos. Además, las celdas de los personajes no son cuadradas, lo que hace que nuestro amigo se vea más fantasmal de lo que ya es.
Entonces, para tener más flexibilidad, la imagen cambiará de acuerdo con tres parámetros de entrada:
- Carácter que se utilizará para píxeles activos;
- Factor de escala horizontal;
- Factor de escala vertical.
Por ejemplo, la %
, 4
, 2
que la salida sería la mejor imagen en busca
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% %%%%
%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%
%%%% %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Reglas
Todas las construcciones permitidas.
Las entradas se toman en cualquier formato razonable y en cualquier orden. Se garantiza que la primera entrada anterior (carácter para píxeles activos) será un carácter ASCII imprimible (códigos 32 a 126).
Los espacios finales después de cada línea o las nuevas líneas posteriores a la última línea son aceptables.
Código de golf, menos bytes gana.
fuente
Respuestas:
CJam,
535149 bytesTenga en cuenta que tres de los caracteres no se pueden imprimir. Pruébalo en línea!
Fondo
La mitad derecha de la salida sin escala es idéntica a la izquierda, por lo que es suficiente codificar una de ellas. Si reemplazamos espacios con ceros y no espacios con unos, obtenemos
donde cada línea se puede interpretar como un número binario. Esto produce
La forma más fácil de codificar esta información es reemplazar cada número entero con el carácter Unicode en ese punto de código, pero todos requerirían dos bytes para codificarse con UTF-8.
Al XORingar los enteros con 544, mantenemos todos menos dos enteros por debajo de 128 y evitamos bytes nulos.
El resultado es
como enteros o
como una cuerda escapada
Cómo funciona
fuente
Perl,
1131051041009796Se agregó +2 por
-ap
Sugerencias de dev-null save 9 bytes Se corrigió el conteo incorrecto según lo notó Dennis
Ejecutar usando
echo "2 4 %" | perl -ap pacman.pl
pacman.pl
:excepto que la cadena
"\xff\x00\x03\x0f\x1f\x3f\x3f\x39\x79\x7f\x7f\x66\x59\x7f\x6e\x46\x00\xff"
debe escribirse en forma binaria con comillas simplesEl espacio como carácter de reemplazo se convierte en la cadena vacía y conduce a líneas cortas. Pero todo se verá en blanco de todos modos
fuente
Dyalog APL, 64 bytes
Esto toma el factor de escala como argumento izquierdo y el carácter como argumento derecho, es decir:
Explicación:
⍉(7/2)⊤⎕AV⍳'Äâ\⊥⊥∘)⍞⍞┬#⍞`⍒'
: La mitad izquierda del fantasma, sin el borde. (Es simétrico). Cada carácter tiene su conjunto de bits alto, para evitar la selección de caracteres que no se imprimen⎕AV
, pero solo se utilizan los primeros 7 bytes.0,⍪⍨0⍪0,0,
: agrega un borde de espacios en blanco a la izquierda, arriba y abajo1⍪⍨1⍪1,
: agrega el marco a la izquierda, arriba y abajo,∘⌽⍨
: únala con su espejo vertical1+
: agrega 1, porque las matrices están indexadas en 1 de forma predeterminada' '⍵[
...]
: use esa matriz como un índice en la cadena' '⍵
, por lo que cada 0 se asigna a un espacio en blanco y cada 1 se asigna a⍵
.⍺,⊂
: encierra la matriz y únela a los factores de escala/
: plegado a la derecha con la siguiente función:/∘⍉
: transponer y escalar horizontalmentefuente
MATL , 71 bytes
Pruébalo en línea!
Explicación
La imagen es simétrica horizontalmente, por lo que solo se debe codificar la mitad izquierda. Cada fila de 10 píxeles está codificada en binario como un número entre 0 y 1023. Los píxeles activos se codifican como 0 en lugar de 1, por lo que la primera fila es el número 0 en lugar de 1023.
Dado que las filas consecutivas difieren solo en unos pocos píxeles, los números se codifican de manera diferencial adicional. Por lo tanto, cada fila se decodificará como la suma acumulativa de todos los números hasta esa fila, seguido de la conversión a binario.
Los números necesarios son entonces
0 se introduce en MATL usando la
O
función, que evita un separador con números vecinos. Además, los signos negativos no implican bytes adicionales, ya que sirven como separadores.Una vez que se ha creado la matriz, se suma acumulativamente, se decodifica binariamente y se refleja horizontalmente. La matriz 2D resultante se usa para indexar una cadena de dos caracteres para producir el resultado. Esta cadena tiene la forma
'% '
, donde'%'
es un carácter de entrada.Como señaló @Conor, el código también funciona con dos caracteres como entrada. En este caso, la cadena final indexada será de la forma
'%_ '
, donde la entrada es una cadena de dos caracteres'%_'
. El espacio simplemente se ignorará, porque la matriz de indexación solo aborda los dos primeros caracteres.fuente
C (gcc) ,
199197 bytes-2 bytes gracias a @JonathanFrech
Pruébalo en línea!
188 bytes (no imprimibles)
Cortesía de @JonathanFrech.
Pruébalo en línea!
Nada espectacular pasando. Como otros notaron, el fantasma es muy simétrico. La imagen en sí tiene 20 unidades de ancho, pero a excepción de las filas superior e inferior, las tres columnas más a la derecha son idénticas. Esto nos permite almacenar la mitad de la imagen como caracteres en lugar de tener que usar números enteros:
La cadena resultante se invirtió para obtener unos pocos bytes al tener un bucle descendente (también resolviendo un problema molesto con escapes hexadecimales). Otros bucles podrían invertirse sin problemas gracias a la simetría.
Cada personaje se desplaza hacia la izquierda y se le asigna un borde (con especial cuidado en la primera y última fila). Entonces es solo cuestión de generar la cadena correctamente escalada.
Todos los bucles for me hacen sentir que hay una mejor manera.
fuente
\xff
no se puede reemplazar porÿ
( TIO )?En serio, 116 bytes
Esa nueva línea es importante. Hexdump:
La misma estrategia que la respuesta CJam de Dennis , pero los valores están codificados en hexadecimal, en lugar de XOR con 544, y la manipulación de cadenas es mucho más difícil en serio.
Pruébalo en línea!
fuente
BBC BASIC,
239236232214 bytesLlamar
PROCM(1,1,35)
produce el fantasma hecho de # símbolos. Los argumentos para PROCM son: escala horizontal, escala vertical, valor ASCII del carácter.Este programa funcionará tanto para Brandy Basic como para BASIC 2 en un Modelo B original.
fuente
Lotes,
740722720 bytesEditar: ahorró
1820 bytes eliminando espacios innecesarios.fuente
Stax , 45 bytes
Ejecutar y depurarlo
Explicación:
fuente
JavaScript (ES6), 167 bytes
Basado en la respuesta de @ Dennis. Supongo que podría eliminar otro byte usando un FF literal en lugar de
\f
, pero dudo que pueda pegar uno aquí. Al probar esto, es posible que también desee usar en\u01CA
lugar delNJ
personaje.Lamentablemente, anteponer un espacio al argumento del personaje cuesta un total de 6 bytes.
fuente
Python 2,
838828618 bytesAhorré 210 bytes usando una cadena en lugar de una matriz, gracias a Dennis por esa sugerencia, sé que puedo mejorar aún más, pero por ahora es una buena mejora.
Esto es lo mejor que puedo hacer, no soy muy bueno con los gráficos en la línea de comandos.Tomé el pequeño fantasma como base.
Estoy usando el ascii 219 por defecto, porque con ese personaje, ¡el fantasma se ve increíble!
Golfed
Pruébalo en repl.it
Sin golf
Prueba
fuente
Python 2, 244 bytes
fuente
Python 2, 169 bytes
Pruébalo en línea!
Explicación:
Como en la respuesta de Dennis , cada carácter en esta cadena representa la representación binaria de una línea de la mitad izquierda de la "imagen", XOR 544.
Para cada carácter en la cadena, haga lo siguiente:
Transforme el carácter en su representación entera, luego realice un XOR binario con 544. Luego transforme este entero en una cadena de caracteres de su representación binaria, como '0xb1111111111'.
Para cada personaje en la picadura, comenzando en la posición 2 (que omite el 0b al principio), haga lo siguiente:
Si el carácter == "1", reemplácelo con el carácter proporcionado; de lo contrario, sustitúyalo por un espacio. Luego copia este personaje x veces. (x = 0 dará como resultado una cadena vacía).
Concatene todas las cadenas en una cadena larga, separada por una cadena vacía "".
haga una cadena de b + el reverso de b, luego cree una matriz que contenga y instancias de esta cadena (y = 0 producirá una lista vacía []), luego agregue esta lista a la lista z.
Finalmente, imprima en pantalla cada una de las cadenas producidas, separadas por saltos de línea.
fuente