Este es un desafío de código restringido , complejo de kolmogorov , de golf de código para producir una salida fija sin entrada.
Sin embargo, el formato de salida es flexible: puede imprimirse en salida estándar, imprimirse en error estándar, devolverse como una lista de caracteres, devolverse como una lista de bytes o devolverse como una lista de enteros. Si crees que algo más parece razonable, ¡solo pregunta en los comentarios!
Aquí hay un CODEGOLF de arte ASCII simple y con letras grandes :
CCCC OOO DDDD EEEEE GGG OOO L FFFFF
C O O D D E G O O L F
C O O D D EEE G GG O O L FFF
C O O D D E G G O O L F
CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Sin líneas nuevas (o espacios finales en las líneas) tiene 256 caracteres de longitud:
CCCC OOO DDDD EEEEE GGG OOO L FFFFFC O O D D E G O O L FC O O D D EEE G GG O O L FFFC O O D D E G G O O L F CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Los índices (basados en 0) de los caracteres no espaciales son:
1, 2, 3, 4, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 29, 30, 31, 36, 37, 38, 42, 49, 50, 51, 52, 53, 54, 61, 65, 68, 72, 75, 82, 89, 93, 96, 103, 104, 111, 115, 118, 122, 125, 126, 127, 132, 135, 136, 139, 143, 146, 153, 154, 155, 156, 163, 167, 170, 174, 177, 184, 188, 191, 195, 198, 205, 207, 208, 209, 210, 214, 215, 216, 220, 221, 222, 223, 227, 228, 229, 230, 231, 235, 236, 237, 238, 242, 243, 244, 248, 249, 250, 251, 252, 255
No puede utilizar ninguno de estos 97 bytes en su código, pero debe generar una lista (o similar) de estos bytes, en este orden, con los bytes faltantes reemplazados por el byte 32 en la página de códigos que está utilizando (en muchos, muchos páginas de códigos un carácter de espacio).
Puede incluir las nuevas líneas de impresión bonita * (pero no espacios finales en las líneas) si es útil.
Por ejemplo, utilizando la página de códigos Jelly, esta salida es aceptable:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 12345
6 = A D H K R Y ] ` g
h o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓ
ƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ
ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
... pero también lo es:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 123456 = A D H K R Y ] ` gh o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
...y tambien:
[32, 1, 2, 3, 4, 32, 32, 32, 8, 9, 10, 32, 32, 32, 14, 15, 16, 17, 32, 32, 32, 21, 22, 23, 24, 25, 32, 32, 32, 29, 30, 31, 32, 32, 32, 32, 36, 37, 38, 32, 32, 32, 42, 32, 32, 32, 32, 32, 32, 49, 50, 51, 52, 53, 54, 32, 32, 32, 32, 32, 32, 61, 32, 32, 32, 65, 32, 32, 68, 32, 32, 32, 72, 32, 32, 75, 32, 32, 32, 32, 32, 32, 82, 32, 32, 32, 32, 32, 32, 89, 32, 32, 32, 93, 32, 32, 96, 32, 32, 32, 32, 32, 32, 103, 104, 32, 32, 32, 32, 32, 32, 111, 32, 32, 32, 115, 32, 32, 118, 32, 32, 32, 122, 32, 32, 125, 126, 127, 32, 32, 32, 32, 132, 32, 32, 135, 136, 32, 32, 139, 32, 32, 32, 143, 32, 32, 146, 32, 32, 32, 32, 32, 32, 153, 154, 155, 156, 32, 32, 32, 32, 32, 32, 163, 32, 32, 32, 167, 32, 32, 170, 32, 32, 32, 174, 32, 32, 177, 32, 32, 32, 32, 32, 32, 184, 32, 32, 32, 188, 32, 32, 191, 32, 32, 32, 195, 32, 32, 198, 32, 32, 32, 32, 32, 32, 205, 32, 207, 208, 209, 210, 32, 32, 32, 214, 215, 216, 32, 32, 32, 220, 221, 222, 223, 32, 32, 32, 227, 228, 229, 230, 231, 32, 32, 32, 235, 236, 237, 238, 32, 32, 32, 242, 243, 244, 32, 32, 32, 248, 249, 250, 251, 252, 32, 32, 255]
(Este último es un resultado de lista válido en cualquier idioma con cualquier página de códigos, y también se puede usar cualquier formato de lista razonable).
Aquí está el código Python 3 que muestra los bytes ASCII no disponibles.
* ¡Aunque la impresión en sí podría no ser tan bonita!
fuente
$%&*123456=ADHKRY]``ghosvz}~
y ninguna línea nueva?array_map(function($n){return sprintf("%6b",$n);},...)
sin un$
(podría hacer eso) Y sin}
(ni idea). Si; ¡Quiero empacar los datos!Respuestas:
Python 2 ,
321203 bytesPruébalo en línea!
Explicación:
de adentro hacia afuera:
cfjdbljcibkeajjejiljjlcbjddlafklebajjlceljdeadficijflealkeklkljadfbbckjebclk
es el número25731972618407747697792173390589410779249734035626759409848989703511287412985
codificado con caracteres permitidos. (No se123456
permite)reduce(lambda x,y:x+repr('abcdefijkl'.find(y)),'cfjdbl..bclkf','')
asigna la cadena a su cadena decimal:reduce(lambda x,y:x+y,'..','')
es lo mismo que''.join('..')
(No seo
permite)repr('..')
en lugar destr('..')
(No ses
permite)'abcdefijkl'.find(y)
asigna un carácter a un dígito.enumerate(bin(int(...)))
convierte la cadena numérica en una cadena binaria y enumera. Esto da los pares[(0,0), (1,b), (2,1), (3,1), ...]
map(lambda(i,x):(x>'0'and i-8-8-8-8)+8+8+8+8, ... )
convierte la lista enumerada en el resultado final.map(lambda(i,x):.. , .. )
en lugar de[... for(i,x)in ...]
(No seo]
permite)lambda(i,x): ..
convierte cada par (índice, valor) en el índice o32
.(x>'0'and i-8-8-8-8)+8+8+8+8
es lo mismo que:x>'0'and i or 8+8+8+8
, (No seo
permite)[8+8+8+8,i][x>'0']
o[8<<9-7,i][x>'0']
, (No se]
permite)8+8+8+8
=32
(No se23
permite)Esto significa que el programa es esencialmente el mismo que:
fuente
C (gcc) , 318 bytes
Pruébalo en línea!
Este es un poco un viaje ...
1. Comprimir la lista
De alguna manera, tendremos que verificar si un entero dado es uno de los puntos de código especiales. Cualquier lista 'desnuda' será demasiado larga, por lo que usamos una lista de verificación. Esta lista tiene un valor distinto de cero en los puntos de código que están 'restringidos' y un valor cero en aquellos que no lo están.
Desafortunadamente, esto todavía toma 512 bytes solo para tener la lista (parece
0,0,7,7,0,7,0,...
). Esto se puede acortar con una máscara de bits.Para hacer uso de la máscara de bits, dividiremos cada byte en dos partes. Los primeros 3 bits elegirán una máscara de una matriz, mientras que los últimos 5 seleccionarán un bit de la matriz. No podemos reducir más la matriz porque los enteros de 32 bits utilizados por defecto no admiten más de 2 ^ 5 = 32 bits.
Usando una implementación de referencia escribí:
Pude generar los valores apropiados para esta nueva matriz usando el comando
echo "obase=16;ibase=2;$(./a.out | rev)" | bc
. Esto pasa la salida del programa anterior (./a.out
) alrev
programa, que invierte cada línea. Imprime esto junto con un encabezado en bc que establece la base de salida en 16 y la base de entrada en 2. Por lo tanto, bc convierte los dígitos binarios en una máscara de bits hexadecimal.La matriz resultante se puede ver en esta solución 'beta':
2. Hacer frente a las limitaciones.
Hay muchas restricciones que deben colocarse en el código anterior. Aquí paso por cada uno de ellos 1 por 1.
Esto también lo sienten otros lenguajes, sin asignación en C es muy difícil obtener valores garantizados en variables. La forma más fácil para nosotros es escribir nuestra función como un programa completo. Se
main
pasará el primer argumento deargc
cuyo valor será 1 si se llama sin argumentos.Las construcciones solamente bucle en C son
for
,while
ygoto
todos los cuales contienen caracteres restringidos. Esto nos deja con el uso de la recursividad. La función principal comenzará en 1 y recurrirá hasta que el argumento sea> 256, mientras tanto disminuirá internamente el argumento para usar un valor indexado a 0.Los valores en la matriz anterior son hexadecimales, incluso cuando se convierten a decimales, estos contienen algunos símbolos restringidos, sobre todo 123456 (AD puede estar en minúsculas). Para evitar esto, cada constante se XOR con otra de manera que se eliminen los caracteres restringidos. 1 se convierte en 9 ^ B, 2 se convierte en C ^ E, 3 se convierte en B ^ 8, 4 se convierte en 8 ^ C, 5 se convierte en 9 ^ C y 6 se convierte en 9 ^ F (hay más formas de hacerlo, elegí esta manera) .
Las restricciones no nos dejan muchas funciones de impresión.
putchar
yputs
ambos están restringidos, se vanprintf
. Lamentablemente, tenemos que enviarprintf
una cadena de formato, idealmente "% c". Todas esas cadenas tienen ese molesto signo de porcentaje que deseamos eliminar. Afortunadamente, asumimos una máquina little-endian (porque aparentemente eso es lo que usa TIO, y eso es bastante típico). Al construir el entero cuyos bytes en la memoria son 0x25 (%), 0x63 (c), 0x00 (\ 0), cualquier cosa (no importa, es después del terminador nulo) simplemente podemos pasar su direcciónprintf
y asumirá que es una cuerda Uno de esos números que funciona es -989830363 (0xC5006325). Esto es fácil de crear bajo las restricciones como 77707-989908070.Todavía existe el problema de que no podemos hacer referencia a ningún valor (porque no podemos asignarlos y porque no podemos usar &), por lo que tenemos que usar una matriz literal (int []) {...}. De hecho, también usamos esto para la matriz de máscara de bits anterior.
No podemos usar ']' o '}' para cerrar nuestras matrices o funciones. Afortunadamente, C tiene dígrafos y trigrafos que funcionan.
:>
se convertirá]
, mientras??>
se convertirá}
. Esto requiere que gcc tome el-trigraphs
cambio, ya que ignora los trigrafos de forma predeterminada (en violación del estándar).No podemos usar
&
para enmascarar bits de nuestro índice, ni podemos usar%
para llegar allí a la antigua usanza. Por lo tanto, confiamos en el comportamiento específico de implementación. En particular, desplazamos nuestros enteros de 32 bits lo suficientemente hacia la izquierda para perder bits, y luego hacia la derecha. Por ejemplo, para obtener los últimos 5 bits de nuestro número, primero lo desviamos a la izquierda 27 bits (se vanabcde00000...
) y luego lo volvemos a la derecha 27 bits (a la izquierda...00000abcde
).Necesitamos algunos valores literales más en todo el código; estos se toman de la respuesta JS de Arnauld, y agrego 27 (por la razón anterior) como
9+9+9
.3. Poniéndolo todo junto
Aquí está la descripción de la fuente con todos estos cambios juntos.
fuente
?:
extensión g ++ , abusar del módulo de cambio bit a bit 32, 273 bytes-trigraphs
opción en algunos compiladores de C, mientras que?:
requiere gcc que requiere-trigraphs
.brainfuck , 635 bytes
Pruébalo en línea!
En respuesta a ser finalmente derrotado por Javascript, he jugado lo que puedo de esto:
Se guardó 1 byte al tener 32 en la celda 0 e incrementar la celda 1 (la única razón por la que inicialmente lo tuve al revés fue por una solución rápida cuando OrjanJohansen señaló que no podía usar
]
)1 byte guardado al disminuir una tercera celda (inicialmente en 0) para generar
255
=-1
2 bytes guardados al imprimir espacios entre los caracteres 31 y 36 sin usar,
<>
sino que simplemente se detienen en 32 para imprimir desde la celda 0 cuando se incrementa de 31 a 33.brainfuck , 639 bytes
Pruébalo en línea!
Primero generamos el número 32. Luego, simplemente pasamos incrementando una celda y cambiando la impresión entre esa celda y la que contiene 32. El aumento constante de números es algo que Brainfuck hace bien.
Es bueno vencer Javascript con Brainfuck, ¡no sucede a menudo!
fuente
]
no es un personaje permitido. Aunque aún debería poder arreglar eso y vencer al Javascript. :)]
no está permitido, creo que mi respuesta BF es probablemente óptima ahora.JavaScript (SpiderMonkey) ,
1918159814871431 bytesGuardado 56 bytes gracias a @ user202729
Pruébalo en línea!
¿Cómo?
El hecho de que
=
no esté permitido es un show-killer en JS. No podemos hacer ninguna asignación variable, y tampoco podemos usar ninguna función de flecha.+
-
/
|
^
<<
>>
8<<98
8<<2
fuente
32
como8<<9-7
guarda un byte para cada uno32
.32 = 8<<98
Haskell,
623617614594360342 bytesEditar: -234 bytes gracias a @Lynn al encontrar un patrón de codificación como una cadena. -18 bytes gracias a @ Ørjan Johansen.
Pruébalo en línea!
Cómo funciona
fuente
(id:pure(\_->8+8+8+8))
poruntil((||" XXXX XXX XXXX XXXXX XXX XXX X XXXXXX X X X X X X X X X XX X X X X XXX X XX X X X XXXX X X X X X X X X X X X XXXX XXX XXXX XXXXX XXXX XXX XXXXX X"!!i<'X').(<1))pred 1
y guardar un montón de bytes.filter
lugar deuntil
ramificar (ycycle
para evitar un extra++pure(...)
).Brain-Flak -r,
41904188 bytesPruébalo en línea!
Este es un poco difícil para Brain-flak ya que no podemos usar
]
o}
. Significa que los únicos caracteres útiles son<>()
.Aquí hay un programa de Haskell que me ayudó a escribir esto
Simplemente cuenta saltando donde los espacios deben estar y empujándolos individualmente.
fuente
{}
una búsqueda por computadora, en realidad podría encontrar lo óptimo en un tiempo finito.JavaScript (SpiderMonkey) ,
1001919789441 bytesPruébalo en línea!
¡Finalmente vence a BF!
Idea general
Convertir cada carácter de la cadena de cadena larga a su índice o 32, depende del valor.
Array.prototype.map
? Cómo obtener una matrizFuerza bruta para ver qué objetos son accesibles accediendo a las propiedades del objeto (porque
]
no está permitido, por lo que solo se puede acceder a las propiedades con un nombre que coincida con un identificador).RegExp.prototype.exec
devuelve un objeto tipo matriz cuando hay una coincidencia. Cuando no se proporciona ningún argumento, el argumento predeterminado esundefined
, por lo que/u/.exec()
coincide y devuelve una matriz.Obtenga 2 valores distintos arbitrarios en 2 caracteres diferentes
Queremos tener
(x,y)=>x=='0'?32:y
, pero no podemos usar=
.En cambio, vamos a hacer
Podemos
map
pasar la cadena sobre alguna función, pero=>
no está permitido, por lo que solo se pueden usar algunas funciones. Puede tenerthis
argumentos vinculados y algunos vinculados (por lo que tiene la forma(x,y,z)=>pre_filled_function.call(pre,filled,args,etc,x,y,z)
)Después de considerar una lista de funciones (
repeat exec bind create map indexOf replace fill find reduce filter findIndex call bind apply
), decido que se utilizarán las siguientes funciones (después de considerar todas las demás combinaciones)repeat
: número -> diferentes cadenas.find
: thisArg -> primer elemento en la coincidencia de matriz.La idea general sería:
donde
somefunction
considera elthis
argumento (x
) y el primer argumento (elem1
oelem2
) y devuelve si coincide.La última función de flecha se reescribe en
[].find.bind([elem1,elem2],somefunction)
.Array literal
Podemos usar regex exec para obtener una matriz, y
fill
con diferentes valores. Por ejemplo,/()/.exec()
devuelve una matriz de longitud 2, luego podemos llenarla según lo necesitemos.¿
somefunction
Qué necesitamos?Necesitamos uno que devuelva un valor verdadero / falso depende de
this
(que es 1 de 2 funciones que vamos a devolver) y el primer argumento (debe ser una cadena o matriz).Para eso, utilicé
indexOf
: devuelve un valor falso si el primer argumento es un prefijo delthis
argumento.Representar los literales de función
fuente
TI-Basic (serie 83), 578 bytes
TI-Basic tiene su propia "página de códigos" muy especial con opciones de diseño extrañas como mover el carácter de espacio a 0x29 para que 0x20 pueda ser el
randM(
comando.Es complicado descubrir cómo hacer que TI-Basic produzca el tipo correcto de objeto. Las cadenas no funcionarían por varias razones: no hay forma de hacer referencia a un token sin usar el token, y tampoco se nos permite el
"
personaje. No podemos simplemente escribir una lista, porque{
y}
están prohibidos. Se nos permiten los caracteres[
y]
para las matrices, pero una matriz de 1 por 256 no funciona, ya que las matrices se permiten como máximo en 99 filas y columnas. No podemos utilizar→
para asignar a las variables, y no podemos llegar a las variables de listaʟ
oL₁
a travésL₆
de todos modos.Entonces, aquí, escribimos una fórmula lógica complicada con desigualdades que dice cuándo un personaje es uno de los que queremos generar. Luego usamos el
seq(
comando para generar una lista1
en esas posiciones y en0
otros lugares. A partir de ahí, otroseq(
comando y algo de aritmética termina el trabajo.Esa fue la parte emocionante; el resto es jugar al golf las constantes y probablemente no lo he hecho tanto como sea posible. Uno de los trucos que uso es que, por defecto,
Xmax
es 10,XFact
es 4 yΔTbl
es 1.fuente
(
está prohibido.[A](I,J)
y, por lo que entiendo, desea hacer algo como[A](int(I/99),I-99int(I/99))
leer todos los elementos de la matriz[A]
; tampoco podemos hacerlo. (Por cierto,)
también está prohibido. Afortunadamente, no tenemos que cerrar los paréntesis finales, pero limita cómo podemos usar muchos comandos.)Brain-Flak -r, 3894 bytes
Pruébalo en línea!
Escribí un programa para generar el programa Brain-Flak óptimo para cualquier salida. Asumir que:
<>
no se usa, entonces esta solución es óptima.
fuente
Python 2 ,
162157 bytesAdvertencia : caracteres no imprimibles por delante!
Pruébalo en línea!
Basado en la respuesta existente de TFeld , pero con algunos cambios:
0xe0/7
lugar de8+8+8+8
representar 32. ( un programa para encontrar la representación más corta de un número )bytearray
para representar el gran literal.A
bytearray
es similar a unstr
que es iterable, sin embargo, iterar da enteros, no caracteres. Podemos usarlo para codificar un literal de base N yreduce(lambda x,y: x*N+y, my_bytearray)
decodificarlo.Debido a que los archivos Python 2 no tienen una codificación por defecto, solo se pueden usar caracteres en ASCII (0..127). El byte nulo, las nuevas líneas, las barras diagonales inversas y las comillas toman 1 byte más.
Además, no es posible usar todas las bases.
Escribí un programa para encontrar la representación más corta de
n
, dadas esas restricciones.fuente