Meşgul beyin kunduz


13

Mümkün olduğunca çok adım atan ancak sonsuz döngü yapmayan en fazla 256 karakterden oluşan bir beyin yazma programı yazın. Program herhangi bir giriş alamayabilir.

Daha spesifik olarak:

  • Sağda sonsuz sayıda hücre olduğunu varsayın.
  • En <soldaki hücrede hiçbir şey yapılmaz.
  • A -, hücre değeri sıfır olduğunda hücreyi olarak ayarlar 255.
  • Talimatların +-<>.tümü yürütüldüğünde bir adım olarak sayılır.
  • A [veya ]ile karşılaşıldığında, bir adım olarak sayılır. Ancak, koşul doğru olduğunda ve kontrol akış gelen atlarsa ]veya [yok değil yine bir adım olarak sayılır.
  • En çok adım atan çözüm kazanır.
  • Çözümünüzde bir tür desen varsa, benzer bir uzunluk programının kaç adım natacağına dair bir işlev vermek takdir edilir, ancak zorunlu değildir.
  • Talimatları saymak için bu değiştirilmiş yorumlayıcıyı kullanabilirsiniz :

Misal:

++[-]

Karşılaşılan talimatlar ++[-]-]ve program 7 adımda çalıştırıldı.


6
Eğer kazanan çevirmen sayısını aşmadan sona ererse şaşırırdım. 6 durumlu TM meşgul kunduzunun en az 10 ** 36534 adım attığını unutmayın.
Peter Taylor

Katılıyorum. Muhtemelen yıllarca çalışabilecek bir <50 char BF programı yazabilirsiniz. Başlayacağım.
captncraig

İmza. Drb.insel.de/~heiner/BB adresindeki Meşgul Kunduz araştırma sayfası çok ilginç, özellikle kayıt programlarının çok uzun sürmesi ve hala kesin sonuçlara sahip olması (bkz. Drb.insel.de/~heiner/BB/bb -xlist.txt ) - simülasyonlar durumları hatırlar, simülasyon adımlarını kaydetmek için "makrolar" oluşturur.
schnaader

4
@AntonGolov: Eğer 256 ^ daha büyük mağaza bignums çalıştığınızda maalesef bu evrende, RAM'ler ve HDs sonsuz depolama aygıtlarına dönüştürme yapmayan bayt boyutu ... onlara
turn durdurdu counterclockwis

1
@boothby Mevcut bilgisayarlarda aşkınları içeren kesin hesaplamalar yapmak mükemmel bir şekilde mümkündür. Değerlerin bileşenleri, genel günlük hesaplama için kullanılan normal floatveya doubleilkellerden daha soyut bir gösterimde depolanmalıdır . (Bu noktada bilgisayar çoğunlukla sadece denklemi temsil eden dizeleri
işliyor

Yanıtlar:


15

İşte sonunda durur ve 10 ↑ (10 ↑ 28) bitişik hücreyi 1'e eşit olarak ayarlanmış bırakarak 41 karakterli bir programdır (bu nedenle yürütülen talimat sayısı bundan çok daha fazladır):

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

Yanılmıyorsam, bu, her bellek hücresi için tek bir bit kullanan BF değişken dilinde aşağıdaki programın doğru çevirisidir (yani, 0..255 yerine hücre içeriği 0..1, yani '+' sadece bit değerini çevirir):

>+>+>+>+[+>[>]+[+>[>]+[+>[>]+[<]+<]+<]+<]

İkinci program tarafından üretilen tam değer (bitişik 1 bit sayısı)

3 * (2 ↑ 118842243771396506390315925503 - 1) + 1.


Yukarıdaki program 2 ↑↑ x ( Knuth yukarı ok gösterimlerinde ) gibi büyüyen bir işlevi başlatır ve hesaplar . 2 ↑ 23 x gibi büyüyen bir işlevi başlatan ve hesaplayan bir varyant-BF programının benzer dönüşümü aşağıdaki 256 karakterli programı sağlar:

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

sonuçta durur, 2 6 23 6'dan fazla bitişik hücre 1'e eşit olarak ayarlanır (bu nedenle adım sayısı bundan çok daha fazladır).

NB-1 : 2 ↑ 23 6 "inanılmaz derecede büyük" bir sayıdır; örneğin, 2 ↑ 4 6 = 2 ↑↑↑↑ 6 bile Graham'ın sayısını hesaplamak için kullanılan sekanstaki ilk terimi (3 ↑↑↑↑ 3) zaten geçmektedir .

NB-2 : Bence bir BF programının Graham'ın sayısından çok daha büyük çıktı ile bir işlevi başlatması ve hesaplaması için 256 karakter yeterli olacaktır - eğer zaman bulursam, belki bir tane yazmaya çalışacağım.

NB-3 : Yukarıdaki programların kökeniyle ilgilenen biri varsa, Python'da yazılmış çeşitli programlarla "Brainf * ck F" için bazı programlama kaynakları . ("Brainf * ck F" veya sadece "F", Smallf * ck esolanguage'in Turing-complete bir varyantı olarak adlandırdığım şeydir.) Şimdi birkaç yıldır çevrimdışı olan bu dosyaları yükledim ve şimdilik bağlantılı web sayfası sadece bir "dosya dolabıdır" - yukarıdaki programlarla ilgili ayrıntılı bir tartışma için Busy_Beavers.txt dosyasına bakın.


