Estou interessado em ver programas que não solicitam entrada, imprima uma cópia do googol de uma sequência não vazia, nem menos, nem mais, e depois pare. Um googol é definido como 10 ^ 100, ou seja, 1 seguido de cem zeros em decimal.
Exemplo de saída:
111111111111111111111111111111111111111111111111111111111111111111111111...
ou
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
...
A string também pode ser totalmente composta por espaços em branco ou símbolos especiais. A única exceção para cópias idênticas de uma sequência fixa é se o seu idioma decorar a saída de alguma forma que não possa ser evitada, mas possa ser desfeita trivialmente em um script de wrapper, como anexar um número de linha a cada linha. O script do wrapper nesses casos não precisa ser fornecido.
Você pode assumir que seu computador nunca ficará sem tempo, mas, além disso, seu programa deve ter uma demanda razoável de recursos. Além disso, você deve respeitar as restrições impostas pela linguagem de programação de sua escolha, por exemplo, não pode exceder um valor máximo permitido para seus tipos inteiros e em nenhum momento mais do que 4 GB de memória devem ser necessários.
Em outras palavras, o programa deve, em princípio, ser testável executando-o no seu computador. Mas, devido à extensão desse número, você deverá provar que o número de cópias da sequência de caracteres que ele gera é exatamente 10 ^ 100 e que o programa é interrompido posteriormente. A parada pode ser encerrada, interrompida ou até finalizada devido a um erro, mas, se for o caso, o erro não deve produzir nenhuma saída que não possa ser facilmente separada da saída do programa.
Isso é código-golfe , então a solução com o menor número de bytes vence.
Solução de exemplo (C, sem 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;
}
Respostas:
Geléia ,
64 bytesEste é um link niládico (função sem argumentos) que imprime 10 200 cópias da sequência 100 , o que significa que imprime 10 100 cópias da sequência que consiste em 10 100 cópias da sequência 100 .
Experimente online!
Observe que o intérprete online reduz a saída em 100 KB por motivos práticos. O código também funciona como um programa completo, mas devido à saída implícita, esse programa imprime uma cópia a mais.
Como funciona
fonte
10^100
cópias da saída original (10^100
cópias de uma string) está levando um pouco longe, mesmo para dois bytes inteiros. Você enviou isso para o desafio "pontuação é resultado / duração do programa, maiores vitórias"?Fuzzy Octo Guacamole,
13121110 bytesExplicação:
Amostra da cabra impressa:
fonte
Python, 28 bytes
-1 byte graças a Jonathan Allan!
Python 2:
Python 3 (30 bytes):
fonte
i=10**100
nova linhawhile i:print();i-=1
salva um byte. Economize mais dois usando Python 2 comwhile i:print;i-=1
Haskell, 28 bytes
Concatena 10 ^ 100 cópias da sequência
"1"
e a imprime.fonte
s=[1..10^100]>>"1"
um formato de resposta permitido?s
a partir de seu exemplo não imprime - ou se você usar o REPL rodeia o1
com"
. Eu acho que apenasputStr$[1..10^100]>>"1"
sem omain=
seria bom, mas eu queria enviar um programa completo.Brainfuck,
48018811410698 bytesSó porque precisa ser feito.
Assume células de 8 bits com quebra automática. Imprime 250 bytes NUL 255 , ou seja, 10 100 vezes 10 155 vezes 25 255 bytes NUL.
Explicação:
>>>>>>
é necessário para deixar um pouco de espaço de trabalho.-
produz 255.[[->>>+<<<]------>>>-]
transforma isso em 255 cópias do valor 250, fornecendo uma fita parecida com:<<<[<<<]+
move o ponteiro dos dados para trás e termina os dados iniciais:Em seguida, vem o loop:
[+...-]
inicialmente define 1 como 2, que volta a 1 no final do loop. O loop termina quando o corpo do loop já está definido como 2 como 1.Agora, os números 2 250 250 250 ... 250 representam um contador, na base 250, com cada número um maior que o dígito que representa.
[>>>]<<<
move todo o caminho para a direita. Como cada dígito é representado por um número diferente de zero, isso é trivial.->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-
diminui o contador em 1. Começando com o último dígito: o dígito é diminuído. Se continuar positivo, terminamos. Se for zero, defina-o como 250 e continue com o dígito anterior.[<<<].>>>
move o ponteiro para trás antes do dígito mais à esquerda, e este é um bom momento para imprimir um byte NUL. Em seguida, reposicione exatamente no dígito mais à esquerda, para ver se terminamos.Para verificar a correção, altere a inicial
-
para+
imprimir 250 1 NUL bytes,++
para 250 2 , etc.fonte
C, 51 bytes
A função
g()
chama a função recursivaf()
para a profundidade 99.Exclui nova linha desnecessária adicionada entre
f()
eg()
para maior clareza.Imprime novas linhas 1E100.
Declaração
i
como segundo parâmetro def()
não garantido que funcione em todas as versões do C. Testado em minha própria máquina (GCC no CygWin) e em ideone.com (acredito que eles também executam o GCC), mas não até f (99) por óbvio razões!fonte
f()
aproximadamente 1980 bytes. Oputs
despejo das novas linhas para a API e a API deve gerar e liberar o buffer conforme necessário.f
grava no espaço da pilha que o chamador não estava esperando que sim). clang avisa sobre "muito poucos argumentos na chamada para 'f'", em-std=c89
e-std=c99
, portanto, a definição atua como uma declaração com um número específico de argumentos. Mas eu esqueço; Eu acho que isso pode significar que o compilador sabe que a função espera 2 args e sempre deixará espaço para um segundo arg.g
e sua função auxiliarf
.main
seria mais longo. Existem algumas outras submissões de funções aqui, se você examinar.Código da máquina Commodore VIC 20 (40 bytes)
... aqui mostrado como hexadecimal:
(Iniciado usando:
SYS 4160
)Significado dos bytes entre colchetes
Isso é um erro de digitação?
Temos o ano de 1981.
Um computador doméstico típico tem 1 a 16 KB de RAM! E você dificilmente encontrará modelos profissionais com 1 MB ou mais.
(Ok. Apenas uma piada.)
O programa foi testado com outras bases e expoentes. Não tenho dúvida de que também funcionará com 100 e 50.
Pelo menos não trava com esses números (mas também não termina em tempo mensurável).
O tamanho da memória é suficiente para um expoente de 50 e 100 é menor que 127, portanto, uma base de 100 não deve ser um problema.
A ideia básica
Há um contador de 50 dígitos que conta no sistema 100. Os bytes 0x01-0x64 representam os dígitos de 0 a 99. O primeiro byte no contador é o dígito mais baixo. O último byte no contador (dígito mais alto) é seguido por um byte com o valor 0x00.
O contador tem o valor inicial 100 ^ 50.
Um loop externo está gravando um byte no "canal atual" ("saída padrão" em sistemas modernos; geralmente na tela) e depois diminui o contador.
A redução é feita por um loop interno: diminui um dígito e, no caso de um subfluxo de 1 a 99, avança para o próximo dígito. Se o byte 0x00 no final do contador for diminuído, o programa será interrompido.
O código de montagem é
EDITAR
O programa também roda no Commodore C64!
fonte
Nó, 89 bytes
Emite 10 100 novas linhas. (Teoricamente, isto é; teste substituindo
100
por1
para gerar 10 1 novas linhas).Isso funciona configurando
i
a string(100 zeros e um 1; um googol invertido) e, em seguida, "subtraindo 1" repetidamente com uma expressão regular substitui e produz uma nova linha até que a sequência esteja com todos os zeros.
Uma porta da resposta C ++ seria 49 bytes:
fonte
05AB1E , 6 bytes
Explicação
fonte
Ruby, 20 bytes
Imprime 1 seguido de uma nova linha 1E100 vezes.
1E100
não funciona conforme é avaliado como flutuante, não como um número inteiro de precisão arbitrário.fonte
10**(100.times{p 1})
1E100.to_i
avaliados como 10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104 no meu computador./// , 36 caracteres ASCII (4 distintos)
Emite o
.
caractere 3 * 10 ^ 125 vezes, o que significa que emite a sequência que consiste em 3 * 10 ^ 25 repetições do.
caractere, 10 ^ 100 vezes.Explicação:
/t./.ttttt/
: Substituat.
por.ttttt
todo o restante do programa, repetindo até que não haja mais instânciast.
. Isso substituit...
por...
seguido por 125t
s./.t/t\........../
: Substitua.t
port..........
todo o restante do programa, repetindo até que não haja mais instâncias.t
. Isso leva o...
seguido por 125t
s e o transforma em 125t
s, seguido por 10 ^ 125 ocorrências de...
./t//
: Remova todos ost
s restantes .t...
: Isso é substituído por 3 * 10 ^ 125.
s. Saída eles.Agora, produzir 10 ^ 100 repetições de 3 * 10 ^ 25 repetições de algo meio que parece trapaça. Este programa gera o
.
caractere exatamente 10 ^ 100 vezes, usando 45 caracteres ASCII:Explicação deste:
/T/tttttttttt/
: SubstituaT
portttttttttt
todo o restante do programa. Isso substituiTTTTTTTTTT
por 100 repetições det
./.t/t........../
: Substitua.t
port..........
todo o restante do programa. Isso leva o.
seguido de 100t
s e o transforma em 100t
s, seguido de 10 ^ 100.
s./t//
: Remova todos ost
s restantes ..TTTTTTTTTT
: Isso é substituído por 10 ^ 100.
s. Saída eles.Finalmente, aqui está um programa de compromisso, que gera o
.
caractere 2 * 10 ^ 100 vezes, usando 40 caracteres:fonte
Abaixo 93, 33 bytes
Infelizmente, o Befunge não tem uma função de poder, então quase todo esse código é minha implementação de uma função de poder. Eu ainda estou trabalhando nisso.
Explicação:
1
: Comece1
no canto superior esquerdo para que, quando nos multiplicamos, não o façamos0
todas as vezes.01g
: obtém o caractere na posição (0, 1), ou sejad
, cujo código ASCII é 100.0`
: veja se o valor armazenado em (0, 1) é maior que 0; esse valor mudará.#@!# _
: Lógico não!
para o valor que obtemos da última etapa (0 ou 1), de modo que, se fosse 1, agora temos 0 e observamos que isso#
significa que você pula o próximo caractere no código.01g 1- 01p
: Pegue o valor armazenado em (0, 1) novamente, subtraia 1 dele e armazene esse novo valor em (0, 1)25**
: multiplique o valor superior da pilha por 101.
: imprima1
sempre que isso faz um loop1
é impresso (em teoria) nos tempos do googol, mas rapidamente sai da página em que eu testei isso.Você pode executar o código Befunge 93 aqui . Por alguma razão, o valor mais alto da pilha é
1.0000000000000006e+100
quando deveria ser1.0e+100
. Não sei de onde6
veio isso , mas acho que não deveria estar lá e que pode haver algum erro de arredondamento ou algo assim.fonte
ABCR , 56 bytes
Tarpits de Turing são divertidos, especialmente quando eles não têm multiplicação fácil ou expoentes. Por outro lado, eu só precisava usar duas das três filas!
Explicação:
fonte
Lote,
574242 bytesCada loop passa, portanto, executando uma iteração adicional. Os loops são limitados a ~ 2³² devido ao limite inteiro de 32 bits. Cada um dos quatro primeiros loops conta 2²⁵ para um total de 2¹⁰⁰, enquanto os dez loops restantes contam 5¹⁰ para um total de 5¹⁰⁰.
Edit: Salvo 58% inimaginável graças a @ ConorO'Brien.
fonte
TI-Basic, 20 bytes
Direto. Apenas oito linhas são exibidas de uma vez e as linhas anteriores não ficam na memória. Como
ᴇ100
não há suporte, precisamos fazer um loop de-ᴇ99
para9ᴇ99
. Em seguida, seI!=0
exibir a sequência (que, a propósito, é 3). Dessa forma, imprimimos exatamente asᴇ100
vezes.fonte
função de código de máquina x86-64, 30 bytes.
Usa a mesma lógica recursividade como a resposta C por @Level River St . (Profundidade máxima de recursão = 100)
Usa a
puts(3)
função da libc, à qual os executáveis normais estão vinculados de qualquer maneira. É possível chamar usando o x86-64 System V ABI, ou seja, do C no Linux ou OS X, e não derruba nenhum registro que não deveria.objdump -drwC -Mintel
saída, comentada com explicação0x040035e - 0x0400340 = 30 bytes
Construído com
yasm -felf64 -Worphan-labels -gdwarf2 golf-googol.asm && gcc -nostartfiles -o golf-googol golf-googol.o
. Posso postar a fonte NASM original, mas isso pareceu uma bagunça, pois as instruções asm estão ali na desmontagem.putchar@plt
está a menos de 128 bytes dojl
, então eu poderia ter usado um salto curto de 2 bytes em vez de um salto próximo de 6 bytes, mas isso é verdade apenas em um pequeno executável, não como parte de um programa maior. Portanto, acho que não posso justificar não contar o tamanho da implementação de libc's puts se eu também tirar proveito de uma codificação jcc curta para alcançá-la.Cada nível de recursão usa 24B de espaço na pilha (2 pushs e o endereço de retorno pressionado por CALL). Qualquer outra profundidade pagará
putchar
com a pilha alinhada apenas por 8, e não 16, portanto isso viola a ABI. Uma implementação stdio que usasse armazenamentos alinhados para derramar registros xmm na pilha falharia. Mas o glibcputchar
não faz isso, gravando em um pipe com buffer completo ou gravando em um terminal com buffer de linha. Testado no Ubuntu 15.10. Isso pode ser corrigido com um push / pop fictício no.loop
, para compensar a pilha em mais 8 antes da chamada recursiva.Prova de que imprime o número certo de novas linhas:
Minha primeira versão disso foi 43B e usada
puts()
em um buffer de 9 novas linhas (e um byte final de 0), portanto, o put acrescentaria o décimo. Esse caso base de recursão foi ainda mais próximo da inspiração em C.Fatorar 10 ^ 100 de uma maneira diferente pode ter reduzido o buffer, talvez até 4 novas linhas, economizando 5 bytes, mas o uso de putchar é de longe o melhor. Ele só precisa de um argumento inteiro, não um ponteiro e nenhum buffer. O padrão C permite implementações para as quais é uma macro
putc(val, stdout)
, mas na glibc existe como uma função real que você pode chamar do asm.Imprimir apenas uma nova linha por chamada em vez de 10 significa apenas que precisamos aumentar a profundidade máxima da recursão em 1, para obter outro fator de 10 novas linhas. Como 99 e 100 podem ser representados por um imediato de 8 bits com extensão de sinal,
push 100
ainda há apenas 2 bytes.Melhor ainda, ter
10
um registro funciona como uma nova linha e um contador de loop, economizando um byte.Ideias para salvar bytes
Uma versão de 32 bits pode salvar um byte para o
dec edi
, mas a convenção de chamada stack-args (para funções de biblioteca como putchar) faz com que a chamada de cauda funcione com menos facilidade e provavelmente exigiria mais bytes em mais locais. Eu poderia usar uma convenção register-arg para o privadof()
, apenas chamado porg()
, mas não poderia chamar putchar (porque f () e putchar () levariam um número diferente de stack-args).Seria possível ter f () preservar o estado do chamador, em vez de salvar / restaurar o chamador. Isso provavelmente é péssimo, porque provavelmente precisaria ficar separadamente em cada lado do galho e não é compatível com o chamado. Eu tentei, mas não encontrei nenhuma economia.
Manter um contador de loop na pilha (em vez de empurrar / colocar rcx no loop) também não ajudou. Foi 1B pior com a versão que usou puts, e provavelmente ainda mais com esta versão que configura o rcx mais barato.
fonte
PHP, 44 bytes
Esse snippet produzirá
1
tempos de googol. Não ficará sem memória, mas é terrivelmente lento. Estou usando o BCMath para poder lidar com números inteiros longos.Um desempenho um pouco melhor, mas não tão pequeno (74 bytes):
Irá gerar a letra
a
googol times. Ele consumirá quase 4 GB de memória, produzindo cerca de 4e9 caracteres por vez.fonte
a
, é uma sequência de 4 * 10 ^ 9a
s. Não há como não repassar os 4 GB se você colocar três vezes maisa
s nele. Ob_flush não tem nada a ver com isso, o objetivo do segundo exemplo é produzir grandes seqüências de caracteres de uma só vez, em vez de produzir pequenas quantidades de caracteres a cada vez, o que resulta no programa sendo executado um pouco mais rápido, ao custo de mais uso de memória.Haskell,
4543 bytesfonte
Pyke,
65 bytesExperimente aqui!
Não testado, pois trava meu navegador. Os 4 primeiros caracteres geram 10 ^ 100 e
V
imprimem muitas novas linhas. Teste com100V
.fonte
Raquete 36 bytes
Resultado:
fonte
JAISBaL , 4 bytes
O Chrome não consegue ler todos os símbolos e não tenho certeza sobre outros navegadores, então aqui está uma figura:
Explicação:
Bastante simples .... apenas imprime um espaço googol Três instruções, mas a constante googol é de dois bytes.
(Escrito na versão 3.0.5)
fonte
JavaScript ES6,
8583 bytesEconomizou 2 bytes graças ao ETHproductions!
Isso imprime 1e100 novas linhas.
A parte interna gera esse programa, que é posteriormente avaliado.
Agora, para uma prova de correção, usaremos alguma indução. Vamos substituir a inicial 100 para outros valores, genericamente N . I afirmam que a inserção de N irá produzir 10 N novas linhas. Vamos canalizar o resultado disso para
wc -l
, que conta o número de novas linhas na entrada. Usaremos esse script modificado, mas equivalente, que recebe a entrada N :Agora, aqui estão alguns resultados:
Podemos ver que isso transforma a entrada N para valores pequenos em 10 N novas linhas.
Aqui está um exemplo de saída para N = 1:
fonte
eval([...Array(i=100)].map(_=>`for($${--i}=0;$${i}++<10;)`).join``+"console.log()")
Mathematica,
483025 bytesResultado:
fonte
For[n=0,n++<10^100,Echo[]]
?>>
parte principal da saída. Eles são impressos se você usarEcho
no console.Echo@0&~Array~10^100;
21 bytes?Fortran 95, de forma livre, recursivo, 117 bytes
Imprime um googol de linhas contendo
Fortran 90, Recursivo, 149 bytes
Chamar recursivamente 100 loops aninhados, a cada 10 iterações, cria exatamente um googol. N, L e os contadores de loop se encaixam em números inteiros do tamanho de bytes.
Testado substituindo 99 por 1, 2, 3, 4, 5 e observando que, em cada caso, a contagem de linhas resultante de "wc" possui n + 1 zeros.
Fortran II, IV, 66 ou 77, 231 bytes:
Imprime um googol de novas linhas.
Todos esses programas serão executados em máquinas de 32 bits; de fato, as versões recursivas funcionariam bem em uma máquina de 16 bits. Pode-se usar menos loops na versão de força bruta executando em um Cray antigo com seus números inteiros de 60 bits. Aqui, dez loops aninhados de 2 * 10 ^ 9 dentro de um loop de 5 ^ 10 (9765625) são iguais a 10 ^ 100 no total de iterações.
Nenhuma das versões usa qualquer memória para falar que não seja o próprio código do objeto, os contadores, uma cópia da sequência de saída e, na versão recursiva, uma pilha de retorno de 100 níveis.
Verifique os fatores comparando
fonte
Simulador de máquina de Turing, 1082 bytes
Simulador de máquina de Turing
Não sei se isso conta como a saída correta, pois possui 82 espaços à esquerda.
Eu não sei se isso respeita o limite de 4 GB, então, se não, é não competitivo e apenas para demonstração. A saída é de 1e100 bytes, pelo que deve ser deduzido da contagem de bytes da memória. A contagem final de bytes é de 82 bytes.
Aqui está uma explicação:
As primeiras 80 linhas de código são 80 estados diferentes que geram a contagem de loop de base 19 1
6EC1BCF4688309GH806H932ADCC44EEG6DE0FE9FAHDE66DGH108C9G3623E045A0H7A95AB594CE99A
.As próximas 19 linhas de código são o estado do contador, que diminui a contagem toda vez que um caractere é impresso.
As próximas 6 linhas são o estado da impressora, que anexa um
=
.Finalmente, as duas últimas linhas são o estado mais limpo, necessário para garantir que a única saída seja
=====...=====
. Os espaços à esquerda / à direita não contam como saída, pois são efeitos colaterais inevitáveis.O programa então pára.
1 Eu fiz as contas para isso.
fonte
Pyth, 7 bytes
Novo (Competindo)
Explicação
Antigos (não concorrentes) 7 bytes
Explicação
fonte
*TT
é mais curto que uma planície100
.Python 3, 32 bytes
Solução alternativa, 33 bytes:
fonte
range(10**100)
cria uma lista de números[1, 2, 3, 4, ...]
, que resulta emOverflowError: range() result has too many items
. Isso funcionaria no Python 2 com uma chamada paraxrange()
, e funciona no Python 3 desde quexrange()
foi renomeado pararange()
, e o originalrange()
que gerou uma lista foi preterido.Java,
198179155 bytesImprime (
x
==null
?:null
Uma sequência que começa com[La;@
algo assim) 10 100 vezes em O (para sempre).fonte
class
, mas nenhumpublic static void main(String[]a)
método. Quanto às dicas de golfe: você pode substituir onew BigInteger("0")
,new BigInteger("1")
enew BigInteger("10")
comBigInteger.ZERO
,BigInteger.ONE
eBigInteger.TEN
; você pode substituirimport java.math.BigInteger;
porimport 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
é nula.Java, 153 bytes
Saída: 1e100 1s
Eu sei que há outra resposta Java que também é bem próxima. A mina tem um cano principal e ainda é mais curto.
Esta é a minha primeira entrada de código de golfe. Dicas apreciadas.
fonte
import java.math.*;()->{for(BigInteger i=BigInteger.ZERO;!i.add(i.ONE).equals(i.TEN.pow(100));)System.out.print(1);};
javac
não me permite compilar isso.Pitão,
87 bytesLigação
A solução é testada com saída pequena, mas deve imprimir
abcdefghijklmnopqrstuvwxyz
1e100 vezes.Por alguma razão, isso não
p
era necessário, como 31343 (Maltysen) disse .fonte
p