Buat program bahasa yang lebih panjang

16

Bahasa adalah dialek bercinta yang terkenal karena melanggar tantangan pembatasan sumber. Itu karena bahasa hanya peduli tentang panjang sumbernya dan bukan isinya.

Pertama, panjang program dihitung. Kemudian, kata panjang dikonversikan menjadi biner dan diisi oleh nol menjadi beberapa kelipatan 3. String biner yang dihasilkan dibagi menjadi potongan-potongan 3 bit yang masing-masing diterjemahkan ke dalam perintah brainfuck seperti:

000 -> +
001 -> -
010 -> >
011 -> <
100 -> .
101 -> ,
110 -> [
111 -> ]

Akhirnya program dijalankan sebagai brainfuck 1 .

Dari sini tantangannya adalah cukup sederhana, menulis sebuah program lenguage yang tidak mengambil input dan menghasilkan output yang terdiri dari satu byte diulang bilangan bulat kali, di mana adalah ketat lebih besar dari panjang program Anda.nn

Jawaban akan dinilai dalam byte dengan lebih sedikit byte menjadi lebih baik.

Inilah program hacky untuk menghitung bahasa dari brainfuck


1: Untuk tantangan ini kita akan menggunakan sel pembungkus dan pita non-pembungkus.

Posting Rock Garf Hunter
sumber
3
+[.]Apakah saya menang? : P
Quintec
3
Mungkin lebih menarik untuk menilai pada panjang output?
Jo King
@ JoKing Itu ide yang bagus. Sayangnya sepertinya agak terlambat untuk itu.
Posting Rock Garf Hunter
2
Juga, mengapa quine ini ditandai?
Perwujudan Ketidaktahuan
1
@ msh210 Itu akan melakukan trik sebagian besar waktu, tetapi ada beberapa perbedaan, misalnya karakter Brainfuck berbeda biaya jumlah yang berbeda ( +adalah yang termurah dan ]paling mahal) dan tentu saja itu penting di mana dalam program mereka berada. Meskipun adalah estimasi yang baik, namun tidak persis sama. 23n
Posting Rock Garf Hunter

Jawaban:

15

8437495638205698686671 byte

Ini berarti program brainfuck:

-[>>[>]+[->[>]+.[<]+<]<-]

Yang mencetak persis 231584178474632390847141970017375815706539969331281128078915168015826259279614 byte SOH.

Ini dihitung oleh fungsi

f(n)=2*f(n-1)+n
f(0)=0

dengan input 255.

Penjelasan:

-[         Loop 255 times
  >>[>]    Move to the end of a series of positive cells (initially empty)
  +        Add one cell to the end
  [-       Loop over each cell 
    >[>]+  Add one cell to the end
    .      Print a SOH byte
    [<]+   Restore current cell
  <]       Move to next cell
<-]        Decrement counter
Jo King
sumber
4

9093903938998324939360576240306155985031832511491088836321985855167849863863065731015823 byte

>>>>>>-[[->>>+<<<]------>>>-]<<<[<<<]+[+[>>>]<<<->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-[<<<].>>>-]

Yang mencetak persis

298333629248008269731638612618517353495058861384016275770860733328251135402804732197446995616017112134460464130233444058136509123809012106419446593183683387659250431692751255099808162970657410517657862174602556590616568690423540284801267472920128909691902547970614008613488242333460665145840144517097342073878746293059960326132795671583153307437896728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

250255

Kredit diberikan ke @hvd dalam jawaban Brainfuck ini , jadi pastikan untuk menghapusnya!

Penjelasan:

Saya akan menulis penjelasan sendiri, tetapi menyadari bahwa penjelasan @hvd sudah tepat, jadi saya akan mengutipnya di sini:

>>>>>> diperlukan untuk meninggalkan sedikit ruang kerja.

-menghasilkan 255 ( sejak 0 - 1 = 255 ketika kita memiliki sel pembungkus ).

[[->>>+<<<]------>>>-] mengubahnya menjadi 255 salinan dari nilai 250, memberikan rekaman yang terlihat seperti:

0 0 0 0 0 0 250 0 0 250 0 0 ... 250 0 0 [0]

<<<[<<<]+ memindahkan penunjuk data kembali dan menyelesaikan data awal:

0 0 0 [1] 0 0 250 0 0 250 0 0 ...

Kemudian datang loop: [+...-]awalnya menetapkan 1 ke 2, yang akan diatur kembali ke 1 di akhir loop. Loop berakhir ketika badan loop sudah diatur 2 ke 1.

Sekarang, angka 2 250 250 250 ... 250 mewakili penghitung, dalam basis 250, dengan masing-masing angka satu lebih besar dari angka yang diwakilinya.

  • [>>>]<<<bergerak sampai ke kanan. Karena setiap digit diwakili oleh angka bukan nol, ini sepele.

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-mengurangi penghitung dengan 1. Dimulai dengan digit terakhir: digit tersebut akan dikurangi. Jika tetap positif, kita sudah selesai. Jika berubah menjadi nol, atur ke 250, dan lanjutkan dengan digit sebelumnya.

  • [<<<].>>>memindahkan penunjuk kembali sebelum digit paling kiri, dan ini adalah momen yang baik untuk mencetak byte NUL. Kemudian posisikan kembali ke digit paling kiri, untuk melihat apakah kita sudah selesai.

Untuk memverifikasi kebenaran, mengubah awal -untuk +untuk mencetak 250 1 NUL byte, ++untuk 250 2 , dll

Kevin Cruijssen
sumber
4

19326644346528796447 byte

Kode Brainfuck:

>+[+[[+>->-<<]->>+].<]

Cetakan

57896044618658097711785492504343953926634992332820282019728792003956564819967

byte nol.

Ini berfungsi seperti ini:

mem[i]=255;
do
    while(--mem[i]){
        mem[i+1]=mem[i+2]=mem[i];
        mem[i]=1;
        i+=2;
    }
while(mem[--i]);

Rekursi yang cukup mudah.

jimmy23013
sumber