Belirli bir uzunlukta bir dize çıktısı veren bir Brainf_ck programı oluşturun


11

Arkadaşınız tuhaf bir kilitleme sistemine sahip bir kasaya girmeye çalışıyor: belirli bir noktada belirli sayıda nazik vurma gerektirir. Arkadaşınız numarayı keşfetti (1 ... 99999 aralığında) ve gerekli düğmeleri üreten bir gadget'a sahip. Ancak, gadget bir Brainfuck yorumlayıcısıdır! Bu yüzden arkadaşınızın bir Brainfuck programını beslemesi gerekiyor, ki bu da mümkün olduğunca kısa olmalı (aracın G / Ç yavaş).

Senin görevin ona yardım etmektir! Herhangi bir dilde, sayı girişi kabul eden ve girdi Nalmayan ve yazdırılabilir ASCII karakter dizisi (33 karakter aralığı içindeki boşluk karakteri - kodlar hariç) çıkaran bir Brainfuck programı çıkaran bir program veya altyordam yazın . 126) uzunluğundadır N.

Örnek: giriş 10için çıkış

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

(ama eminim kısaltılabilir!)

Puanınız, aşağıdaki değerlere ilişkin çıktılarınızın uzunluklarının toplamı olacaktır N(rastgele sayılardır):

55
68
15
28
841
838
522
846
4898
9004
9363
3810
13230
67175
37231
44701

Oh, ve Twitter'da kodunuzu (jeneratör programı) arkadaşınıza ileteceksiniz. 140 karakter veya daha kısa olduğundan emin olun !


PS Brainfuck dilinin birçok çeşidi vardır. Bandın her iki yönde (veya "dairesel ve yeterince büyük") sonsuz olduğunu ve hücrelerin 32 bit int kapasitesine (sonlu ve 99999'a kadar sayıları tutabildiğini) varsayalım. Ayrıca, sargı yok: bir hücre taştığında, makine kendini yok eder!


2
"N'nin aşağıdaki değerleri (rastgele sayılardır)" hatırlattı bana xkcd.com/221
cirpis

Sadece referans olarak, boşluk karakteri (karakter kodu 32) genellikle yazdırılabilir ASCII aralığına dahil edilir. Aralığı açık bir şekilde tanımladığınızdan, bu meydan okuma için gerçekten bir fark yaratmaz.
Martin Ender

3
Brainfuck'taki hücrelerin rastgele genişlik tamsayıları olduğunu varsayabilir miyiz? Değilse, nasıl ve ne zaman sararlar?
orlp

1
En azından 67175 + birkaçını içerebileceğini varsaymak güzel olurdu.
orlp

@anatolyg Bunu daha sonra fark ettim. Afedersiniz.
Esolanging Fruit

Yanıtlar:


3

Python 2, puan: 1021

Bu yarışmanın oldukça eski olduğunu fark ettim ama yine de, yayınlananlardan daha iyi bir çözüm bulduğum için, ben de yayınladım.

İşte işi yapan 102 baytlık bir python betiği:

n=input()
s='>'
while n:
    s+='>'+'+'*(n%5+1);n/=5
print s+'[->[-<+++++>]<<]<+++++++[>+++++<-]>>[-<.>]'

Fikir, N için baz 5 kodlamasını kullanmaktır (en azından akım girişleri için en iyi baz, bu arada çok "rastgele" görünmüyor, OP tarafından keyfi olarak seçildikleri gibi görünüyor) ve genel bir Brainfuck algoritması yazmak bir dizi keyfi uzunluğu deşifre edin (sayı, dönüşümün sonunu tespit etmek için her basamak birer birer artırılarak kodlanır). 35 karakterini yazdırmayı seçtim# karakterini , 36 karakteri $eşdeğerdir.

Skoru elde etmek için aşağıdaki bash betiğini çalıştırabilirsiniz:

i=0
while read p; do
  i=$((i+`echo $p | python convert.py | wc -m`))
done
echo $i

Kodlamayı küçük sayılar için çarpma ile değiştiren ve her sayıyı kodlamak için en iyi tabanı seçen daha gelişmiş bir programla, 958 Brainfuck karakterine ulaşabilirim, ancak Python çok ayrıntılı (ve oldukça kötü / tembel bir golfçüyüm) 144 bayta dönüştürmek için!


Bu harika bir fikir! Belki bu cevabı geliştirmek için bir kez kullanacağım (950'den daha az puan almak için Python'da bir senaryo yazdım, ancak yeterince kısaltmak için herhangi bir golf dili bilmiyorum).
anatolyg

8

BrainF ***, skor: 193.313

140 karakterin altında değil (147, çok yakın !!), bu yüzden bu kazanamaz, ama havalı olduğunu düşündüm.

43 artı işaretini, ardından Nnokta sayısını yazdırır . Çok uygun değil.

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

Eğer birisi bunu kısaltmaya yardımcı olabilirse çok isterim.


Ben Brainfuck ile teyp girişini alan bir "altyordam" yapmak için yeterli olacağını düşünüyorum - "standart giriş cihazı" okumaya gerek yok.
anatolyg

@anatolyg Bu çok daha kolay - muhtemelen yaklaşık 80 veya 90 karakter. Değiştirmeli miyim?
mdc32

5

J, Toplam puan = 1481

(Önceki giriş ve açıklamalarım için düzeltme geçmişini kontrol edin.)

f10=.('>++++++++++<';'')rplc~;@([:(<@('+++++[>+++++++<-]>>+',;@((<'[>++++++++++')#~#)),[<@(']',~'<-','<.>'#~],[,])"0 #-i.@# )10#.inv])

Bu işlev, giriş numarasının temel 10 rakamını temel alarak iç içe BF döngüleri oluşturur. Tüm makul bazların kontrol edilmesi ve en küçük BF kodunun seçilmesi skoru az miktarda artıracaktır.

Test seti için BF programları:

   f10 every 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
+++++[>+++++++<-]>>+[>++++++++++[-<<.....>>]<-<.....>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[-<<......>>]<-<........>]                                                                                 
+++++[>+++++++<-]>>+[>++++++++++[-<<.>>]<-<.....>]                                                                                         
+++++[>+++++++<-]>>+[>++++++++++[-<<..>>]<-<........>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<.>]                                                             
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<...>>]<-<........>]                                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<.....>>>]<-<<..>>]<-<..>]                                                                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<......>]                                                        
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<....>>>>]<-<<<........>>>]<-<<.........>>]<-<........>]                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<>>>]<-<<>>]<-<....>]                                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<...>>>]<-<<......>>]<-<...>]                              
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<...>>>>]<-<<<........>>>]<-<<.>>]<-<>]                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<.>>>>>]<-<<<<...>>>>]<-<<<..>>>]<-<<...>>]<-<>]                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<......>>>>>]<-<<<<.......>>>>]<-<<<.>>>]<-<<.......>>]<-<.....>]
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<...>>>>>]<-<<<<.......>>>>]<-<<<..>>>]<-<<...>>]<-<.>]          
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<....>>>>>]<-<<<<....>>>>]<-<<<.......>>>]<-<<>>]<-<.>]          

