Tạo chương trình Brainf_ck tạo ra chuỗi có độ dài nhất định


11

Bạn của bạn đang cố gắng đột nhập vào một kho tiền có hệ thống khóa đặc biệt: nó đòi hỏi một số lần gõ nhẹ nhàng nhất định ở một vị trí cụ thể. Bạn của bạn đã phát hiện ra số (nằm trong phạm vi 1 ... 99999) và sở hữu một tiện ích tạo ra các cú gõ cần thiết. Tuy nhiên, tiện ích là một thông dịch viên Brainfuck! Vì vậy, bạn của bạn cần cung cấp cho nó một chương trình Brainfuck, rõ ràng là càng ngắn càng tốt (I / O của tiện ích chậm).

Nhiệm vụ của bạn là giúp anh ấy! Viết chương trình hoặc chương trình con, bằng bất kỳ ngôn ngữ nào, chấp nhận làm đầu vào một số Nvà xuất ra chương trình Brainfuck, không nhận đầu vào và xuất ra một chuỗi các ký tự ASCII có thể in được (không bao gồm ký tự không gian - mã trong phạm vi 33 ... 126) chiều dài N.

Ví dụ: đối với đầu vào 10, đầu ra có thể là

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

(nhưng tôi chắc chắn rằng nó có thể được rút ngắn!)

Điểm của bạn sẽ là tổng độ dài của kết quả đầu ra của bạn cho các giá trị sau của N(chúng là các số ngẫu nhiên):

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

Ồ, và bạn sẽ truyền mã của bạn (chương trình tạo) cho bạn bè của bạn bằng Twitter. Vì vậy, hãy đảm bảo rằng nó có 140 ký tự hoặc ít hơn!


PS Ngôn ngữ Brainfuck có nhiều biến thể. Giả sử băng là vô hạn theo cả hai hướng (hoặc "đủ tròn và đủ lớn") và các ô có dung lượng int 32 bit (hữu hạn và có thể giữ số lên tới 99999). Ngoài ra, không có gói: khi một tế bào tràn, máy sẽ tự hủy!


1
"Các giá trị sau của N (chúng là các số ngẫu nhiên)" làm tôi nhớ đến xkcd.com/221
cirpis 17/03/2015

Chỉ để tham khảo, ký tự khoảng trắng (mã ký tự 32) thường được bao gồm trong phạm vi ASCII có thể in được. Nó không thực sự tạo ra sự khác biệt cho thử thách vì bạn đã xác định rõ ràng phạm vi.
Martin Ender

3
Chúng ta có thể giả sử các tế bào trong brainfuck là số nguyên chiều rộng tùy ý không? Nếu không, làm thế nào và khi nào họ bọc?
orlp 17/03/2015

1
Sẽ tốt hơn nếu giả sử ít nhất có thể chứa 67175 + một vài.
orlp 17/03/2015

@anatolyg Tôi nhận ra điều đó sau. Lấy làm tiếc.
Esolanging Fruit

Câu trả lời:


3

Python 2, điểm: 1021

Tôi mới nhận ra rằng cuộc thi này khá cũ nhưng vẫn vậy, vì tôi đã đưa ra một giải pháp tốt hơn những cuộc thi được đăng, tôi cũng đã đăng nó.

Đây là một kịch bản python 102 byte thực hiện công việc:

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

Ý tưởng là sử dụng mã hóa cơ sở 5 cho N (cơ sở tốt nhất ít nhất là cho các đầu vào hiện tại, có vẻ không "ngẫu nhiên" lắm, có vẻ như chúng được OP tùy ý chọn) và viết thuật toán Brainfuck chung cho giải mã một số độ dài tùy ý (số được mã hóa với mỗi chữ số tăng thêm một để phát hiện kết thúc chuyển đổi). Tôi chọn in ký tự 35 #, ký tự 36 $là tương đương.

Bạn có thể chạy tập lệnh bash sau để lấy điểm:

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

Với một chương trình tiên tiến hơn thay thế mã hóa bằng phép nhân cho số nhỏ và chọn cơ sở tốt nhất để mã hóa từng số, tôi có thể đạt tới 958 ký tự Brainfuck, nhưng Python quá dài dòng (và tôi là một tay golf khá xấu / lười biếng) để có được bộ chuyển đổi thành 144 byte!


