Actualizaciones: límite de tiempo eliminado. Debe poder describir la salida; consulte la nueva regla.
Un pangrama es una oración que usa todas las letras del alfabeto al menos una vez, como:
Un pangrama perfecto usa cada letra exactamente una vez.
Considere escribir un programa que sea un pangrama perfecto, utilizando los 95 caracteres ASCII imprimibles (códigos hexadecimales 20 a 7E) como alfabeto:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Dicho programa debe contener exactamente 95 caracteres, y cada carácter ASCII imprimible debe aparecer exactamente una vez, pero en cualquier orden. (Por lo tanto, hay 95! = 1.03 × 10 148 posibilidades.)
Su tarea es escribir este programa de manera que el número de caracteres ASCII imprimibles impresos en stdout sea lo más alto posible (es decir, prolífico).
Su puntaje es el número de caracteres ASCII imprimibles que genera su programa (la cantidad total , no la cantidad distinta : AABC
puntajes 4 mientras que ABC
puntajes 3) . El puntaje más alto gana.
Detalles
- El resultado puede contener cualquier carácter (incluidos los duplicados), pero solo las instancias de los 95 caracteres ASCII imprimibles cuentan para su puntaje.
- Puede usar este JSFiddle para contar el número de caracteres ASCII imprimibles en cualquier cadena.
- Si su idioma no tiene stdout, use la alternativa más apropiada.
- Su programa ...
- debe tener un tiempo de ejecución finito (se ha eliminado el límite de tiempo)
- debe tener salida finita
- puede contener comentarios
- debe compilarse y ejecutarse sin errores (no detectados)
- no debe solicitar ni requerir entrada
- debe ser invariante en el tiempo y determinista
- no debe usar bibliotecas externas
- no debe requerir una conexión de red
- no debe hacer uso de archivos externos
- (puede usar el archivo del programa en sí mismo siempre que cambiar el nombre del archivo no altere el comportamiento del programa)
- Si esta tarea es imposible es algún lenguaje que es demasiado malo.
- Debe dar su resultado exacto o describirlo con precisión si es demasiado grande para caber en una publicación . En realidad, no tiene que ejecutar su programa. Siempre que se ejecute en un tiempo finito en una computadora con una cantidad ilimitada de memoria, es válida.
Ejemplo
Este programa simplista de Python 2 es una posible solución:
print 9876543210#!"$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjklmoqsuvwxyz{|}~
Salida 9876543210
que contiene 10 caracteres ASCII imprimibles, obteniendo así 10.
fuente
a
seis billones de veces, donde ni siquiera es posible obtener un límite superior preciso en Número de letras. De todos modos, todavía estoy orgulloso de mi 95, incluso si es un poco pequeño. El tamaño no lo es todo, ya sabes.Respuestas:
GolfScript, más de 2 caracteres ↑↑↑ (9871 ↑↑ 2)
Imprime un número entero. Aproveche el tamaño de registro de CPU ilimitado (que determina la longitud máxima de la cadena en Ruby), la memoria y el tiempo de ejecución. El salto de línea es únicamente para facilitar la lectura.
El código
El marcador
Defina b = 9871 ↑↑ 2 (vea la notación de flecha hacia arriba de Knuth ).
.? ejecuta f: x ↦ x ↑ x .
El bloque interno ejecuta g: x ↦ f x (x) .
Dado que f (x) = x ↑ x = x ↑↑ 2 , f 2 (x) = (x ↑ x) ↑ (x ↑ x)> x ↑ x ↑ x = x ↑↑ 3 ,
f 3 (x) = ((x ↑ x) ↑ (x ↑ x)) ↑ ((x ↑ x) ↑ (x ↑ x))> (x ↑ x ↑ x) ↑ (x ↑ x ↑ x)> x ↑ x ↑ x ↑ x = x ↑↑ 4 y así sucesivamente, tenemos
g (x)> x ↑↑ (x + 1)> x ↑↑ x .
El bloque externo ejecuta h: x ↦ g b (x) .
Dado que g (x) = x ↑↑ x = x ↑↑↑ 2 , g 2 (x) = (x ↑↑ x) ↑↑ (x ↑↑ x)> x ↑↑ x ↑↑ x = x ↑↑↑ 3 ,
g 3 (x) = ((x ↑↑ x) ↑↑ (x ↑↑ x)) ↑↑ ((x ↑↑ x) ↑↑ (x ↑↑ x))> (x ↑↑ x ↑↑ x) ↑ (x ↑↑ x ↑↑ x)> x ↑↑ x ↑↑ x ↑↑ x = x ↑↑↑ 4 y así sucesivamente, tenemos h (x)> x ↑↑↑ (b + 1) .
Comenzamos con el número entero 2 en la pila, por lo que el código calcula h (2)> 2 ↑↑↑ (b + 1).
El puntaje es el número de dígitos decimales de h (2) , que es log (h (2)) + 1> log (2 ↑↑↑ (b + 1))> 2 ↑↑↑ b .
Por lo tanto, la puntuación es mayor que 2 ↑↑↑ (9871 ↑↑ 2) .
2 ↑↑↑ n crece a un ritmo ridículo como n se hace más grande. 2 ↑↑↑ 4: = 2 ↑↑ 2 ↑↑ 2 ↑↑ 2 = 2 ↑↑ 2 ↑↑ 4 = 2 ↑↑ 65536 , que es una torre de poder asociativa derecha de 65536 copias de 2 :
Del mismo modo, 2 ↑↑↑ 5: = 2 ↑↑ (2 ↑↑↑ 4) , que es una torre de poder de 2 ↑↑↑ 4 copias de 2 .
Ahora, el puntaje no es 2 ↑↑↑ 4 o 2 ↑↑↑ 5 , es mayor que 2 ↑↑↑ b , donde b> 2 × 10 39 428 . Ese es un gran número ...
fuente
in `*': bignum too big to convert into `long' (RangeError)
.Perl, 70 * 18446744073709551615 * 10 ^ 987654320
Salida:
repetido 18446744073709551615 * 10 ^ 987654320 veces.
$[
es por defecto0
, entonces~$[
es equivalente a18446744073709551615
.Como nota al margen, me quedé sin memoria tratando de crear el número
10^987654320
.Respuesta anterior (7703703696):
Salida es:
repetido 98765432 veces.
Nota: ejecute todas las muestras con
perl -Mbignum -E
fuente
perl -E'say qw{m}x(9876543210*ord$")'
Bash + coreutils, 151,888,888,888,888,905 (1.5 * 10 ^ 17)
Emite números enteros de 1 a 9x10 15 , uno por línea. Toma mucho tiempo.
¿Por qué
9E15
? Resulta que GNUseq
parece usar flotantes de 64 bits (doble) internamente. El número entero más grande que podemos representar con este tipo, antes de que el incremento en uno deje de funcionar debido a la falta de precisión, es 2 53 o 9007199254740992. Lo más cercano que podemos llegar a esto con notación exponencial es 9E15 o 9000000000000000.Para calcular el puntaje, estoy usando la suma de todos los números con un número dado de dígitos y agregando 9E15, porque hay una nueva línea entre cada número:
Podría canalizar esta salida por
od
un orden adicional de magnitud más o menos, pero eso hace que el cálculo de la puntuación sea mucho más difícil.Respuesta al cambio previo a la regla:
Bash + coreutils, 18,926,221,380
Salidas 1 a 1592346780. En mi macbook de mediados de 2012 (que no está tan lejos del punto de referencia vinculado), esto toma alrededor de 9m45s.
No pude resistirme a optimizarlo un poco más, aunque probablemente no tenga sentido.
Salida:
fuente
seq 9876543210;
?9876543210
. Es posible que desee leer la nueva última regla.GolfScript, ≈ 3 * 10 ^ (2 * 10 ^ 7) es decir, ≈ 3x10 20000000
Cómo funciona
Aquí
X
está el recuento de caracteres (longitud) de la representación de cadena de la matriz[0, 1, 2..,(87^9654321) - 1]
que será como[0 1 2 3 4 ... (87^9654321) - 1]
Estoy tratando de calcularX
aquí para encontrar mi puntaje.(87^9654321) - 1
es aproximadamente10^(10^7.272415829713899)
con18724742
dígitos decimales.X
es más o menos3*10^(2*10^7)
asíX*X
que también es lo mismo. Tenga en cuenta que estos valores están en un lado muy inferior ya que debido a las limitaciones de cálculo de (incluso) wolframa , no pude calcularsum (floor(log10(x)) + 1) for x = 1 to (87^9654321 - 1)
cuál es el verdadero valor deX
fuente
87 9654321?
es justoInfinity
.2**(2**64)-1
para Ruby de 64 bits.MATLAB, 95
Código
Salida
La salida contiene todos los caracteres ASCII especificados, cada uno exactamente una vez y en orden.
fuente
Ruby, 89
Salida:
Contiene todos los caracteres ASCII, salvo,
p
,,
%
,q
,{
, y}
.fuente
GolfScript, 93
Salida:
Contiene todos los caracteres ASCII excepto
"
y'
.fuente
"
ni'
tampoco.#
de su posición actual y añádalo#"'
hasta el final. Sin embargo, la puntuación se reducirá en uno.Golfscript - 27 * 2 6543 9870
Esta es mi primera presentación Golfscript! :)
Explicación:
La salida es una carga de listas de números. Considere el siguiente código:
Con
12,
esto produce la siguiente matriz:El backtick lo convierte en una cadena y lo pasa al bloque
{.+}
. Esto duplica la cadena y luego concatena las dos, produciendo:El
1*
le dice al intérprete que ejecute el bloque anterior una vez (2 1 = 2).Entonces, basado en eso:
Emite la salida de
12,`
2 n veces.fuente