Benzersiz çıktıları olan Brainf *** alt programları


19

100 baytlık uzun beyinli (BF) bir program yazmalısınız.

Bir karakter, sonuçta ortaya çıkan 100 yeni (99 bayt uzunluğunda) programdan mümkün olan her şekilde kaldırılacaktır. Program için Örn ++.>.5 alt programlarıdır +.>., +.>., ++>., ++..ve ++.>.

Puanınız 100 programın ürettiği benzersiz çıktıların sayısı olacaktır. Daha yüksek puan daha iyidir.

ayrıntılar

  • İlk karakter çıktıktan sonra programlarınız sonlandırılacaktır.
  • Geçersiz veya sonlandırılmayan programlar ve boş çıktılar üreten programlar skora dahil edilmez.
  • BF hücreleri 8 bit sarma hücreleridir. (255 + 1 = 0, 0-1 = 255)
  • Programınıza girdi verilmiyor. Kodda kullanırsanız ,, geçerli hücre olarak ayarlanır 0.
  • Başlangıç ​​konumunun sol tarafında hücre yoktur. Örn <.. Geçersiz ancak .<yürütme işlemi sonlandırıldığı için geçerlidir .. Bant diğer yönde bağlanmamıştır.
  • Dengesiz köşeli parantez ( [ve ]) olan programlar geçersiz.
  • Orijinal programınız 100 bayttan daha kısa olabilir, çünkü skoru değiştirmeden 100 bayta genişletmek kolaydır.
  • Orijinal programınızın geçerli BF kodu olması gerekmez.

Sen kullanabilirsiniz Bu python3 programı (ideone bağlantı) Cevabınız skorunu belirlemek için. (Uzun süren programlar için maxstepdeğişkeni değiştirmeniz gerekebilir .)

Misal

(Basit olması için bu program 100 bayttan kısadır.)

Solution: ++,+[-]+><.-,-.

Score: 3

Explanation:

Subprogram     => Output