Đây là một ý tưởng hay! Có thể tôi sẽ sử dụng nó một lần để cải thiện câu trả lời này (đã viết một tập lệnh bằng Python để đạt điểm dưới 950, nhưng tôi không biết bất kỳ ngôn ngữ chơi gôn nào để làm cho nó đủ ngắn).
anatolyg

8

BrainF ***, điểm: 193.313

Nó không dưới 140 ký tự (là 147, rất gần !!), vì vậy điều này không thể thắng, nhưng tôi nghĩ nó thật tuyệt.

In 43 dấu cộng, sau đó Ndấu chấm. Không tối ưu lắm.

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

Nếu ai có thể giúp rút ngắn điều này, tôi sẽ thích nó.


Tôi đoán với Brainfuck sẽ đủ để tạo ra một "chương trình con" nhận đầu vào của nó trên băng - không cần phải đọc từ "thiết bị đầu vào tiêu chuẩn".
anatolyg 18/03/2015

@anatolyg Điều đó làm cho nó dễ dàng hơn nhiều - có thể khoảng 80 hoặc 90 ký tự. Tôi có nên thay đổi nó?
mdc32

5

J, Tổng số điểm = 1481

(Đối với mục nhập trước đây và giải thích kiểm tra lịch sử sửa đổi.)

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

Hàm này tạo ra các vòng BF lồng nhau dựa trên 10 chữ số cơ bản của số đầu vào. Kiểm tra tất cả các cơ sở hợp lý và chọn mã BF nhỏ nhất sẽ cải thiện điểm số với một lượng nhỏ.

Các chương trình BF cho bộ thử nghiệm:

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

Điểm tính toán trên bộ kiểm tra:

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

3

Bình dương, 1702

Tái thiết các số bằng các hệ số của N + x.

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

Đối với 2đầu ra này ++. bây giờ không in bất cứ thứ gì trong BF.
Randomra 17/03/2015

@randomra Bắt tốt, điều này đã xảy ra trong khi cập nhật, tôi sẽ sửa nó, cho tôi một ít.
orlp 17/03/2015

@randomra Nên sửa, làm cho điểm cao hơn một chút (dĩ nhiên).
orlp 17/03/2015

3

CJam, 52 74 108 byte, tổng = 1304 1244 1210

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

Tập lệnh kiểm tra (chậm trong trình thông dịch trực tuyến):

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,

Tôi đã không thấy phần về tự hủy diệt. Nhưng dù sao nó cũng sẽ không bao giờ tràn.
jimmy23013 18/03/2015

Làm thế nào nó hoạt động?
anatolyg 18/03/2015

@anatolyg Phiên bản đầu tiên chỉ cần tạo số trong cơ sở 5. Các phiên bản sau đã thêm trường hợp đặc biệt cho hai chữ số đầu tiên và cũng được sử dụng giảm dần.
jimmy23013

@ user23013 Ồ, xin lỗi, chưa thấy thông số kỹ thuật thay đổi. (Cập nhật câu trả lời của tôi cho phù hợp.)
Randomra 18/03/2015

2

Befunge-98, N + 41, tổng = 193281

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

Tôi biết điều đó thật tệ, nhưng tôi cảm thấy muốn viết một số Befunge ngày hôm nay. Phần tốt nhất của Befunge là các chương trình thậm chí còn khó hiểu hơn các ngôn ngữ golf thực tế, đặc biệt là khi chúng sử dụng lại mã: D

Sử dụng một thuật toán tương tự như câu trả lời CJam của Martin Büttner :

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

1

CJam, 40 + N, Tổng cộng: 193265

'+33*'>'+l~*"[<.>-]"

Chỉ cần bắt đầu điều này, đây là giải pháp cơ bản. Nó tạo mã sau đây:

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

nơi _Nbản sao của +.

Chạy máy phát điện ở đây.


1

Befunge-93 - 24 + N, tổng = 193009

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

Điều này sử dụng tiền tố +++[>++++[>++++<-]<-]>>để đặt chỉ mục băng đầu tiên thành '0' với 24 ký tự. Chương trình Befunge rất cơ bản và đầu ra cùng với N '.' nhân vật.


Bây giờ tôi thấy điều này tôi không biết tại sao tôi lại nghĩ vòng lặp của mình sẽ tốt hơn ...
Martin Ender
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.