Bu şu anda açık bir kazanan (sadece diğerlerini hafife almadıkça). Daha fazla öneri bekliyoruz, ancak şimdilik kabul edildi olarak işaretleyeceğim. Birisi katılmazsa, lütfen yorum yapın.
Anton Golov

Bu seviyeye geldiğinizde, sonsuz hafızaya sahip bir tercümana sahip olduğunuzu varsaymak gerçekçi olmaz. Bunun sonlu ambalaj belleği ile daha iyi bir meydan okuma olacağını düşünmeye başladım, bu yüzden aslında cevapları çalıştırabiliriz.
captncraig

9

İşte 39 karakterlik güzel bir karakter:

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

Temelde 3 boşluk genişliğinde 'kızak' yapar, sağa hareket eder ve birer birer azalır. 31.919.535.558 talimatta tamamlandı, en içteki döngü 256 ^ 3 kez yürütüldü. Yine de, çalışma süresine göre 14 karakterlik bir oranda bunu genişletmek için bolca alanım var.

Sınırsız belleğe veya sarma belleğine sahip herhangi bir yorumlayıcı üzerinde çalışır.

2 döngülü sürümün ne zaman biteceğini belirlemek için okuyucuya bir egzersiz bırakıyorum:

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

Şimdi bir gecede devam ediyor ve 3.000.000.000 adımdan fazla. Hala dış halkanın tek bir yinelemesinden geçemedi. İkinci döngünün% 15'ini zorlukla elde etti.


2

Bu programlar infinte hücre sayısında çalışır. Başlangıçta ascii değerleri 255 ile iki değer başlatılır. Ana döngünün ilk dönüşündeki ilk değer 255 hücreye ayrılır ve her biri 255 ile başlatılır, ana döngünün ikinci dönüşünde 255 hücrede her değer tekrar bölünür 255 * 255 hücreye kadar, ana döngünün 255 dönüşü için aynı şekilde başlatılan toplam hücreler 255 ^ 255 olacaktır. İkinci değer, ana döngünün kaç kez tekrarlanacağını belirler.

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

2

Bu program önceki programımla hemen hemen aynı, fark, dış döngüyü belirleyen değerin belirli bir hücrede sabit kalması, böylece hem başlatılan hücre sayısının hem de programın sonundaki toplam adımların arttırılabilmesidir.

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

program sonunda başlatılan hücreler 255 ^ 255

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

program sonunda başlatılan hücreler 255 ^ 255 ^ 3

Daha da fazla adımda çalışacak şekilde değiştirdim.

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

ana döngünün ikinci dönüşü sırasında 255 ^ 255 hücre ana döngünün ilk dönüşü sırasında 255 ^ 255 hücre başlatır 255 ^ {255 ^ (255 ^ 255 * 255) * 255} bu şekilde döngü 255 kez tekrarlanır


Harika görünüyor! Henüz bir yanıtı kabul etmediğim için üzgünüm. Bunlara bakmak ve büyüme düzenini bulmak için biraz zaman ayırmam gerekiyor. "255 ^ 255 * 255" derken, "255 ^ (255 * 255)" mu demek istediniz? (Aksi takdirde "255 ^ 256"
beklerim
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.