Código mais curto para escrever o código mais longo

12

Seu desafio é criar um código mais curto no seu idioma de escolha que escreva em um .txtarquivo o código mais longo para multiplicar dois números, tendo dois números como entrada e emitindo a resposta .

NENHUMA ENTRADA NECESSÁRIA PARA O SEU CÓDIGO QUE ESTÁ FAZENDO O TRABALHO ESCRITO !

O código do gerador e o código gerado podem estar em qualquer idioma

NÃO use séries ou progressões ilimitadas para aumentar o tamanho do arquivo de texto.
NÃO use declarações desnecessárias para aumentar a pontuação.

PONTUAÇÃO

( size of text file generated in bytes )  (without any unnecessary white spaces, tabs or newlines)
-----------------------------------------
     ( size of your code in bytes )  

Vencedora

O vencedor será escolhido após 1 semana a partir de agora com a maior pontuação .

EDIT: intervalo de entrada no código multiplicando dois números deve estar entre -32768 a 32767

Mukul Kumar
fonte
3
Eu finalmente descobri, mas o fato de você usar a formatação de código para a saída fez parecer que você estava procurando pela string literal "o código mais longo para ...".
Undergroundmonorail
3
Eu acho que você pode simplesmente usar esta resposta do Comintern , alterando +para para *no programa gerador que ele fornece, e você provavelmente já sabe disso, já que respondeu a essa pergunta também.
Geobits 04/04
@ Geobits Tentei manter minha pergunta longe dessa resposta, mas acho que o esforço não é suficiente, o que devo pedir para gerar então, para que a pergunta não tenha nada a ver com outras respostas?
Mukul Kumar
1
Não sei o que você deve perguntar, parece que qualquer vencedor aqui será assustadoramente semelhante às respostas lá.
Geobits 04/04
@MukulKumar talvez o código longo deva gerar o código curto? Mas não mude essa questão para isso, a mudança é muito substancial. Mas pode ser uma idéia para outro desafio relacionado ao quine (se não tiver sido solicitado antes).
Martin Ender

Respostas:

11

perl / perl, pontuação ilimitada sob a regra original com alcance ilimitado

Aqui está um código que não ganha:

$l=-2**5-1;
$h=2**5;
sub p{print@_}
p"sub add {(\$i,\$j)=\@_;\n";
for($i=$l;$i<=$h;++$i){
  for ($j=$l;$j<=$h;++$j){
    p" return ".($i*$j)." if (\$i == $i) && (\$j == $j);\n";
  }
}
p"}print add(<>,<>)\n";

A saída tem este formato:

sub add {($i,$j)=@_;
 return 1089 if ($i == -33) && ($j == -33);
 return 1056 if ($i == -33) && ($j == -32);
 return 1023 if ($i == -33) && ($j == -31);
 return 990 if ($i == -33) && ($j == -30);
...
 return 928 if ($i == 32) && ($j == 29);
 return 960 if ($i == 32) && ($j == 30);
 return 992 if ($i == 32) && ($j == 31);
 return 1024 if ($i == 32) && ($j == 32);
}print add(<>,<>)

o arquivo de saída tem 181030 bytes, mas após a remoção de espaços e novas linhas, ele tem apenas 133109 bytes. então, a pontuação é 133109/248 = 536.7289 ...

Aqui está outro código que não vence - é o mesmo programa, exceto as 2 primeiras linhas:

$l=-2**6-1;
$h=2**6;

o arquivo de saída possui 718138 bytes, mas após a remoção de espaços e novas linhas, ele tem apenas 532233 bytes. portanto, a pontuação é 532233/248 = ~ 2146. Melhor! usando 7 produz uma pontuação de ~ 8750, 8 produz ~ 35347, 9 produz ~ 149129, 10 produz 151100000 não espaço / 250 = 604.400 ....

é claro que podemos fazer isso o quanto quisermos. o tamanho do programa de origem, n, aumentará como O (log (n)). o tamanho do programa de saída é O (2 * n). O limite de 2 * n / log (n) conforme n vai para o infinito é claramente infinito; portanto, se eu apenas substituir no meu número grande favorito, um googolplex, vencerei (até que alguém sugira googolplex + 1).

