Kode terpendek untuk menulis kode terpanjang

12

Tantangan Anda adalah membuat kode terpendek dalam bahasa pilihan Anda yang menulis pada .txtfile kode terpanjang untuk mengalikan dua angka dengan mengambil dua angka sebagai input dan menghasilkan jawaban .

TIDAK ADA INPUT YANG DIPERLUKAN UNTUK KODE ANDA YANG MELAKUKAN PEKERJAAN MENULIS !

Kode generator dan kode yang dihasilkan dapat dalam bahasa apa pun

JANGAN gunakan seri atau progres tak terbatas untuk menjadikan file teks besar.
JANGAN gunakan pernyataan yang tidak perlu untuk meningkatkan skor.

SKOR

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

Pemenang

Pemenang akan dipilih setelah 1 minggu dari sekarang dengan skor tertinggi .

EDIT: rentang input dalam kode yang mengalikan dua angka harus berada di antara -32768 hingga 32767

Mukul Kumar
sumber
3
Saya akhirnya menemukan, tetapi fakta bahwa Anda menggunakan pemformatan kode untuk output membuatnya tampak seperti Anda mencari string literal "kode terpanjang untuk ...".
undergroundmonorail
3
Saya pikir Anda bisa menggunakan jawaban ini oleh Comintern , mengubah +ke *dalam program generator yang ia sediakan, dan Anda mungkin sudah tahu ini, karena Anda juga menjawab pertanyaan itu.
Geobits
@Geobits Saya mencoba menjauhkan pertanyaan saya dari jawaban itu, tapi saya pikir upaya itu tidak cukup, apa yang harus saya tanyakan untuk menghasilkan, sehingga pertanyaan itu tidak ada hubungannya dengan pertanyaan-jawaban lain?
Mukul Kumar
1
Saya tidak tahu apa yang harus Anda tanyakan, sepertinya setiap pemenang di sini akan sangat mirip dengan jawaban di sana.
Geobits
@MukulKumar mungkin kode panjang harus menghasilkan kode pendek? Tapi jangan ubah pertanyaan ini menjadi itu, perubahannya terlalu substansial. Tapi itu mungkin ide untuk tantangan terkait quine lain (jika belum pernah ditanyakan sebelumnya).
Martin Ender

Jawaban:

11

perl / perl, skor tidak terbatas di bawah aturan asli dengan rentang tak terbatas

Berikut beberapa kode yang tidak menang:

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

Output memiliki bentuk ini:

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

file output panjangnya 181030 byte, tetapi setelah stripping spasi dan baris baru, hanya 133109 byte panjang. jadi, skornya adalah 133109/248 = 536.7289 ...

Berikut beberapa kode lain yang tidak menang - ini adalah program yang sama kecuali 2 baris pertama:

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

file output sepanjang 718138 byte, tetapi setelah stripping spasi dan baris baru, hanya 532233 byte. jadi, skornya adalah 532233/248 = ~ 2146. lebih baik! menggunakan 7 hasil skor ~ 8750, 8 hasil ~ 35347, 9 hasil ~ 149129, 10 menghasilkan 151100000 non-space / 250 = 604.400 ....

tentu saja kita bisa melakukan ini selama yang kita mau. ukuran program sumber, n, akan bertambah sebagai O (log (n)). ukuran program keluaran adalah O (2 * n). Batas 2 * n / log (n) ketika n menuju ke infinity jelas tak terhingga, jadi jika saya hanya mengganti dalam jumlah besar favorit saya, sebuah googolplex, saya menang (sampai seseorang menyarankan googolplex + 1).

skibrianski
sumber
Apa jenis outputnya? seperti Anda dapat memberikan garis non-berulang pertama.
Mukul Kumar
Pertama kali saya benar-benar bisa membaca Perl. Ini menghasilkan fungsi bernama addyang mengambil dua parameter. Kemudian mengisi fungsi itu dengan pernyataan kembali yang tampak seperti return 39 if ($i == 13) && ($j == 3);, menggunakan semua nilai dari $lhingga $huntuk $idan $j. Pembengkokan Smartass dari aturan "hanya pernyataan yang tidak perlu".
mulai
Mukul, saya mengedit jawaban untuk memasukkan beberapa sampel output.
skibrianski
@skibrianski juga itu terbatas, karena nilai variabel i, j bisa tahan terbatas. Tapi, cukup besar.
Mukul Kumar
Mujul. Terbatas, tetapi tidak terbatas. Beri saya nomor apa pun dan saya dapat memilih ukuran output yang lebih besar (atau skor) dengan hanya menyesuaikan variabel-variabel tersebut.
skibrianski
9

C, 27297/245 = 111,4

Kode sumber (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");}

Ketika dikompilasi dan dijalankan dengan dua argumen integer pada baris perintah, ini menghasilkan file C lain yang berisi kode yang diperlukan untuk menghitung produk mereka, dan mengkompilasinya dengan -Eflag. Bendera ini menetapkan bahwa kompilator harus berhenti setelah tahap preprocessing dan menampilkan kode sumber yang diproses (yang akan mencakup seluruh konten stdio.hdan stdlib.h).

File keluaran (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);}

Hasil menjalankan kode output

File keluaran disimpan sebagai add.c, yang dapat dikompilasi dan dijalankan secara normal:

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

perl, 125 karakter, skor 1,630,326,497.312

Pendekatan dasar yang sama dengan jawaban saya yang lain, tetapi kali ini dibatasi antara -32768 dan 32767 per aturan yang diperbarui, dan semua spasi putih yang tidak perlu dihapus sepenuhnya:

$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 keluaran dimulai seperti ini:

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

dan berakhir:

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

Program output panjangnya 190GB. Lebih tepatnya, 203790812164 byte. Nilai = 203790812164/125 = 1630326497.312

skibrianski
sumber
3

Script Perintah Windows: ~ 1.000.000.000 poin

Kode: 158 byte

Output: ~ 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

Outputnya cukup banyak terdiri dari:

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