Tulis penghitung biner dalam quine

10

Tulis dua fragmen kode, yang akan kita sebut s_zero dan s_one.

Program (l, n) terdiri dari l salinan s_zero dan s_one yang sesuai dengan digit n dalam biner, diisi dengan s_zero di sebelah kiri.

Misalnya, jika s_zero = foodan s_one = barmaka
Program (4, 0) = foofoofoofoo
Program (4, 1) = foofoofoobar
Program (4, 2) = foofoobarfoo
dll.

Program (l, n) harus mencetak sumber Program (l, (n + 1) mod (2 ^ l)) ke standar keluar. Pada contoh di atas, foobarfoofooharus mencetak foobarfoobarketika dijalankan.

Skor Anda adalah jumlah dari panjang fragmen s_zero dan s_one

QuadmasterXLII
sumber
Hampir duplikat ke codegolf.stackexchange.com/questions/35974/... - perhitungan dilakukan dengan quining program dengan 2 blok kode berbeda.
feersum
Bisakah program membaca kode sumbernya sendiri?
Gagang Pintu
2
@feersum saya tidak setuju. Yang ini jauh lebih mudah, khususnya, Anda tidak perlu bisa menentukan jeda baris. Lebih jauh, saya pikir tugas itu membuat perbedaan, jika tidak setiap tantangan quine yang digeneralisasi akan menjadi dupe dari tantangan quine dasar.
Martin Ender
Keuntungan dari tugas yang lebih sederhana adalah mendorong persaingan untuk menciptakan jawaban singkat yang mengejutkan yang terlihat sejauh ini - saya berharap bahwa membenarkan tantangan ini berbeda!
QuadmasterXLII
1
Mungkin perlu dicatat bahwa s_zero dan s_one harus berbeda. Kalau tidak, saya punya banyak solusi dengan skor 2 * n.
randomra

Jawaban:

6

CJam, 29 + 29 = 58 byte

Kode 0:

0{"_~"]]z(3\+2b(2b2>a\+z~[}_~

1 kode:

1{"_~"]]z(3\+2b(2b2>a\+z~[}_~

Penjelasan

0                       " Push the current bit. ";
{"_~"                   " The basic quine structure. ";
    ]                   " Make an array of the current bit, the function and _~.
                          That is the code fragment itself. ";
    ]                   " Make an array of all code fragments in the stack. ";
    z(                  " Extract the array of the bits. ";
    3\+2b(2b2>          " Convert from base 2, decrease by one and convert back,
                          keeping the length. ";
    a\+z                " Put the bits back to the original position. ";
    ~                   " Dump the array of code fragments back into the stack. ";
    [                   " Mark the beginning position of the array of the next code fragment. ";
}_~
jimmy23013
sumber
2
setiap saat ...
Pengoptimal
3

CJam, 47 + 47 = 94 byte

Kode 0:

{`"_~"+]:+T2*0+:T)\AsSerS/_,(@2Y$#+2bU@->]zs}_~

1 kode:

{`"_~"+]:+T2*1+:T)\AsSerS/_,(@2Y$#+2bU@->]zs}_~

Maafkan sumpah serapah itu.

Saya yakin saya masih bisa memotong beberapa byte di sana. Saya akan menambahkan penjelasan setelah saya memutuskan bahwa saya tidak dapat diganggu golf lagi.

Uji di sini.

Martin Ender
sumber
1

CJam, 45 + 45 = 90 byte

The 0 Kode:

{`]W=L0+:L,Ua*L2b)2b+L,W*>\f{X$!s/\s*"_~"}}_~

The 1 Kode:

{`]W=L1+:L,Ua*L2b)2b+L,W*>\f{X$!s/\s*"_~"}}_~

Penjelasan segera.

Cobalah online di sini

Pengoptimal
sumber
1

GolfScript, 37 + 37 = 74 byte

0{`".~"+:q;]-2%1\{1$^.@&q@}%\;-1%~}.~
1{`".~"+:q;]-2%1\{1$^.@&q@}%\;-1%~}.~

Tidak sesingkat solusi CJam user23013 , tapi saya pikir saya tetap akan memposting ini, jika hanya untuk (sedikit) meningkatkan keragaman bahasa yang digunakan.

Solusi saya tidak secara langsung didasarkan pada salah satu solusi yang ada (dan, memang, saya belum memeriksanya secara rinci, karena saya masih belum membaca CJam dengan sangat baik), tetapi mereka semua menampilkan varian dari struktur quine dasar yang sama ( {".~"}.~dalam GolfScript, {"_~"}_~dalam CJam). Itu tidak terlalu mengejutkan, karena tampaknya menjadi salah satu cara paling efisien untuk menulis quine dengan muatan sewenang-wenang dalam bahasa-bahasa ini.

Ada beberapa bagian dari kode ini yang tidak terlalu saya sukai, dan saya kira mungkin untuk bermain golf lebih jauh, tapi saya sudah menghabiskan terlalu banyak waktu untuk hal ini.

Ilmari Karonen
sumber