Test setindeki hesaplama puanı:

   +/#@> f10 each 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
1481

3

Pyth, 1702

N + x faktörlerini kullanarak sayıları yeniden oluşturun.

+holN+]++">>"*"+"Q"<<"mjk(">>"j">"m*"+"kP+Qd"<[[->[->+>+<<]>>[-<<+>>]<<<]>[-]>[-<<+>>]<<<]>"*"-"d"<<")50"++++++[>++++++<-]>>[<.>-]"

İçin 2bu çıkışlar ++. Şimdi BF'de hiçbir şey yazdırmıyor.
randomra

@randomra İyi yakala, bu güncelleme sırasında oldu, düzeltirim, bana birkaç tane ver.
orlp

@randomra Sabitlenmeli, skor biraz daha yüksek olmalıdır (tabii ki).
orlp

3

CJam, 52 74 108 bayt, toplam = 1304 1244 1210

ri5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**

Bir test komut dosyası (çevrimiçi yorumlayıcıda yavaş):

q~]
{
_[0:T;
5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**
]s
_[L:RL@0\
"-+><.]"['('){+\_{)}0?@\}{@\+\_{)}0?}{R1$c+:R;}]:`"]a"{{_aa+1$4G#%{:~~1}{;0}?}g}`+a+er:~:~
];R,@=!"Error."N+*o
}%s,

Kendini yok etme ile ilgili kısmı görmedim. Ama yine de asla taşmayacak.
jimmy23013

O nasıl çalışır?
anatolyg

@anatolyg İlk sürüm sadece temel 5'teki sayıyı oluşturur. Daha sonraki sürümler ilk iki basamak için özel bir durum ekledi ve ayrıca azaltma kullandı.
jimmy23013

@ user23013 Ah, üzgünüm, teknik özellik değişikliklerini görmedim. (Cevabımı buna göre güncelledi.)
randomra

2

Befunge-98, N + 41, toplam = 193281

&>'+\:v
v^-1,\_
' >1-:v
>v^,+'_
,'    :
>ff3++^
>2f*+v
^>/9+:,
>'>,61v
, v*6+<
^/2,:<@
v >+2+,
>'<,']^

Kötü olduğunu biliyorum, ama bugün biraz Befunge yazmak gibi hissettim. Befunge'nin en iyi yanı, programların gerçek golf dillerinden daha az anlaşılabilir olmasıdır, özellikle de kodu tekrar kullandıklarında: D

Martin Büttner'ın CJam cevabına benzer bir algoritma kullanır :

(N +'s)>+++++++++++++++++++++++++++++++++<[->.<]


1

Befunge-93-24 + N, toplam = 193009

&>">>]-<]-<++++>[++++>[+++"v
v  ,,,,,,,,,,,,,,,,,,,,,,, <
>:v
,v_@
"1
.-
"
^<

Bu +++[>++++[>++++<-]<-]>>, ilk teyp dizinini 24 karakterle '0' olarak ayarlamak için bir önek kullanır . Befunge programı çok basittir ve N 'ile birlikte çıktılar.' karakter.


Şimdi bunu gördüğüme göre, döngümün neden daha iyi olacağını düşündüğümü bilmiyorum ...
Martin Ender
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.