Codice più breve per scrivere il codice più lungo


12

La tua sfida è creare un codice più breve nella tua lingua preferita che scriva su un .txtfile il codice più lungo per moltiplicare due numeri prendendo due numeri come input e producendo la risposta .

NESSUN INGRESSO NECESSARIO PER IL TUO CODICE CHE STA FACENDO IL LAVORO DI SCRITTURA !

Il codice generatore e il codice generato possono essere in qualsiasi lingua

NON utilizzare serie o avanzamenti illimitati per ingrandire il file di testo.
NON utilizzare dichiarazioni non necessarie per aumentare il punteggio.

PUNTEGGIO

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

Vincitore

Il vincitore verrà scelto tra 1 settimana da oggi con il punteggio più alto .

EDIT: l' intervallo di input nel codice che moltiplica due numeri dovrebbe essere compreso tra -32768 e 32767


3
Alla fine ho capito, ma il fatto che usi la formattazione del codice per l'output mi ha fatto sembrare che stavi cercando la stringa letterale "il codice più lungo da ...".
undergroundmonorail

3
Penso che tu possa semplicemente usare questa risposta di Comintern , cambiando +in *nel programma del generatore che fornisce, e probabilmente lo sai già, dato che hai risposto anche a quella domanda.
Geobits

@Geobits Ho cercato di tenere la mia domanda lontana da quella risposta, ma penso che lo sforzo non sia sufficiente, cosa dovrei chiedere di generare allora, in modo che La domanda non abbia nulla a che fare con altre risposte?
Mukul Kumar,

1
Non so cosa dovresti chiedere, sembra che qualsiasi vincitore qui sarà stranamente simile alle risposte lì.
Geobits

@MukulKumar forse il codice lungo dovrebbe generare il codice corto? Ma non cambiare questa domanda in quella, il cambiamento è troppo sostanziale. Ma potrebbe essere un'idea per un'altra sfida legata al quine (se non è stata chiesta prima).
Martin Ender,

Risposte:


11

perl / perl, punteggio illimitato secondo la regola originale con intervallo illimitato

Ecco un codice che non vince:

$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";

L'output ha questa forma:

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(<>,<>)

il file di output è lungo 181030 byte, ma dopo aver rimosso spazi e newline, è lungo solo 133109 byte. quindi, il punteggio è 133109/248 = 536.7289 ...

Ecco qualche altro codice che non vince: è lo stesso programma tranne le prime 2 righe:

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

il file di output è lungo 718138 byte, ma dopo aver rimosso spazi e newline, è lungo solo 532233 byte. quindi, il punteggio è 532233/248 = ~ 2146. meglio! usando 7 si ottiene un punteggio di ~ 8750, 8 rese ~ 35347, 9 rese ~ 149129, 10 rese 151100000 non spaziali / 250 = 604.400 ....

ovviamente possiamo farlo tutto il tempo che vogliamo. la dimensione del programma sorgente, n, aumenterà come O (log (n)). la dimensione del programma di output è O (2 * n). Il limite di 2 * n / log (n) come n va all'infinito è chiaramente infinito, quindi se sostituisco semplicemente il mio numero grande preferito, un googolplex, vinco (fino a quando qualcuno suggerisce googolplex + 1).


Qual è il tipo di output? come se potessi dare le prime righe non ripetitive.
Mukul Kumar,

La prima volta che ho potuto leggere Perl. Genera una funzione denominata addche accetta due parametri. Quindi popola quella funzione con le dichiarazioni di ritorno che assomigliano return 39 if ($i == 13) && ($j == 3);, usando tutti i valori da $la $hper $ie $j. Piegatura intelligente della regola "solo dichiarazioni non necessarie".
tomsmeding

Mukul, ho modificato la risposta per includere alcuni output di esempio.
skibrianski,

@skibrianski bene, allora è finito, perché il valore che le variabili i, j possono contenere sono limitate. Ma abbastanza grande.
Mukul Kumar,

Mujul. Finito, ma illimitato. Dammi un numero qualsiasi e posso scegliere un output (o un punteggio) di dimensioni maggiori semplicemente regolando quelle variabili.
skibrianski,

9

C, 27297/245 = 111,4

Codice sorgente (245 byte)

#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 compilato ed eseguito con due argomenti interi sulla riga di comando, questo genera un altro file C contenente il codice necessario per calcolare il loro prodotto e lo compila con il -Eflag. Questo flag specifica che il compilatore dovrebbe arrestarsi dopo la fase di preelaborazione e generare il codice sorgente elaborato (che includerà l'intero contenuto di stdio.he stdlib.h).

File di output (27297 byte)

# 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);}

Risultato dell'esecuzione del codice di output

Il file di output viene salvato come add.c, che può essere compilato ed eseguito normalmente:

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

4

perl, 125 caratteri, punteggio 1.630.326.497.312

Lo stesso approccio di base dell'altra mia risposta, ma questa volta è stato compreso tra -32768 e 32767 per le regole aggiornate e tutto lo spazio bianco non necessario è stato completamente rimosso:

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

Il programma di output inizia così:

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<>,<>

Il programma di output è lungo 190 GB. Più precisamente, 203790812164 byte. Punteggio = 203790812164/125 = 1630326497.312


3

Script di comando di Windows: ~ 1.000.000.000 di punti

Codice: 158 byte

Uscita: ~ 158000000000 byte

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

L'output consiste praticamente di:

@goto :%1_%2
:-32768_-32768
@echo.1073741824&exit/b0
:-32768_-32767
@echo.1073709056&exit/b0
...
:32767_32767
@echo.1073676289&exit/b0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.