Estoy interesado en ver programas que no soliciten ninguna entrada, imprima una copia en Google de alguna cadena que no esté vacía, nada menos, nada más, y luego pare. Un googol se define como 10 ^ 100, es decir, 1 seguido de cien 0 en decimal.
Salida de ejemplo:
111111111111111111111111111111111111111111111111111111111111111111111111...
o
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
...
La cadena también puede estar completamente compuesta de espacios en blanco o símbolos especiales. La única excepción a las copias idénticas de una cadena fija es si su idioma decora la salida de alguna manera que no se puede evitar, pero que se puede deshacer trivialmente en un script de envoltura, como anteponer un número de línea a cada línea. No es necesario proporcionar el script de envoltura en tales casos.
Puede suponer que su computadora nunca se quedará sin tiempo, pero aparte de eso, su programa debe tener una demanda razonable de recursos. Además, debe respetar las restricciones que plantea el lenguaje de programación que elija, por ejemplo, no puede exceder un valor máximo permitido para sus tipos enteros, y en ningún momento se deben necesitar más de 4 GB de memoria.
En otras palabras, el programa debería poder probarse en principio ejecutándolo en su computadora. Pero debido a la extensión de este número, se espera que demuestre que el número de copias de la cadena que genera es exactamente 10 ^ 100 y que el programa se detiene después. La detención puede ser salir o detenerse o incluso terminar debido a un error, pero si es así, el error no debe producir ninguna salida que no pueda separarse fácilmente de la salida del programa.
Este es el código de golf , por lo que gana la solución con la menor cantidad de bytes.
Solución de ejemplo (C, sin golf, 3768 bytes)
#include <stdio.h>
int main() {
int a00, a01, a02, a03, ..., a99;
for(a00 = 0; a00 < 10; a00++)
for(a01 = 0; a01 < 10; a01++)
for(a02 = 0; a02 < 10; a02++)
for(a03 = 0; a03 < 10; a03++)
...
for(a99 = 0; a99 < 10; a99++)
puts("1");
return 0;
}
Respuestas:
Jalea ,
64 bytesEste es un enlace niládico (función sin argumentos) que imprime 10 200 copias de la cadena 100 , lo que significa que imprime 10 100 copias de la cadena que consta de 10 100 copias de la cadena 100 .
Pruébalo en línea!
Tenga en cuenta que el intérprete en línea corta la salida a 100 KB por razones prácticas. El código también funciona como un programa completo, pero debido a la salida implícita, ese programa imprime demasiadas copias.
Cómo funciona
fuente
10^100
copias de la salida original (10^100
copias de una cadena) está yendo un poco lejos, incluso para dos bytes completos. ¿Ya enviaste esto al desafío "puntaje de salida / duración del programa, mayores victorias"?Fuzzy Octo Guacamole,
13121110 bytesExplicación:
Muestra de la cabra impresa:
fuente
Python, 28 bytes
-1 byte gracias a Jonathan Allan!
Python 2:
Python 3 (30 bytes):
fuente
i=10**100
nueva líneawhile i:print();i-=1
guarda un byte. Ahorre dos más utilizando Python 2 conwhile i:print;i-=1
Haskell, 28 bytes
Concatena 10 ^ 100 copias de la cadena
"1"
y la imprime.fuente
s=[1..10^100]>>"1"
un formato de respuesta permitido?s
de su ejemplo no se imprime, o si usa REPL rodea el1
con"
. Supongo queputStr$[1..10^100]>>"1"
sin esomain=
estaría bien, pero quería enviar un programa completo.Brainfuck
48018811410698 bytesSolo porque hay que hacerlo.
Asume celdas de 8 bits con envoltura. Imprime 250 255 bytes NUL, que es 10 100 veces 10 155 veces 25 255 bytes NUL.
Explicación:
>>>>>>
es necesario para dejar un poco de espacio de trabajo-
produce 255.[[->>>+<<<]------>>>-]
convierte esto en 255 copias del valor 250, dando una cinta que se parece a:<<<[<<<]+
mueve el puntero de datos hacia atrás y termina los datos iniciales:Luego viene el ciclo:
[+...-]
inicialmente establece el 1 en un 2, que se vuelve a establecer en 1 al final del ciclo. El ciclo termina cuando el cuerpo del ciclo ya está configurado de 2 a 1.Ahora, los números 2 250 250 250 ... 250 representan un contador, en la base 250, con cada número uno mayor que el dígito que representa.
[>>>]<<<
se mueve todo hacia la derecha. Como cada dígito está representado por un número distinto de cero, esto es trivial.->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-
disminuye el contador en 1. Comenzando con el último dígito: el dígito se reduce. Si sigue siendo positivo, hemos terminado. Si se pone a cero, ajústelo a 250 y continúe con el dígito anterior.[<<<].>>>
mueve el puntero hacia atrás antes del dígito más a la izquierda, y este es un buen momento para imprimir un byte NUL. Luego vuelva a colocar exactamente el dígito más a la izquierda, para ver si hemos terminado.Para verificar la corrección, cambie la inicial
-
a+
para imprimir 250 1 bytes NUL,++
para 250 2 , etc.fuente
C, 51 bytes
La función
g()
llama a la función recursivaf()
a profundidad 99.Excluye nueva línea innecesaria agregada entre
f()
yg()
para mayor claridad.Imprime 1E100 líneas nuevas.
Declaración de
i
segundo parámetro def()
no garantizado para funcionar en todas las versiones de C. Probado en mi propia máquina (GCC en CygWin) y en ideone.com (creo que también ejecutan GCC), pero no hasta f (99) para obvio ¡razones!fuente
f()
aproximadamente 1980 bytes. Losputs
volcados de las nuevas líneas a la API y la API deberían generar y vaciar el búfer según sea necesario.f
escribe en el espacio de pila que la persona que llama no estaba No lo espero). clang advierte sobre "muy pocos argumentos en la llamada a 'f'", en-std=c89
y-std=c99
, por lo que la definición actúa como una declaración con un número específico de argumentos. Pero lo olvido; Creo que eso podría significar que el compilador sabe que la función espera 2 args, y siempre dejará espacio para un segundo argumento.g
y su función auxiliarf
.main
Sería más largo. Hay algunas otras presentaciones de funciones aquí, si nos fijamos.Código de máquina Commodore VIC 20 (40 bytes)
... aquí se muestra como hexadecimal:
(Empezado a utilizar:
SYS 4160
)Significado de los bytes entre paréntesis
¿Es esto un error de mecanografía?
Tenemos el año 1981.
¡Una computadora doméstica típica tiene de 1 a 16 K B de RAM! Y difícilmente encontrará modelos profesionales que tengan 1 M B o más.
(Ok. Solo una broma.)
El programa ha sido probado con otras bases y exponentes. No tengo dudas de que también funcionará con 100 y 50.
Al menos no se bloquea con estos números (pero tampoco termina en un tiempo medible).
El tamaño de la memoria es suficiente para un exponente de 50 y 100 es menor que 127, por lo que una base de 100 no debería ser un problema.
La idea básica
Hay un contador de 50 dígitos que cuenta en el sistema de 100. Los bytes 0x01-0x64 representan los dígitos 0-99. El primer byte en el contador es el dígito más bajo. El último byte en el contador (dígito más alto) es seguido por un byte con el valor 0x00.
El contador tiene el valor inicial 100 ^ 50.
Un bucle externo está escribiendo un byte en el "canal actual" ("salida estándar" en los sistemas modernos; típicamente la pantalla) y luego disminuye el contador.
La disminución se realiza mediante un bucle interno: disminuye un dígito y, en el caso de un flujo inferior de 1 a 99, avanza al siguiente dígito. Si se disminuye el byte 0x00 al final del contador, el programa se detiene.
El código de ensamblaje es
EDITAR
¡El programa también se ejecuta en Commodore C64!
fuente
Nodo, 89 bytes
Salidas 10 100 líneas nuevas. (Teóricamente, es decir; pruebe reemplazando
100
con1
para generar 10 1 nuevas líneas en su lugar).Esto funciona configurando
i
la cadena(100 ceros y un 1; un googol invertido), luego "restando 1" repetidamente con un regex reemplaza y enviando una nueva línea hasta que la cadena sea todos ceros.
Un puerto de la respuesta de C ++ sería de 49 bytes:
fuente
05AB1E , 6 bytes
Explicación
fuente
Rubí, 20 bytes
Imprime 1 seguido de una nueva línea 1E100 veces.
1E100
no funciona ya que se evalúa como flotante, no es un entero de precisión arbitrario.fuente
10**(100.times{p 1})
1E100.to_i
evaluado al 10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104 en mi computadora./// , 36 caracteres ASCII (4 distintos)
Emite el
.
carácter 3 * 10 ^ 125 veces, lo que significa que emite la cadena que consta de 3 * 10 ^ 25 repeticiones del.
carácter, 10 ^ 100 veces.Explicación:
/t./.ttttt/
: Reemplacet.
con.ttttt
el resto del programa, repitiendo hasta que not.
queden instancias . Esto reemplazat...
con...
seguido por 125t
s./.t/t\........../
: Reemplace.t
cont..........
el resto del programa, repitiendo hasta que no.t
queden instancias . Esto toma...
125t
segundos seguidos y lo convierte en 125t
segundos seguidos de 10 ^ 125 ocurrencias de...
./t//
: Eliminar todos lost
s restantes .t...
: Esto se reemplaza con 3 * 10 ^ 125.
s. Salida de ellos.Ahora, generar 10 ^ 100 repeticiones de 3 * 10 ^ 25 repeticiones de algo parecido a una trampa. Este programa genera el
.
carácter exactamente 10 ^ 100 veces, utilizando 45 caracteres ASCII:Explicación de este:
/T/tttttttttt/
: ReemplaceT
contttttttttt
el resto del programa. Esto reemplazaTTTTTTTTTT
con 100 repeticiones det
./.t/t........../
: Reemplace.t
cont..........
el resto del programa. Esto toma.
100t
segundos seguidos y los convierte en 100t
segundos seguidos de 10 ^ 100.
segundos./t//
: Eliminar todos lost
s restantes ..TTTTTTTTTT
: Esto se reemplaza con 10 ^ 100.
s. Salida de ellos.Finalmente, aquí hay un programa de compromiso, que genera el
.
carácter 2 * 10 ^ 100 veces, usando 40 caracteres:fuente
Befunge 93, 33 bytes
Desafortunadamente, Befunge no tiene una función de potencia, por lo que casi todo ese código es mi implementación de una función de potencia. Todavía estoy trabajando en esto.
Explicación:
1
: Comience con1
en la parte superior izquierda para que cuando multipliquemos, no obtengamos0
todo el tiempo.01g
: obtiene el carácter en la posición (0, 1), que esd
, cuyo código ASCII es 100.0`
: ver si el valor almacenado en (0, 1) es mayor que 0; Este valor cambiará.#@!# _
: No es lógico!
el valor que obtenemos del último paso (0 o 1), de modo que si fuera 1, ahora tenemos 0, y observamos que eso#
significa que omite el siguiente carácter en el código.01g 1- 01p
: Tome el valor almacenado en (0, 1) nuevamente, reste 1 de él y almacene este nuevo valor en (0, 1)25**
: multiplica el valor superior de la pila por 101.
: imprime1
cada vez que este bucle1
se imprime (en teoría) tiempos de googol, pero eso rápidamente se sale de la página en la que probé esto.Puede ejecutar el código Befunge 93 aquí . Por alguna razón, el valor superior de la pila es
1.0000000000000006e+100
cuando debería ser1.0e+100
. No sé de dónde6
vino eso , pero no creo que deba estar allí y que pueda ser un error de redondeo o algo así.fuente
ABCR , 56 bytes
Las lonas de Turing son divertidas, especialmente cuando no tienen multiplicaciones o exponentes fáciles. Por otro lado, ¡solo necesitaba usar dos de las tres colas!
Explicación:
fuente
Lote,
574242 bytesCada ciclo se cae, por lo tanto, ejecuta una iteración adicional. Los bucles están limitados a ~ 2³² debido al límite de enteros de 32 bits. Los primeros cuatro bucles cuentan cada uno 2²⁵ para un total de 2¹⁰⁰ mientras que los diez bucles restantes cuentan cada 5¹⁰ para un total de 5¹⁰⁰.
Editar: ahorró un 58% inimaginable gracias a @ ConorO'Brien.
fuente
TI-Basic, 20 bytes
Sencillo. Solo se muestran ocho líneas a la vez, y las líneas anteriores no permanecen en la memoria. Debido a
ᴇ100
que no es compatible, debemos recorrer de-ᴇ99
a9ᴇ99
. Luego, siI!=0
, muestra la cadena (que, por cierto, es 3). De esta manera, lo imprimimos exactamente lasᴇ100
veces.fuente
Función de código de máquina x86-64, 30 bytes.
Utiliza la misma lógica de la recursividad como la respuesta C por @Level río St . (Profundidad máxima de recursión = 100)
Utiliza la
puts(3)
función de libc, de la cual se ejecutan los ejecutables normales. Es invocable usando el x86-64 System V ABI, es decir, desde C en Linux u OS X, y no registra ningún registro que no debería.objdump -drwC -Mintel
salida, comentada con explicación0x040035e - 0x0400340 = 30 bytes
Construido con
yasm -felf64 -Worphan-labels -gdwarf2 golf-googol.asm && gcc -nostartfiles -o golf-googol golf-googol.o
. Puedo publicar la fuente NASM original, pero eso parecía desordenado ya que las instrucciones asm están ahí en el desmontaje.putchar@plt
está a menos de 128 bytes de distanciajl
, por lo que podría haber usado un salto corto de 2 bytes en lugar de un salto cercano de 6 bytes, pero eso solo es cierto en un pequeño ejecutable, no como parte de un programa más grande. Así que no creo que pueda justificar no contar el tamaño de la implementación de put de libc si también aprovecho una breve codificación jcc para alcanzarla.Cada nivel de recursión usa 24B de espacio de pila (2 empujes y la dirección de retorno empujada por CALL). Cualquier otra profundidad llamará
putchar
con la pila solo alineada por 8, no por 16, por lo que esto viola el ABI. Fallaría una implementación estándar que usara tiendas alineadas para derramar registros xmm a la pila. Pero glibcputchar
no hace eso, escribir en una tubería con almacenamiento en búfer completo o escribir en una terminal con almacenamiento en línea. Probado en Ubuntu 15.10. Esto podría solucionarse con un push / pop ficticio en el.loop
, para compensar la pila por otros 8 antes de la llamada recursiva.Prueba de que imprime el número correcto de líneas nuevas:
Mi primera versión de esto fue 43B, y usé
puts()
en un búfer de 9 líneas nuevas (y un byte final de 0), por lo que put agregaría el 10. Ese caso base de recursión estaba aún más cerca de la inspiración C.Factorizar 10 ^ 100 de una manera diferente podría haber acortado el búfer, tal vez hasta 4 líneas nuevas, ahorrando 5 bytes, pero usar putchar es mucho mejor. Solo necesita un argumento entero, no un puntero, y ningún búfer en absoluto. El estándar C permite implementaciones para las que es una macro
putc(val, stdout)
, pero en glibc existe como una función real a la que puede llamar desde asm.Imprimir solo una nueva línea por llamada en lugar de 10 solo significa que necesitamos aumentar la profundidad máxima de recursión en 1, para obtener otro factor de 10 nuevas líneas. Como 99 y 100 se pueden representar mediante un signo de 8 bits inmediato,
push 100
todavía son solo 2 bytes.Aún mejor, tener
10
un registro funciona como una nueva línea y un contador de bucle, guardando un byte.Ideas para guardar bytes
Una versión de 32 bits podría guardar un byte para el
dec edi
, pero la convención de llamadas stack-args (para funciones de biblioteca como putchar) hace que la llamada de cola funcione con menos facilidad y probablemente requerirá más bytes en más lugares. Podría usar una convención de registro-arg para el privadof()
, solo llamado porg()
, pero luego no pude llamar a putchar (porque f () y putchar () tomarían un número diferente de stack-args).Sería posible tener f () preservar el estado de la persona que llama, en lugar de guardar / restaurar en la persona que llama. Sin embargo, eso probablemente apesta, porque probablemente necesitaría estar por separado en cada lado de la rama, y no es compatible con las llamadas de cola. Lo intenté pero no encontré ningún ahorro.
Mantener un contador de bucles en la pila (en lugar de presionar / reventar rcx en el bucle) tampoco ayudó. Era 1B peor con la versión que usaba put, y probablemente una pérdida aún mayor con esta versión que configura rcx de manera más económica.
fuente
PHP, 44 bytes
Este fragmento generará
1
tiempos de googol. No se quedará sin memoria, pero es terriblemente lento. Estoy usando BCMath para poder manejar enteros largos.Un poco mejor rendimiento, pero no tan pequeño (74 bytes):
Producirá la letra
a
googol veces. Consumirá casi 4 GB de memoria y generará unos 4e9 caracteres a la vez.fuente
a
, es una cadena de 4 * 10 ^ 9a
s. No hay forma de no exceder los 4GB si vas a poner 3 veces mása
s allí. Ob_flush no tiene nada que ver con eso, el objetivo del segundo ejemplo es generar cadenas grandes a la vez en lugar de generar pequeñas cantidades de caracteres cada vez, lo que hace que el programa se ejecute un poco más rápido, a costa de un mayor uso de memoria.Haskell,
4543 bytesfuente
Pyke,
65 bytesPruébalo aquí!
Sin probar ya que bloquea mi navegador. Los primeros 4 caracteres generan 10 ^ 100 e
V
imprimen muchas líneas nuevas. Prueba con100V
.fuente
Raqueta 36 bytes
Salida:
fuente
JAISBaL , 4 bytes
Chrome no puede leer todos los símbolos, y no estoy seguro acerca de otros navegadores, así que aquí hay una imagen:
Explicación:
Bastante simple ... solo imprime un googol espacios. Tres instrucciones, pero la constante googol es de dos bytes.
(Escrito en la versión 3.0.5)
fuente
JavaScript ES6,
8583 bytes¡Ahorró 2 bytes gracias a ETHproductions!
Esto imprime 1e100 líneas nuevas.
La parte interna genera este programa, que luego se evalúa.
Ahora, para una prueba de corrección, usaremos alguna inducción. Vamos a sustituir al inicial 100 para otros valores, genéricamente N . Afirmo que insertar N producirá 10 N nuevas líneas. Vamos a canalizar el resultado de esto a
wc -l
, que cuenta el número de líneas nuevas en la entrada. Utilizaremos este script modificado pero equivalente que toma la entrada N :Ahora, aquí hay algo de salida:
Podemos ver que esto transforma la entrada N para valores pequeños a 10 N líneas nuevas.
Aquí hay un ejemplo de salida para N = 1:
fuente
eval([...Array(i=100)].map(_=>`for($${--i}=0;$${i}++<10;)`).join``+"console.log()")
Mathematica,
483025 bytesSalida:
fuente
For[n=0,n++<10^100,Echo[]]
?>>
parte principal de la salida. Están impresos si los usaEcho
en la consola.Echo@0&~Array~10^100;
para 21 bytes?Fortran 95, forma libre, recursiva, 117 bytes
Imprime un googol de líneas que contienen
Fortran 90, recursivo, 149 bytes
La invocación recursiva de 100 bucles anidados, cada 10 iteraciones, hace exactamente un googol. N, L y los contadores de bucle encajan en enteros de tamaño byte.
Probado reemplazando 99 con 1, 2, 3, 4, 5 y observando que en cada caso el recuento de líneas resultante de "wc" tiene n + 1 ceros.
Fortran II, IV, 66 o 77, 231 bytes:
Imprime un googol de nuevas líneas.
Todos estos programas se ejecutarán en máquinas de 32 bits; de hecho, las versiones recursivas funcionarían bien en una máquina de 16 bits. Uno podría usar menos bucles en la versión de fuerza bruta al ejecutar un viejo Cray con sus enteros de 60 bits. Aquí, diez bucles anidados de 2 * 10 ^ 9 dentro de un bucle de 5 ^ 10 (9765625) equivalen a 10 ^ 100 iteraciones totales.
Ninguna de las versiones utiliza memoria para hablar de otra cosa que no sea el código objeto en sí, los contadores, una copia de la cadena de salida y, en la versión recursiva, una pila de retorno de 100 niveles.
Verifique los factores comparando
fuente
Simulador de máquina de Turing, 1082 bytes
Simulador de máquina de Turing
No sé si esto cuenta como la salida correcta, ya que tiene 82 espacios iniciales.
No sé si esto respeta el límite de 4 GB, por lo que, si no lo hace, entonces no es competitivo y solo para mostrar. La salida es de 1e100 bytes, por lo que debe deducirse del recuento de bytes de memoria. El recuento final de bytes es de 82 bytes.
Aquí hay una explicación:
Las primeras 80 líneas de código son 80 estados diferentes que generan el recuento de bucles base-19 1
6EC1BCF4688309GH806H932ADCC44EEG6DE0FE9FAHDE66DGH108C9G3623E045A0H7A95AB594CE99A
.Las siguientes 19 líneas de código son el estado del contador, que disminuye el recuento cada vez que se imprime un carácter.
Las siguientes 6 líneas son el estado de la impresora, que agrega un
=
.Finalmente, las últimas 2 líneas son el estado más limpio, que son necesarias para asegurarse de que la única salida sea
=====...=====
. Los espacios iniciales / finales no cuentan como salida, ya que son efectos secundarios inevitables.El programa luego se detiene.
1 Hice los cálculos para eso.
fuente
Pyth, 7 bytes
Nuevo (en competencia)
Explicación
Antiguo (no competidor) 7 bytes
Explicación
fuente
*TT
sea más corto que un llano100
.Python 3, 32 bytes
Solución alternativa, 33 bytes:
fuente
range(10**100)
crea una lista de números[1, 2, 3, 4, ...]
, lo que da como resultadoOverflowError: range() result has too many items
. Esto funcionaría en Python 2 con una llamada axrange()
, y funciona en Python 3 desdexrange()
se cambió el nombre arange()
, y el originalrange()
que generó una lista fue obsoleto.Java,
198179155 bytesImpresiones (
x
==null
?:null
Una cadena que comienza con[La;@
o algo así) 10 100 veces en el tiempo O (para siempre).fuente
class
, pero ningúnpublic static void main(String[]a)
método. En cuanto a los consejos de golf: puede reemplazar elnew BigInteger("0")
,new BigInteger("1")
ynew BigInteger("10")
conBigInteger.ZERO
,BigInteger.ONE
yBigInteger.TEN
; se puede reemplazarimport java.math.BigInteger;
conimport java.math.*;
.java.math.BigInteger b=null;for(b=b.ZERO;!(b=b.add(b.ONE)).equals(b.TEN.pow(100);)System.out.print(x);
b
es nula.Java, 153 bytes
Salida: 1e100 1s
Sé que hay otra respuesta de Java que también está bastante cerca. El mío tiene un principal y aún es más corto.
Esta es mi primera entrada de código de golf. Consejos apreciados.
fuente
import java.math.*;()->{for(BigInteger i=BigInteger.ZERO;!i.add(i.ONE).equals(i.TEN.pow(100));)System.out.print(1);};
javac
no me deja compilar esto.Pyth,
87 bytesEnlazar
La solución se prueba con una salida pequeña, pero debería imprimir
abcdefghijklmnopqrstuvwxyz
1e100 veces.Por alguna razón, el
p
era innecesaria, ya que 31343 (Maltysen) , dijo .fuente
p