+,+[-]+><.-,-. => 1
+,+[-]+><.-,-. => 1
+++[-]+><.-,-. => 1
++,[-]+><.-,-. => 1
++,+-]+><.-,-. => None
++,+[]+><.-,-. => None
++,+[-+><.-,-. => None
++,+[-]><.-,-. => 0
++,+[-]+<.-,-. => None
++,+[-]+>.-,-. => 0
++,+[-]+><-,-. => 255
++,+[-]+><.,-. => 1
++,+[-]+><.--. => 1
++,+[-]+><.-,. => 1
++,+[-]+><.-,- => 1

Unique outputs are [0, 1, 255]    
Score is 3 for ++,+[-]+><.-,-. (length = 15)

Beraberlik durumunda kazanan, daha kısa koda sahip olan kişidir. (Programınız Ayrıntılar bölümünde belirtildiği gibi 100 bayttan daha kısa olabilir.) Kodlar eşit uzunlukta ise kazanan önceki posterdir.

Bonus bulmaca: cesur kısıtlama olmadan puan 100 ile bir program bulabilirsiniz?


Bonus bulmacayı çözdüm; cevap (sansür).
AJMansfield

@AJMansfield Başkalarının da bulmacayı düşünebilmesi için yorumunuzu düzenleyebilir misiniz? Çözümünüzü , yanıtı içeren bir pastebin.com bağlantısına değiştirin .
randomra

3
Hmm. Bu soruya , mevcut cevaplarda mikro iyileştirmeler bulmaya çalışmak için genetik bir optimize edici yazdım , ancak şu ana kadar çok başarılı değil. Sırasıyla 79 ve 43'te takılıyorlar. Ah iyi - denemeye değerdi!
wchargin

Yanıtlar:


12

Puan: 35 41 69 78 79 83

(Yeni satırı kaldırın.)

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

Çevrimiçi deneyin!

Neden çalıştığını tam olarak bilmiyorum ...

Puan: 79

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

Çevrimiçi deneyin!

Bu edildi gerekiyordu 2 Özetle * mem [i] '* i ve adresleri sağdan sola doğru sayılır hücre sayısını (+ sabit) ekleyin. Çarpan 2 ve hücre sayısı + ve> farklı pariteye sahip olabilir.

Gerçekten 69 puan sürümünde böyle çalıştı. Ancak son sürüm bunu kırdı ve tesadüfle başka bir şey aldı. Toplamı (mem [i] * i + i + 1) hesaplar ve + ve> işaretini kaldırır, ancak hücre sayısının farkına sahip toplam (i) hariç, aynı zamanda farklı çıktıların sayısı da aynıdır. + ve> işaretlerini kaldırmak için.

Bonus için:

+. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +.


Not: bunu sağlanan skor programı ile test ederseniz , bazı alt programlar uzun süre çalıştığından maxstepdeğeri (in def evaluate(r,maxstep=20000):) artırdığınızdan emin olun .
randomra

1
Aslında aslında puan ile 79değiştirilebilir->+>+> ...->,>+> ...
BrainSteel

@BrainSteel bunu bir no-op olarak değiştirdim.
jimmy23013

9

Puan: 37 43

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

EDIT: Şimdi benim program bazı köşeli parantez izin verir. Onunla hiçbir ödül kazanmayacağım, ama bazı ağırlıklı RNG'leri benim için yoğun iş yapmak için aldığım şey bu.

Bu, C dilinde yazdığım bir program tarafından oluşturuldu.

NKaldırılan her karakter için çıktılar şunlardır:

N = 0 => 158
N = 1 => 158
N = 2 => 158
N = 3 => 187
N = 4 => 129
N = 5 => 100
N = 6 => 158
N = 7 => 13
N = 8 => 1
N = 9 => 211
N = 10 => 129
N = 11 => 1
N = 12 => 57
N = 13 => 255
N = 14 => Mismatched Braces
N = 15 => 59
N = 16 => 11
N = 17 => 11
N = 18 => 11
N = 19 => 117
N = 20 => 11
N = 21 => 117
N = 22 => 166
N = 23 => Mismatched Braces
N = 24 => 206
N = 25 => 206
N = 26 => 206
N = 27 => 147
N = 28 => 147
N = 29 => 158
N = 30 => 148
N = 31 => 188
N = 32 => 51
N = 33 => 17
N = 34 => 84
N = 35 => 84
N = 36 => 84
N = 37 => 158
N = 38 => 158
N = 39 => 94
N = 40 => 46
N = 41 => 94
N = 42 => 94
N = 43 => 94
N = 44 => 17
N = 45 => 196
N = 46 => Mismatched Braces
N = 47 => 149
N = 48 => No Termination
N = 49 => No Termination
N = 50 => Mismatched Braces
N = 51 => Mismatched Braces
N = 52 => 45
N = 53 => 77
N = 54 => 45
N = 55 => 77
N = 56 => 50
N = 57 => 209
N = 58 => 50
N = 59 => 251
N = 60 => 249
N = 61 => 99
N = 62 => 99
N = 63 => 117
N = 64 => 89
N = 65 => 207
N = 66 => 89
N = 67 => 115
N = 68 => 115
N = 69 => 115
N = 70 => 95
N = 71 => Mismatched Braces
N = 72 => Mismatched Braces
N = 73 => 104
N = 74 => Mismatched Braces
N = 75 => No Termination
N = 76 => No Termination
N = 77 => No Termination
N = 78 => No Termination
N = 79 => Left Overflow
N = 80 => 3
N = 81 => 2
N = 82 => No Termination
N = 83 => Mismatched Braces
N = 84 => No Termination
N = 85 => 133
N = 86 => 133
N = 87 => 0
N = 88 => Mismatched Braces
N = 89 => 158
N = 90 => 0
N = 91 => 4
N = 92 => Mismatched Braces
N = 93 => 0
N = 94 => 158
N = 95 => Mismatched Braces
N = 96 => 0
N = 97 => 157
N = 98 => 159
N = 99 => None

Toplam 37 benzersiz çıkış vardır, bunlar (sayısal sırayla):

0, 1, 2, 3, 4, 11, 13, 17, 45, 46, 50, 51, 57, 59, 77, 84, 89, 94, 95, 99,
100, 104, 115, 117, 129, 133, 147, 148, 149, 157, 158, 159, 166, 187, 188, 
196, 206, 207, 209, 211, 249, 251, 255

Bu çözümün optimal olmadığından% 90% 100 eminim , ancak bunun çok zor olabileceğini kanıtlıyorum . Açık olan birkaç şey var. .Son karaktere kadar hiçbir sembolün olmaması, yolun bir yolu gibi görünüyor ve köşeli parantezler ( []) oldukça işe yaramaz gibi görünüyor . Burada biraz düşünmek istedim, ana hatlarını çizmek istiyorum:

Izin vermek Lkodu uzunluğu bayt olarak (meydan okuma, 100), ve nalt programları benzersiz çıkışların sayısı.

Çünkü L=3, formun birkaç optimal çözümü vardır +-., burada n=2(bu durumda, çıktılar sırasıyla +.ve için -.sırasıyla 1 ve 255'tir .) Bu, L = 3at için en iyi oranı verir n/L = 66.67%. Bu oranın en azından geçemeyeceğini unutmayın L<10.

Çünkü L=10, çözümler kaba kuvvet uygulayacak kadar basittir. İşte en iyi çözümler n = 6:

++>-->+<+. => 6
++>-->+<+. => 6
+++>->+<+. => 6
--->->+<+. => 6
++>---><+. => 6
+++>--><+. => 6
-->++>-<-. => 6
+++>+>-<-. => 6
--->+>-<-. => 6
-->+++><-. => 6
--->++><-. => 6

Hangi bir puan oranı verir n/L = 60%.

Olarak L->infinity, oran, bir potansiyel olarak sonsuz için, çünkü orada sadece 255 olası çıkış 0 yaklaşım gerektiği açıktır L.

Ancak oran eşit olarak azalmaz. Bunun için bir çözüm oluşturmak mümkün değildir n=6, L=9, bu kadar mümkün olan en iyi oranı L=9olan 5/9 = 55.56% < 60%.

Bu, soru ne kadar hızlı ve hangi konuda, oran aşağı iniyor? İçin L = 100ve en 10^9 checks/secondoptimal bir çözüm bruteforce uzun evrenin ömründen daha birkaç kat alacaktı. Bu konuda zarif bir yol var mı? O aşağı olduğunu ben çok şüphe 37%için L = 100.

Oran aslında artar L=100. Onaylamak için diğer yanıtları görüntüleyin.

Yukarıdakilere ilişkin değerlendirmelerinizi duymak isterim. Ne de olsa acımasızca yanlış olabilirdi .

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.