Najkrótszy kod do napisania najdłuższego kodu

12

Wyzwanie polega na utworzeniu najkrótszego kodu w wybranym języku, który zapisuje w .txtpliku najdłuższy kod do pomnożenia dwóch liczb, przyjmując dwie liczby jako dane wejściowe i wyjściowe .

ŻADNE WEJŚCIE NIE JEST POTRZEBNE DLA KODU, KTÓRY WYKONYWA PRACĘ !

Kod generatora i wygenerowany kod mogą być w dowolnym języku

NIE używaj nieograniczonej liczby serii lub progresji, aby plik tekstowy był duży.
NIE używaj niepotrzebnych instrukcji, aby zwiększyć wynik.

PUNKTACJA

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

Zwycięzca

Zwycięzca zostanie wybrany po 1 tygodniu od teraz z najwyższym wynikiem .

EDYCJA: zakres danych wejściowych w kodzie mnożącym dwie liczby powinien zawierać się w przedziale od -32768 do 32767

Mukul Kumar
źródło
3
W końcu doszedłem do wniosku, ale fakt, że używasz formatowania kodu dla danych wyjściowych, sprawiał wrażenie, jakbyś szukał dosłownego ciągu „najdłuższego kodu do…”.
undergroundmonorail
3
Myślę, że można po prostu użyć tej odpowiedzi przez Komintern , zmieniając +się *w programie generującym on dostarcza, a prawdopodobnie już wiedzą o tym, ponieważ odpowiedział na to pytanie, jak również.
Geobits
@Geobits Próbowałem trzymać moje pytanie z dala od tej odpowiedzi, ale myślę, że wysiłek nie jest wystarczający, co powinienem wtedy wygenerować, aby Pytanie nie miało nic wspólnego z innymi odpowiedziami na pytania?
Mukul Kumar
1
Nie wiem, o co powinieneś zapytać, wygląda na to, że każdy zwycięzca będzie niesamowicie podobny do tamtejszych odpowiedzi.
Geobits
@MukulKumar może długi kod powinien wygenerować krótki kod? Ale nie zmieniaj tego pytania na to, zmiana jest zbyt znaczna. Ale może to być pomysł na kolejne wyzwanie związane z quine (jeśli nie było wcześniej zadawane).
Martin Ender

Odpowiedzi:

11

perl / perl, nieograniczony wynik według oryginalnej reguły o nieograniczonym zasięgu

Oto kod, który nie wygrywa:

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

Dane wyjściowe mają następującą postać:

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

plik wyjściowy ma długość 181030 bajtów, ale po usunięciu spacji i znaków nowej linii ma tylko 133109 bajtów. więc wynik to 133109/248 = 536,7289 ...

Oto inny kod, który nie wygrywa - jest to ten sam program, z wyjątkiem pierwszych 2 linii:

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

plik wyjściowy ma długość 718138 bajtów, ale po usunięciu spacji i znaków nowej linii ma tylko 532233 bajtów. więc wynik to 532233/248 = ~ 2146. lepszy! użycie 7 daje wynik ~ 8750, 8 daje ~ 35347, 9 daje ~ 149129, 10 daje 151100000 non-space / 250 = 604,400 ....

oczywiście możemy to robić tak długo, jak chcemy. rozmiar programu źródłowego, n, wzrośnie jako O (log (n)). rozmiar programu wyjściowego to O (2 * n). Granica 2 * n / log (n), gdy n idzie do nieskończoności, jest wyraźnie nieskończonością, więc jeśli po prostu zastąpię moją ulubioną dużą liczbę, googolplex, wygrywam (dopóki ktoś nie zasugeruje googolplex + 1).

skibrianski
źródło
Jaki jest rodzaj produkcji? jak możesz podać pierwsze nie powtarzalne wiersze.
Mukul Kumar
Pierwszy raz mogłem przeczytać Perla. Generuje funkcję o nazwie, addktóra przyjmuje dwa parametry. Następnie wypełnia tę funkcję wyglądającymi instrukcjami zwrotnymi return 39 if ($i == 13) && ($j == 3);, używając wszystkich wartości od $ldo $hdla $ii $j. Inteligentne gięcie reguły „tylko niepotrzebne instrukcje”.
tomsmeding
Mukul, zredagowałem odpowiedź, aby uwzględnić przykładowe wyniki.
skibrianski
@skibrianski to jest skończone, ponieważ wartości, które mogą przyjmować zmienne i, j są skończone. Ale dość duży.
Mukul Kumar
Mujul. Skończone, ale nieograniczone. Podaj mi dowolną liczbę, a ja mogę wybrać wynik większy (lub wynik), po prostu dostosowując te zmienne.
skibrianski
9

C, 27297/245 = 111,4

Kod źródłowy (245 bajtów)

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

Po skompilowaniu i uruchomieniu z dwoma argumentami liczb całkowitych w wierszu poleceń, generuje to kolejny plik C zawierający kod niezbędny do obliczenia ich produktu i kompiluje go z -Eflagą. Ta flaga określa, że ​​kompilator powinien zatrzymać się po etapie przetwarzania wstępnego i wygenerować przetworzony kod źródłowy (który obejmie całą zawartość stdio.hi stdlib.h).

Plik wyjściowy (27297 bajtów)

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

Wynik uruchomienia kodu wyjściowego

Plik wyjściowy jest zapisywany jako add.c, który można skompilować i uruchomić normalnie:

$ ./a.out 6 7
$ cc add.c -o add
$ ./add
6 * 7 = 42
$ 
r3mainer
źródło
4

perl, 125 znaków, wynik 1630 326 497,312

To samo podstawowe podejście, co w mojej innej odpowiedzi, ale tym razem ograniczone do -32768 do 32767 zgodnie ze zaktualizowanymi regułami, a wszystkie niepotrzebne białe znaki zostały całkowicie usunięte:

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

Program wyjściowy zaczyna się tak:

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

i kończy:

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

Program wyjściowy ma długość 190 GB. Mówiąc dokładniej, 203790812164 bajtów. Wynik = 203790812164/125 = 1630326497.312

skibrianski
źródło
3

Skrypt poleceń systemu Windows: ~ 1 000 000 000 pkt

Kod: 158 bajtów

Wyjście: ~ 158000000000 bajtów

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

Dane wyjściowe składają się w większości z:

@goto :%1_%2
:-32768_-32768
@echo.1073741824&exit/b0
:-32768_-32767
@echo.1073709056&exit/b0
...
:32767_32767
@echo.1073676289&exit/b0
Robert Sørlie
źródło