Daha uzun bir dil programı yapın


16

Lenguage , kaynak kısıtlama zorluklarını kırmasıyla tanınan bir beyin kancasıdır . Çünkü Lenguage, içeriğinin değil yalnızca kaynağının uzunluğunu önemsiyor.

İlk olarak, programın uzunluğu hesaplanır. Daha sonra, bahsedilen uzunluk ikilik biçime dönüştürülür ve sıfırlar ile 3'ün katlarına sol dolgulu olur. Ortaya çıkan ikili dizge, her biri bir beyin sıkışması komutuna dönüştürülen 3 bitlik parçalara bölünür:

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

Son olarak program beyin fırtınası 1 olarak çalıştırılır .

Buradan meydan okuma, oldukça basit hiçbir girdi alır ve üretir bir byte tekrarlanan tamsayı oluşan çıktıyı bir yüksek oranlarda konuşma programı yazmak zamanlarda, nerede programın uzunluğundan daha sıkı büyüktür.nn

Cevaplar daha az bayt daha iyi olacak şekilde bayt cinsinden puanlanacaktır.

Brainfuck'tan dilini hesaplamak için hacky bir program


1: Bu meydan okuma için sarma hücreleri ve ambalajsız bir bant kullanacağız.


3
+[.]Kazanır mıyım? : P
Quintec

3
Çıktının uzunluğuna göre puan almak belki daha ilginç olabilir?
Jo King

@JoKing Bu iyi bir fikir. Ne yazık ki bunun için biraz geç görünüyor.
Post Rock Garf Hunter

2
Ayrıca, bu neden etiketli quine?
Cehalet

1
@ msh210 Bu çoğu zaman işe yarayacaktır, ancak birkaç fark vardır, örneğin farklı Brainfuck karakterleri farklı miktarlara ( +en ucuz ve ]en pahalı olan) mal olur ve elbette programın neresinde oldukları önemlidir. İken iyi tahmindir tam olarak eşdeğer değildir. 23n
Post Rock Garf Hunter

Yanıtlar:


15

8437495638205698686671 bayt

Bu brainfuck programına çevirir:

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

Hangi tam olarak yazdırır 231584178474632390847141970017375815706539969331281128078915168015826259279614 SOH bayt.

Bu fonksiyon tarafından hesaplanır

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

255 giriş ile.

Açıklama:

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

4

9093903938998324939360576240306155985031832511491088836321985855167849863863065731015823 bayt

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

Tam olarak hangi baskı

298333629248008269731638612618517353495058861384016275770860733328251135402804732197446995616017112134460464130233444058136509123809012106419446593183683387659250431692751255099808162970657410517657862174602556590616568690423540284801267472920128909691902547970614008613488242333460665145840144517097342073878746293059960326132795671583153307437896728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

250255

Kredi , bu Brainfuck cevabında @hvd'ye gidiyor , bu yüzden onu oyladığınızdan emin olun!

Açıklama:

Kendi bir açıklama yazacaktım, ama fark @hvd 'ın açıklaması zaten yerinde, bu yüzden burada bunun yerine alıntı yapacağım:

>>>>>> biraz çalışma alanı bırakmak gerekiyor.

-255 üretir ( sarma hücremiz olduğunda 0 - 1 = 255 olduğundan ).

[[->>>+<<<]------>>>-] bunu 250 değerine sahip 255 kopyaya dönüştürür ve şöyle görünür:

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

<<<[<<<]+ veri işaretçisini geri taşır ve ilk verileri tamamlar:

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

Sonra döngü geliyor: [+...-]başlangıçta 1'i 2'ye ayarlar, bu da döngünün sonunda 1'e geri döner. Döngü gövdesi zaten 2'ye 1 ayarlandığında döngü sona erer.

Şimdi, 2 250 250 250 ... 250 sayıları, taban 250'de, her bir sayı temsil ettiği rakamdan bir tane daha büyük olan bir sayacı temsil eder.

  • [>>>]<<<tamamen sağa hareket eder. Her basamak sıfırdan farklı bir sayı ile temsil edildiğinden, bu önemsizdir.

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-sayacı 1 azaltır. Son rakamdan başlayarak: rakam azalır. Eğer pozitif kalırsa, işimiz bitti. Sıfıra dönerse, 250'ye ayarlayın ve önceki rakamla devam edin.

  • [<<<].>>>işaretçiyi en soldaki rakamdan önce geri taşır ve bu bir NUL bayt yazdırmak için güzel bir andır. Ardından, işimiz bittiğini görmek için tam olarak en soldaki basamağa yeniden konumlandırın.

Başlangıç değiştirmek doğruluğunu doğrulamak için -için +için 250 baskı 1 , NULL bayt ++için 250 2 , vs.


4

19326644346528796447 bayt

Brainfuck kodu:

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

Baskılar

57896044618658097711785492504343953926634992332820282019728792003956564819967

boş bayt.

Şöyle çalışır:

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

Oldukça basit özyineleme.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.