skibrianski
fonte
Qual é o tipo de saída? como você pode dar as primeiras linhas não repetitivas.
Mukul Kumar 05/04
Na primeira vez em que pude ler Perl. Ele gera uma função nomeada addque aceita dois parâmetros. Em seguida, ela preenche essa função com instruções de retorno parecidas return 39 if ($i == 13) && ($j == 3);, usando todos os valores de $lpara $hpara $ie $j. Dobra inteligente da regra "apenas declarações desnecessárias".
tomsmeding
Mukul, editei a resposta para incluir uma saída de amostra.
precisa saber é o seguinte
@skibrianski bem, então é finito, porque o valor que as variáveis ​​i, j podem conter são finitos. Mas, bem grande.
Mukul Kumar 07/04
Mujul. Finito, mas ilimitado. Dê-me qualquer número e eu posso escolher uma saída de tamanho maior (ou pontuação) simplesmente ajustando essas variáveis.
precisa saber é o seguinte
9

C, 27297/245 = 111,4

Código fonte (245 bytes)

#include<stdio.h>
main(int c,char**v){char*s;FILE*f=fopen("/tmp/x.c","w");fprintf(f,"#include<stdio.h>\n#include<stdlib.h>\nmain(){int a=%s,b=%s;printf(\"%s * %s = %%d\\n\",a*b);}",v[1],v[2],v[1],v[2]);fclose(f);system("cc -E /tmp/x.c >add.c");}

Quando compilado e executado com dois argumentos inteiros na linha de comando, isso gera outro arquivo C contendo o código necessário para calcular seu produto e o compila com o -Esinalizador. Este sinalizador especifica que o compilador deve parar após o estágio de pré-processamento e gerar o código-fonte processado (que incluirá todo o conteúdo de stdio.he stdlib.h).

Arquivo de saída (27297 bytes)

# 1 "/tmp/x.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/tmp/x.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 64 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/_types.h" 1 3 4
# 27 "/usr/include/_types.h" 3 4
# 1 "/usr/include/sys/_types.h" 1 3 4
# 32 "/usr/include/sys/_types.h" 3 4
# 1 "/usr/include/sys/cdefs.h" 1 3 4
# 33 "/usr/include/sys/_types.h" 2 3 4

********* LINES 13-1273 OMITTED *********

long long
  strtoq(const char *, char **, int);
unsigned long long
  strtouq(const char *, char **, int);

extern char *suboptarg;
void *valloc(size_t);







# 3 "/tmp/x.c" 2
main(){int a=6,b=7;printf("6 * 7 = %d\n",a*b);}

Resultado da execução do código de saída

O arquivo de saída é salvo como add.c, que pode ser compilado e executado normalmente:

$ ./a.out 6 7
$ cc add.c -o add
$ ./add
6 * 7 = 42
$ 
r3mainer
fonte
4

perl, 125 caracteres, pontuação 1.630.326.497.312

A mesma abordagem básica da minha outra resposta, mas desta vez limitada entre -32768 e 32767 pelas regras atualizadas, e todo o espaço em branco desnecessário foi removido completamente:

$l=-($h=32767)-1;print"sub a{";for$i($l..$h){print"return ".$i*$_." if\$_[0]==$i&&\$_[1]==$_;"for$l..$h;}print"}print a<>,<>"

O programa de saída começa assim:

sub a{return 1073741824 if $_[0]==-32768&&$_[1]==-32768;return 1073709056 if $_[0]==-32768&&$_[1]==-32767;

e termina:

return 1073643522 if $_[0]==32767&&$_[1]==32766;return 1073676289 if $_[0]==32767&&$_[1]==32767;}print a<>,<>

O programa de saída tem 190 GB de comprimento. Mais precisamente, 203790812164 bytes. Pontuação = 203790812164/125 = 1630326497.312

skibrianski
fonte
3

Script de comando do Windows: ~ 1.000.000.000 pts

Código: 158 bytes

Saída: ~ 158000000000 bytes

echo>.txt @goto :%%1_%%2
set,=for /l %%a in (-32768 1 32767) do call :
%,%1 %%a
:1
%,%2 %1 %%a
:2
set/a]=%1*%2
echo :%1_%2>>.txt
echo @echo.%]%^&exit/b0>>.txt

A saída consiste basicamente em:

@goto :%1_%2
:-32768_-32768
@echo.1073741824&exit/b0
:-32768_-32767
@echo.1073709056&exit/b0
...
:32767_32767
@echo.1073676289&exit/b0
Robert Sørlie
fonte