Es muy simple: su programa o función debe generar el siguiente texto:
Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look.
Letra pequeña
Puede escribir un programa o función , que devuelve el resultado como una cadena o imprimiéndolo en STDOUT (o la alternativa más cercana). Opcionalmente, puede incluir una nueva línea final en la salida.
Tanteo
El número de bytes en su código multiplicado por el número de bytes únicos en su código
La puntuación más baja gana.
Por ejemplo, una respuesta mental o un espacio en blanco tendría una gran ventaja aquí, ya que el multiplicador sería muy bajo (8 y 3 respectivamente). Sin embargo, en general, escribir programas en esos idiomas produce un código mucho más largo que puede negar esa ventaja.
Las lagunas estándar que ya no son divertidas están prohibidas .
code-challenge
string
kolmogorov-complexity
durron597
fuente
fuente
bytecount~Log(X,unique)
, con X alguna constante para este problema. Por lo tanto, único ^ bytecount ~ constante. Calcular este puntaje (log2) dapython2_mbomb007 728, python2_carpetpython 744, ruby 756, Fish 825, Insomnia 1148, cjam 1277, whitespace 1484, brainfuck 3546
. Entonces, a excepción de la respuesta brainfuck, es relativamente constante ...Respuestas:
Insomnio , 575 bytes * 4 = 2300
Utiliza 4 caracteres
dye=
.Solución 1b (no publicada): 783 bytes * 3 = 2349
Solo usa 3 caracteres
ey=
.Solución 1: 826 bytes * 3 = 2478
Sólo utiliza 3 caracteres:
yo~
. Se utiliza un programa para generar esto.Actualmente, todos los programas solo usan las instrucciones 0, 1, 2, 6. En otras palabras, manipulan los bits en un solo byte e imprimen el resultado.
fuente
CJAM,
266281456 bytes *14127 único =372433723192Pruébalo en línea.
Explicación
La estrategia que he usado es tratar cada carácter de la cadena como un dígito de base 123 y codificarlo como un número decimal en el programa. Luego, el programa convierte ese número de nuevo a la base 123 y asigna cada dígito de base 123 a un carácter. Debido a que es difícil explicar por qué el programa está en su estado actual, explicaré cada versión del mismo.
Así es como se veía el final del programa en la primera versión:
Esto implementa la estrategia de la manera más directa posible. El número, codificado normalmente en la base 10, se convierte de nuevo a la base 123 y cada dígito de la base 123 se asigna a un carácter. Pero esto usa 4 caracteres únicos que no son dígitos, y poder deshacerse de cualquiera de ellos probablemente valdría la pena el tamaño debido a tener que usar un código menos directo.
En primer lugar, me di cuenta que podía deshacerse de las
b
y los:
operadores mediante la creación de ellos en tiempo de ejecución como sus valores de caracteres ASCII convierten de nuevo a un personaje (con la ya presentec
operador) y evaluarlas con el~
operador. Resultó ser un poco complicado hacer esto con el:
operador, ya que debe analizarse junto con el siguientec
operador. Resolví esto produciendo los caracteres:
yc
luego produciendo y evaluando el carácter+
, que concatena los dos caracteres anteriores en la cadena:c
que luego se puede evaluar adecuadamente.En segundo lugar, me di cuenta de que el
~
operador que acabo de presentar tenía una nueva variante sobrecargada útil: cuando se le da un número, produce el complemento bit a bit. Al usar esto dos veces seguidas después de un número, podría introducir una ruptura de token en la fuente sin efecto computacional resultante, lo que me permite reemplazar los espacios utilizados para separar los números~~
.El resultado final es 15 bytes más de código al final, pero este costo se ve ampliamente compensado por el beneficio de eliminar 2 caracteres únicos de 14. Aquí hay una comparación del final de la primera versión con el final de la segunda versión:
Usar menos de los 2 operadores que estaba usando sería imposible, pero aún quería menos personajes únicos. Entonces, el siguiente paso fue eliminar los dígitos. Al cambiar la codificación del número de modo que cada dígito decimal fuera realmente un dígito de base 5, podría eliminar los dígitos 6-9. Antes de eliminar algo del final del programa, se veía así:
Como se mencionó anteriormente, eliminar el espacio es fácil. Pero el
b
,:
yc
no sería tan fácil, ya que sus códigos de caracteres son98
,58
y99
, respectivamente. Todos ellos contenían dígitos marcados para su eliminación, así que tuve que encontrar formas de derivarlos todos. Y los únicos operadores numéricos útiles con valores de caracteres que no contienen 5-9 fueron decrementar, incrementar, multiplicar y sumar.Para
98
, inicialmente usé100~~40c~40c~
, que disminuye100
dos veces. Pero luego me di cuenta de que podía hacer otro uso más del~
operador, ya que el complemento bit a bit me permite obtener números negativos que, cuando se agregan, me permiten emular la resta. Así que luego se usa100~~1~43c~
, lo cual se suma100
y-2
y es de 2 bytes más pequeña. Para58
, usé44~~14~~43c~
, que agrega44
y14
. Y para99
, usé100~~40c~
, qué decrementos100
.El resultado final es bastante grande y ofuscado, pero el costo del número significativamente mayor y el código de procesamiento fueron ligeramente superados por el gran beneficio de eliminar 5 caracteres únicos de 12. Aquí hay una comparación del final final del programa antes de las eliminaciones y después eliminaciones:
fuente
98
,58
y99
) todavía están fuera de rango. E incrementar la base solo disminuye el tamaño total del programa en un 8-10%, lo que no es suficiente para compensar el puntaje del 10-15% obtenido al tener un nuevo personaje único. Volver a incluir alb
operador de manera similar no vale la pena.floor(log_b(x)+1)
y contendráb
diferentes símbolos. Entonces el puntaje esb*floor(log_b(x)+1)
. x es un número grande dado, y si trazas esto para b, encontrarás que el mínimo es más o menos b = 3. Es decir, la longitud se reduce ligeramente a medida que usa bases más altas (log), pero el tamaño del juego de caracteres aumenta linealmente, por lo que no vale la pena. Hizo un programa simple de espacios en blanco, pero solo obtiene un puntaje de 4134.Los espacios en blanco,
1157937 bytes * 3 = único34712811Por solicitud popular (?), Estoy publicando mi solución de espacios en blanco.
Para reducir el código necesario, codifiqué toda la cadena como un número binario (7 bits para cada byte). Un bucle simple extrae los caracteres y los imprime.
Código fuente en filebin.ca.
NOTA: Las especificaciones permiten números enteros grandes arbitrarios , pero el intérprete de Haskell en la página oficial está limitado a 20 bits. Utilice, por ejemplo, este intérprete de rubíes en github / hostilefork / whitespaces.
El script ruby para crear el programa de espacios en blanco (l = WHITESPACE, t = TAB, u = NEWLINE, todo después de // ignorado, escribe en un archivo
prog.h
):Por ejemplo, el programa de espacios en blanco en forma legible por humanos. Vea a continuación un script simple para convertirlo en un programa de espacio en blanco real.
Básicamente, la cadena de salida es un entero largo, y debe reducir su puntaje.
Por lo tanto, busqué un idioma con solo 0/1, pero no encontré ninguno, y luego recordé que había espacios en blanco y lo probé. En el espacio en blanco, puede ingresar números binarios con 0 y 1 directamente.
Código antiguo, peor puntaje pero más interesante
Código antiguo en filebin .
El script ruby que utilicé para crear el programa (l = WHITESPACE, t = TAB, u = NEWLINE, todo después de
//
ignorado, escribe en un archivoprog.h
):Por ejemplo, el programa de espacios en blanco en forma legible por humanos. Vea a continuación un script simple para convertirlo en un programa de espacio en blanco real.
Este programa de espacios en blanco es bastante simple, pero hay tres optimizaciones de golf:
lul
para clonar la pila cuando hay un personaje duplicadoltl
para clonar la entrada n-ésima de la pila si es más corta que presionar el personaje directamenteUn simple script de ruby para convertir mi código de espacio en blanco legible por humanos en un programa de espacio en blanco real (lee un archivo
prog.h
y escribe en un archivoprog.ws
):fuente
Rubí 144 Bytes * 39 Único = 5616
A veces lo más simple es lo mejor.
fuente
Brainfuck, 1264 bytes * 7 único = 8848
Sí, es un puntaje terrible.
fuente
+.
estar seguro de que sería más pequeño.+
y.
obtengo 15018 * 2 =30,036
.> <> (Pez) - 578 bytes * 8 único = 4624
Mi puntaje no es tan competitivo como esperaba, pero pensé que esta solución aún era lo suficientemente interesante como para publicar.
Explicación
La primera sección del código es una cadena larga de los dígitos 0-4 que representa una representación de base 5 de 3 dígitos para cada carácter en la cadena. El código restante aprovecha el
p
operador en Fish que le permite editar el código fuente del programa mientras el programa se está ejecutando. Al usar ese operador, pude generar el código Fish necesario para convertir los caracteres de base 5 de nuevo a base 10 y generarlos, y luego volver a colocar ese código en el código fuente al comienzo del archivo antes de que el intérprete llegara al final de la línea y envuelto. Cuando el intérprete llega al final de la línea, el código se ha modificado para que se vea así:Cuando el código se envuelve y golpea al
v
operador, baja a la segunda línea, golpea al>
operador y procede al bucle, convirtiendo cada vez la codificación de base 5 de nuevo en un valor ascii de base 10 y luego emitiendo ese valor. Cuando no haya más valores en la pila, el?
operador saltará al;
y el programa finalizará.fuente
7 , 273 bytes × 7 bytes únicos = 1911, sin competencia (desafío de fechas posteriores al idioma)
Pruébalo en línea!
Desafortunadamente, este es un viejo desafío, lo que significa que no puedo ganar con uno de mis idiomas más nuevos. Sin embargo, el lenguaje fue creado sin conocimiento del desafío (simplemente me topé al azar en "preguntas relacionadas"), pero resultó ser un ajuste perfecto.
7 programas en PPCG normalmente se envían en formato empaquetado, empaquetando ocho comandos en tres bytes (el lenguaje tiene doce comandos, pero solo ocho pueden aparecer en un archivo fuente, lo que significa que tres bits son suficientes). Sin embargo, el lenguaje también admite un formato octal en el que cada comando se escribe como un dígito ASCII, y eso es lo que he usado aquí, lo que significa que solo se usan siete bytes distintos (el
6
comando no es necesario en un programa que solo imprime Una cadena simple).El programa es muy simple; Consiste en dos elementos de la pila, una cadena larga que se imprime textualmente, una
7
para separar los elementos (desafortunadamente inevitable), y403
que es una forma simple de imprimir una cadena constante en 7 (40
escapa al segundo elemento de la pila, mientras lo mueve a la parte superior de la pila, luego la3
imprime y descarta el primer elemento anterior de la pila, es decir, el403
propio).Entonces, ¿cómo obtuve la cadena tan corta como 269 bytes? 7 admite múltiples formatos de E / S, y uno de sus formatos es US-TTY , un conjunto de caracteres (específicamente, una variante de Baudot) que fue ampliamente utilizado antes de que se inventara ASCII. (Al
5
comienzo del segundo elemento de la pila, es decir, el inicio del programa, especifica la codificación de la cadena; el resto es el contenido de la cadena en sí). Es un conjunto de caracteres de cinco bits y los comandos0
para5
se puede almacenar de forma segura en cadenas sin escapar constantemente (de modo que al escapar una vez reproducirá exactamente el original), por lo que el lenguaje usa pares de comandos (36 opciones) para codificar caracteres de US-TTY (32 opciones, con 4 utilizadas para directivas para el intérprete 7). Por supuesto, hay más de 32 caracteres únicos que las personas pueden querer mostrar (y aparecen más de 32 caracteres en la cadena), por lo que dos de los caracteres son "códigos de desplazamiento" que cambian entre cuatro conjuntos de caracteres (letras mayúsculas, letras minúsculas , figuras y una "extensión de figuras" definida por el usuario que 7 utiliza para los caracteres ASCII restantes que no están en los otros conjuntos de caracteres, sin embargo, todos los caracteres de la cadena son "nativos" en US-TTY, por lo que los detalles de la extensión no importaba). Aquí'Cuento diez cambios agregados a 124 caracteres de entrada, una proporción bastante insignificante. Como tal, la capacidad de usar solo un poco más de dos bytes de entrada por carácter de entrada, multiplicado por 7 bytes únicos, significa que la puntuación en este desafío es increíblemente buena. (Supongo que un lenguaje diseñado específicamente para este desafío usaría algún tipo de compresión de cadena, en lugar de un conjunto de caracteres preexistente, pero a pesar de que Baudot y US-TTY no fueron diseñados para jugar al golf, todavía son bastante concisos .)
fuente
Python 2,
163147145143 bytes *353635 único =5705529252205005Probablemente sea tan bueno como lo voy a conseguir.
Ediciones:
.capitalize()
a favor de usarE
.'
lugar de comillas de escape de comillas invertidas.+
y algunos espacios para usar comas en laprint
declaración.fuente
Python 2,
14508 11700 11088 10164 9486 9746 7860145 bytes * 36 único = 5220Vi el título y pensé que este era un desafío interesante para Python. Estas son mis notas mientras abordaba este problema.
Mi primer intento redujo los únicos a 31:
Pensé que podría hacerlo mejor. Mediante el uso
map
, los únicos se redujeron a 26:Alrededor de este tiempo, noté en el texto de la pregunta que el puntaje era
uniques * bytes
, ¡no solo únicos! Eso significaba que mis puntajes para lo anterior eran 14508 y 11700. No muy competitivo. Así que ahora reduzco los bytes almacenando el texto como una cadena hexadecimal:El tamaño se redujo pero más personajes únicos. Pero si usé una cadena decimal de 2 dígitos con un desplazamiento de 32:
Tiene el mismo número de bytes pero guarda 3 únicos.
Trama un nuevo plan. Si empaque un entero largo de Python con caracteres de 7 bits, podría extraer cada uno cambiando:
Bueno, eso redujo el puntaje a 9486. Un experimento interesante, pero no lo suficientemente bueno. Ahora, ¿qué pasa si me deshago de los nombres de las funciones y confío en el formato de cadena?
Ahora tengo solo 22 únicos, pero el puntaje no mejora.
Ok, ¿qué pasa si tomé el camino obvio y solo imprimí la cadena:
Puntuación de 7860. Debería haber hecho esto primero. Pero no habría aprendido tanto.
Supongo que podría reducir los únicos en 26 si produje dinámicamente las partes mayúsculas, así que:
Creo que Python no será mucho mejor que 5220. Sin embargo, la tarea de minimizar los caracteres únicos en Python fue instructiva.
Actualización: mbomb007 tiene una mejor solución de Python con un puntaje de 5005. Buen trabajo.
fuente
> <> (Pez) - 138 Bytes * 65 Único = 8970
La ruta simple, es decir, Hello World:
Bueno, para mi primera incursión en> <> esto fue un desafío. Creo que veo algunas mejoras, pero fue divertido aprenderlo :)
O para hacerlo demasiado complicado: 1567 bytes * 27 Único = 42309
fuente
r
pila invirtiendo :) También puede mover la finalo
al espacio en blanco al comienzo de la segunda línea.f f + 2 + o
tantas veces en el complicado?05AB1E , 380 bytes * 11 caracteres = puntaje 4180
Esto es potencialmente no competitivo
Pruébalo en línea!
Empuja la representación de base 5 de caracteres ASCII unidos.
Se divide en piezas de 3, se convierte de nuevo a decimal.
Convierte entero ASCII de nuevo a carácter.
Se une nuevamente.
fuente
Perl 6, 139 bytes * 36 único = 5004
fuente
Java 8, 141 bytes * 64 caracteres únicos = 9.024
141 bytes, 64 caracteres únicos. Los enfoques distintos al simple "devolver la cadena" aumentan el recuento de bytes sin guardar mucho en los caracteres utilizados.
fuente
Perl 5 , 137 bytes * 35 único = 4795
Pruébalo en línea!
fuente
Tcl , 345 bytes, 345 x 13 = 4485
Pruébalo en línea!
Tcl , 337 bytes, 337 x 15 = 5055
Pruébalo en línea!
Tcl , 329 bytes, 329 x 16 = 5264
Pruébalo en línea!
Tcl , 333 bytes, 333 x 16 = 5328
Pruébalo en línea!
Tcl , 148 bytes, 148 x 37 = 5476
Pruébalo en línea!
Tcl , 277 bytes, 277 x 21 = 5817
Pruébalo en línea!
Tcl , 371 bytes, 371 x 16 = 5936
Pruébalo en línea!
Tcl , 401 bytes, 401 x 16 = 6416
Pruébalo en línea!
Tcl , 403 bytes, 403 x 16 = 6448
Pruébalo en línea!
Tcl , 433 bytes, 433 x 15 = 6495
Pruébalo en línea!
Tcl , 473 bytes, 473 x 14 = 6622
Pruébalo en línea!
Tcl , 133 bytes, 133 x 60 = 7980
Pruébalo en línea!
fuente