Phiên dịch não bộ ***


113

Viết chương trình ngắn nhất bằng ngôn ngữ yêu thích của bạn để diễn giải chương trình brainfuck . Chương trình được đọc từ một tập tin. Đầu vào và đầu ra là đầu vào tiêu chuẩn và đầu ra tiêu chuẩn.

  1. Kích thước ô: 8 bit không dấu. Tràn không xác định.
  2. Kích thước mảng: 30000 byte (không được khoanh tròn)
  3. Các lệnh xấu không phải là một phần của đầu vào
  4. Nhận xét bắt đầu bằng # và kéo dài đến cuối dòng Nhận xét là tất cả mọi thứ không có trong+-.,[]<>
  5. không có biểu tượng EOF

Một bài kiểm tra rất tốt có thể được tìm thấy ở đây . Nó đọc một số và sau đó in các số nguyên tố lên đến số đó. Để ngăn ngừa thối liên kết, đây là một bản sao của mã:

compute prime numbers
to use type the max number then push Alt 1 0
===================================================================
======================== OUTPUT STRING ============================
===================================================================
>++++++++[<++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++.[-]
>++++++++++[<++++++++++>-]<+++++++++.[-]
>++++++++++[<++++++++++>-]<+.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++.[-]
>+++++++[<+++++++>-]<+++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]

===================================================================
======================== INPUT NUMBER  ============================
===================================================================
+                          cont=1
[
 -                         cont=0
 >,
 ======SUB10======
 ----------

 [                         not 10
  <+>                      cont=1
  =====SUB38======
  ----------
  ----------
  ----------
  --------

  >
  =====MUL10=======
  [>+>+<<-]>>[<<+>>-]<     dup

  >>>+++++++++
  [
   <<<
   [>+>+<<-]>>[<<+>>-]<    dup
   [<<+>>-]
   >>-
  ]
  <<<[-]<
  ======RMOVE1======
  <
  [>+<-]
 ]
 <
]
>>[<<+>>-]<<

===================================================================
======================= PROCESS NUMBER  ===========================
===================================================================

==== ==== ==== ====
numd numu teid teiu
==== ==== ==== ====

>+<-
[
 >+
 ======DUP======
 [>+>+<<-]>>[<<+>>-]<

 >+<--

 >>>>>>>>+<<<<<<<<   isprime=1

 [
  >+

  <-

  =====DUP3=====
  <[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<

  =====DUP2=====
  >[>>+>+<<<-]>>>[<<<+>>>-]<<< <


  >>>


  ====DIVIDES=======
  [>+>+<<-]>>[<<+>>-]<   DUP i=div

  <<
  [
    >>>>>+               bool=1
    <<<
    [>+>+<<-]>>[<<+>>-]< DUP
    [>>[-]<<-]           IF i THEN bool=0
    >>
    [                    IF i=0
      <<<<
      [>+>+<<-]>>[<<+>>-]< i=div
      >>>
      -                  bool=0
    ]
    <<<
    -                    DEC i
    <<
    -
  ]

  +>>[<<[-]>>-]<<          
  >[-]<                  CLR div
  =====END DIVIDES====


  [>>>>>>[-]<<<<<<-]     if divides then isprime=0


  <<

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

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

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

  >>




  ===================================================================
  ======================== OUTPUT NUMBER  ===========================
  ===================================================================
  [>+<-]>

  [
   ======DUP======
   [>+>+<<-]>>[<<+>>-]<


   ======MOD10====
   >+++++++++<
   [
    >>>+<<              bool= 1
    [>+>[-]<<-]         bool= ten==0
    >[<+>-]             ten = tmp
    >[<<++++++++++>>-]  if ten=0 ten=10
    <<-                 dec ten     
    <-                  dec num
   ]
   +++++++++            num=9
   >[<->-]<             dec num by ten

   =======RROT======
      [>+<-]
   <  [>+<-]
   <  [>+<-]
   >>>[<<<+>>>-]
   <

   =======DIV10========
   >+++++++++<
   [
    >>>+<<                bool= 1
    [>+>[-]<<-]           bool= ten==0
    >[<+>-]               ten = tmp
    >[<<++++++++++>>>+<-] if ten=0 ten=10  inc div
    <<-                   dec ten     
    <-                    dec num
   ]
   >>>>[<<<<+>>>>-]<<<<   copy div to num
   >[-]<                  clear ten

   =======INC1=========
   <+>
  ]

  <
  [
   =======MOVER=========
   [>+<-]

   =======ADD48========
   +++++++[<+++++++>-]<->

   =======PUTC=======
   <.[-]>

   ======MOVEL2========
   >[<<+>>-]<

   <-
  ]

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

  ===================================================================
  =========================== END FOR ===============================
  ===================================================================


  >>>>>>>
 ]
 <<<<<<<<



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

======LF========

++++++++++.[-]
@

Chạy ví dụ:

$ python2 bf.py PRIME.BF 
Primes up to: 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

5
Bạn nên làm rõ khoảng 1) kích thước của bộ nhớ 2) là bộ nhớ được khoanh tròn 4) có thể là bất kỳ chi tiết
Nakilon

3
Tôi tự hỏi liệu có nên có hai loại: Những chương trình sử dụng eval (hoặc shell out để biên dịch) - và những chương trình không.
MtnViewMark

34
Tôi rất muốn thấy ai đó trả lời điều này trong brainfuck.
Hannesh

3
"Không có biểu tượng EOF" nghĩa là gì? Giá trị ô đó không thay đổi khi thử ,EOF? Hoặc đó là tùy thuộc vào chúng tôi để chọn một giá trị khi thử ,EOF? Hoặc là EOF không xác định hành vi hoàn toàn?
Martin Ender

3
Tương tự như vậy, điều gì sẽ xảy ra khi ai đó cố gắng để các ô 30k sang hai bên? Đầu băng nên giữ nguyên vị trí hay đây là hành vi không xác định?
Martin Ender

Câu trả lời:


46

Perl, 120 138

%c=qw(> $p++ < $p-- + D++ - D-- [ while(D){ ] } . print+chrD , D=ord(getc));
$/=$,;$_=<>;s/./$c{$&};/g;s[D]'$b[$p]'g;eval

Điều này chạy hello.bf và primes.bf hoàn hảo:

$ perl bf.pl hello.bf
Hello World!
$ perl bf.pl prime.bf
Primes up to: 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

Khởi tạo: Bảng dịch mã opcode sang Perl được lưu trữ trong %c. Các hình thức có thể đọc được trông như thế này:

%c=(
  '>' => '$p++',
  '<' => '$p--',
  '+' => '$b[$p]++',
  '-' => '$b[$p]--',
  '[' => 'while($b[$p]){',
  ']' => '}',
  '.' => 'print chr$b[$p]',
  ',' => '$b[$p]=ord(getc)',
);

Bước 1: Nhập dữ liệu vào chương trình $_và chuyển đổi nó thành mã Perl bằng bảng dịch. Nhận xét được tự động tước (thay thế bằng undef) trong bước này.

Bước 2: Giải nén tất cả các $b[$p]lần xuất hiện

Bước 3: Khởi chạy chương trình bằng cách sử dụng eval.


Chỉ cần sử dụng qwcú pháp của Perl để xác định %ctrực tiếp - tốt cho 7 ký tự ít hơn ( mặc dù vậy bạn sẽ phải nói print+chr$b[$p]ord(getc)mặc dù vậy)
mob

Tôi đếm được 18 câu cảm ơn đã cứu! (cập nhật trong một phút)
JB

1
@olivecoder Bạn đang nói về cái quái gì vậy?
JB

Bảng% c được khai báo và định nghĩa trong dòng đầu tiên; nhân vật của nó được tính toán hoàn hảo.
JB

@JB này, tôi đã vô tình nhấn xuống phiếu bầu cho câu trả lời của bạn và nó bị khóa, bạn có thể chỉnh sửa điều này để tôi có thể đảo ngược việc bỏ phiếu không?
Xyclohexanol.

67

Python (không có eval), 317 byte

from sys import*
def f(u,c,k):
 while(c[1]>=k)*u:
  j,u='[]<>+-,.'.find(u[0]),u[1:];b=(j>=0)*(1-j%2*2);c[1]+=b*(j<2)
  while b*c[c[0]]and j<1:f(u,c,k+1);c[1]+=1
  b*=c[1]==k;c[[0,c[0],2][j/2-1]]+=b
  if(j==6)*b:c[c[0]]=ord(stdin.read(1))
  if(j>6)*b:stdout.write(chr(c[c[0]]))
f(open(argv[1]).read(),[-1]+[0]*30003,0)

70
+1 chof(u,c,k)
Joel Cornett

9
Đó là một mảnh đẹp của tiếng ồn, thưa ông
globby

-1 byte nếu bạn thay thế while b*c[c[0]]and j<1bằngwhile b*c[c[0]]*(j<1)
Daniil Tutubalin

50

Mã máy 16 bit 8086: 168 byte

Đây là phiên bản được mã hóa base64 , chuyển đổi và lưu dưới dạng 'bf.com' và chạy từ dấu nhắc lệnh của Windows: 'bf progname'

gMYQUoDGEFKzgI1XAgIfiEcBtD3NIR8HcmOL2LQ/i88z0s0hcleL2DPA86sz/zP2/sU783NHrL0I
AGgyAU14DTqGmAF194qOoAH/4UfDJv4Fwyb+DcO0AiaKFc0hw7QBzSGqT8MmODV1+jPtO/NzDaw8
W3UBRTxddfJNee/DJjg1dPoz7U509YpE/zxddQFFPFt18U157sM+PCstLixbXUxjTlJWXmV+

BIÊN TẬP

Đây là một số trình biên dịch (kiểu A86) để tạo tệp thực thi (Tôi phải đảo ngược kỹ sư này vì tôi đã đặt nhầm nguồn gốc!)

    add dh,10h                              
    push dx                                 
    add dh,10h                              
    push dx                                 
    mov bl,80h                              
    lea dx,[bx+2]                         
    add bl,[bx]                            
    mov [bx+1],al                         
    mov ah,3dh                              
    int 21h                                 
    pop ds                                 
    pop es                                 
    jb ret                               
    mov bx,ax                              
    mov ah,3fh                              
    mov cx,di                              
    xor dx,dx                              
    int 21h                                 
    jb ret                               
    mov bx,ax                              
    xor ax,ax                              
    repz stosw                                     
    xor di,di                              
    xor si,si                              
    inc ch                                 
program_loop:
    cmp si,bx                              
    jnb ret                               
    lodsb                                    
    mov bp,8                            
    push program_loop
symbol_search:                       
    dec bp                                 
    js ret
    cmp al,[bp+symbols]
    jnz symbol_search
    mov cl,[bp+instructions]
    jmp cx                                 
forward:
    inc di                                 
    ret                                    
increment:
    inc b es:[di]                      
    ret                                    
decrement:
    dec b es:[di]                      
    ret                                    
output:
    mov ah,2                              
    mov dl,es:[di]                            
    int 21h                                 
    ret                                    
input:
    mov ah,1                              
    int 21h                                 
    stosb                                    
backward:
    dec di                                 
    ret                                    
jumpforwardifzero:
    cmp es:[di],dh                            
    jnz ret                               
    xor bp,bp
l1: cmp si,bx                              
    jnb ret
    lodsb                                    
    cmp al,'['                              
    jnz l2
    inc bp
l2: cmp al,']'                              
    jnz l1
    dec bp                                 
    jns l1
    ret                                    
jumpbackwardifnotzero:
    cmp es:[di],dh                            
    jz  ret
    xor bp,bp
l3: dec si                                 
    jz  ret
    mov al,[si-1]                         
    cmp al,']'
    jnz l4
    inc bp  
l4: cmp al,'['                              
    jnz l3
    dec bp                                 
    jns l3
    ret                                    
symbols:
    db '><+-.,[]'
instructions:
    db forward and 255
    db backward and 255
    db increment and 255
    db decrement and 255
    db output and 255
    db input and 255
    db jumpforwardifzero and 255
    db jumpbackwardifnotzero and 255

Tôi đã thêm một phiên bản mã nguồn của chương trình. Tôi chỉ nhận thấy rằng các ký tự không phải bf khiến chương trình thoát ra ngoài thay vì bị bỏ qua. Dễ dàng khắc phục điều đó và tôi sẽ để nó như một bài tập để mọi người tự làm điều đó.
Skizz

Tôi nhớ tôi đã nhận được phiên bản Linux ELF 166 byte, 10 năm trước, tại đây muppetlabs.com/~breadbox/software/tiny
Emmanuel

39

Brainfuck , 843 691 byte

Chỉnh sửa: quyết định xem lại điều này và tìm thấy một số cách đáng ngạc nhiên để loại bỏ byte

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

Điều này có đầu vào ở dạng code!input!inputlà tùy chọn. Nó cũng mô phỏng các tế bào âm mà không sử dụng chính các tế bào âm và có thể lưu trữ đến (30000-(length of code+6))/2các tế bào.

Hãy thử trực tuyến!


Chỉ để đảm bảo rằng tôi đã đúng, nếu tôi chạy chương trình này với chương trình này, tôi có thể lồng nó sâu 5 cấp và vẫn xử lý các đầu vào mã có độ dài 262.
Draco18s

@ Draco18s Tôi nghi ngờ bạn đã hết 30000 ô trước đó, vì kích thước của mỗi trình thông dịch lồng nhau tăng theo cấp số nhân. Tôi nghĩ bạn sẽ nhận được 2, có thể sâu 3 cấp
Jo King

Thậm chí 3 sâu sẽ rất vui nhộn ngớ ngẩn.
Draco18

27

Ruby 1.8.7, 188 185 149 147 ký tự

eval"a=[i=0]*3e4;"+$<.bytes.map{|b|{?.,"putc a[i]",?,,"a[i]=getc",?[,"while a[i]>0",?],"end",?<,"i-=1",?>,"i+=1",?+,"a[i]+=1",?-,"a[i]-=1"}[b]}*";"

Phiên bản có thể đọc được:

code = "a = [0] * 3e4; i = 0;"
more_code ARGF.bytes.map {|b|
  replacements = {
    ?. => "putc a[i]",
    ?, => "a[i] = getc",
    ?[ => "while a[i] > 0 do",
    ?] => "end",
    ?< => "i -= 1",
    ?> => "i += 1",
    ?+ =>"a[i]+=1",
    ?- =>"a[i]-=1"
  }
  replacements[b]
}.join(";")
eval code+more_code

Như bạn thấy tôi đã xấu hổ đánh cắp ý tưởng của bạn về việc dịch sang ngôn ngữ máy chủ và sau đó sử dụng eval để chạy nó.


Bạn có thể tắt một byte byte so với 0 >0thay vì kiểm tra đẳng thức : !=0. Các thông số kỹ thuật nói không dấu, và tràn không được xác định.
kẻ hèn nhát ẩn danh

3e4cũng sẽ hoạt động trái ngược với30000
kẻ hèn nhát vô danh

@Charlie: Cảm ơn. Mặc dù công bằng nhưng nó không nói "không dấu" khi tôi viết mã. Tôi thực sự không biết rằng bạn có thể viết 3e4 mặc dù. Đó là một điểm rất tốt và tốt để biết.
sepp2k

File.read($*.pop).bytes-> $<.bytescũng nên hoạt động
Arnaud Le Blanc

1
Ruby 1.8.7 có một cú pháp thậm chí ngắn hơn để xây dựng hàm băm theo nghĩa đen : {?a,"foo"}, tương đương với {?a=>"foo"}. Và thử nghiệm ở đây cho thấy rằng bạn thực sự có thể thay thế File.read($*.pop).bytesvới $<mà không cần bất kỳ vấn đề. Cũng nội tuyến mọi thứ để một cái gì đó như eval"a[0]..."+$<.bytes.map{?.,"putc a[i]",...}*";"rút ngắn giải pháp bằng một vài ký tự khác.
Ventero

26

Nhị phân Lambda tính toán 112

Chương trình hiển thị trong kết xuất hex bên dưới

00000000  44 51 a1 01 84 55 d5 02  b7 70 30 22 ff 32 f0 00  |DQ...U...p0".2..|
00000010  bf f9 85 7f 5e e1 6f 95  7f 7d ee c0 e5 54 68 00  |....^.o..}...Th.|
00000020  58 55 fd fb e0 45 57 fd  eb fb f0 b6 f0 2f d6 07  |XU...EW....../..|
00000030  e1 6f 73 d7 f1 14 bc c0  0b ff 2e 1f a1 6f 66 17  |.os..........of.|
00000040  e8 5b ef 2f cf ff 13 ff  e1 ca 34 20 0a c8 d0 0b  |.[./......4 ....|
00000050  99 ee 1f e5 ff 7f 5a 6a  1f ff 0f ff 87 9d 04 d0  |......Zj........|
00000060  ab 00 05 db 23 40 b7 3b  28 cc c0 b0 6c 0e 74 10  |....#@.;(...l.t.|
00000070

hy vọng đầu vào của nó bao gồm chương trình Brainfuck (chỉ nhìn vào các bit 0,1,4 để phân biệt giữa, -. + <>] [) theo sau là a], tiếp theo là đầu vào cho chương trình Brainfuck.

Lưu kết xuất hex ở trên với xxd -r> bf.Blc

Lấy thông dịch viên blc từ https://tromp.github.io/cl/cl.html

cc -O2 -DM=0x100000 -m32 -std=c99 uni.c -o uni
echo -n "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.]" > hw.bf
cat bf.Blc hw.bf | ./uni

Chào thế giới!


1
Tại sao điều này thậm chí tồn tại? Rõ ràng, nó thậm chí còn tồn tại trong lĩnh vực nghiên cứu . Oo
Isiah Meadows

Vì vậy, điều này sẽ không làm việc với các chương trình brainfuck bình luận?
kamoroso94

Không, không phải không tước bỏ các ý kiến ​​đầu tiên.
John Tromp

18

Võng mạc 0.8.2 , 386 391 386 byte

Mã chứa các ký tự NUL ( 0x00) không thể in được . Nó cũng chưa được chơi gôn, vì nó đã rất chậm và nếu tôi chơi nó nhiều hơn, tôi không biết sẽ mất bao lâu để hoàn thành. Xuất hiện hết thời gian trên mẫu tìm kiếm chính.

Có thể có lỗi trong trình thông dịch trực tuyến hoặc trong chương trình của tôi (hàng đầu dòng mới không hiển thị ở đầu ra?).

Đưa đầu vào như thế nào <code>│<input>. Không, đó không phải là một đường ống ( |). Đó là ký tự Unicode U+2502. Mã này cũng sử dụng các ký tự Unicode ÿ▶◀├║. Các ký tự Unicode được sử dụng để hỗ trợ đầu vào của tất cả các ký tự ASCII. Do đó, các ký tự này cần được phân tách khỏi mã bằng ký tự không phải ASCII.

Dùng thử trực tuyến

s`^.*
▶$0├║▶
s{`(▶>.*║.*)▶(.)(.?)
$1$2▶$3
▶$
▶
║▶
║▶
(▶<.*║.*)(.)▶
$1▶$2
T`ÿ-`o`(?<=▶\+.*║.*▶).
^\+

T`-ÿ`ÿo`(?<=▶-.*║.*▶).
^-

(▶\..*├.*)(║.*▶)(.)
$1$3$2$3
(▶,.*│)(.?)(.*├.*▶).
$1$3$2
▶\[(.*║.*▶)
[▶▶${1}
{`(▶▶+)([^[\]]*)\[
$2[$1▶
}`▶(▶+)([^[\]]*)\]
$2]$1
r`([[\]]*)▶\](.*║.*▶[^])
$1◀◀]$2
r{`\[([^[\]]*)(◀+)◀
$2[$1
}`\]([^[\]]*)(◀◀+)
$2◀]$1
◀
▶
}`▶([^│])(.*║)
$1▶$2
s\`.*├|║.*

Lưu ý có một dòng mới ở đó.

Giải thích ngắn gọn:

Số 0x00không được sử dụng cho băng, đó là vô hạn. Sự thay thế đầu tiên thiết lập trình thông dịch theo mẫu ▶<code>│<input>├<output>║▶<tape>, trong đó cái đầu tiên là con trỏ cho mã và cái thứ hai là con trỏ cho băng.

ÿ0xFF(255), được sử dụng cho Chuyển ngữ (được sử dụng để thực hiện +-) để bọc các ô trở về không.

chỉ được sử dụng để dễ đọc (trong trường hợp chương trình bị dừng ở giữa hoặc bạn muốn xem chương trình thực thi giữa chương trình). Mặt khác, bạn không thể biết con trỏ đang di chuyển theo hướng nào.

Mã nhận xét:

s`^.*                       # Initialize
▶$0├║▶
s{`(▶>.*║.*)▶(.)(.?)        # >
$1$2▶$3
▶$
▶
║▶                          # <
║▶
(▶<.*║.*)(.)▶
$1▶$2
T`ÿ-`o`(?<=▶\+.*║.*▶).      # +
^\+

T`-ÿ`ÿo`(?<=▶-.*║.*▶).      # -
^-

(▶\..*├.*)(║.*▶)(.)         # .
$1$3$2$3
(▶,.*│)(.?)(.*├.*▶).        # ,
$1$3$2
▶\[(.*║.*▶)                 # [
[▶▶${1}
{`(▶▶+)([^[\]]*)\[
$2[$1▶
}`▶(▶+)([^[\]]*)\]
$2]$1
r`([[\]]*)▶\](.*║.*▶[^])    # ]
$1◀◀]$2
r{`\[([^[\]]*)(◀+)◀
$2[$1
}`\]([^[\]]*)(◀◀+)
$2◀]$1
◀
▶
}`▶([^│])(.*║)              # next instruction
$1▶$2
s\`.*├|║.*                  # print output

Bấm vào đây để mã có số 0 thay cho byte rỗng. Bất kỳ sự cố nào $0không nên được thay thế bằng null.

Chỉnh sửa : Bây giờ hỗ trợ đầu vào trống và ngăn chặn dòng mới.

Đầu ra vô hạn hiện được hỗ trợ. (403 byte)


Tôi ước rằng tôi đã đặt <code><tape>bên cạnh nhau (mặc dù nó sẽ có nhiều ký tự hơn) để việc chuyển đổi sang trình thông dịch SMBF sẽ dễ dàng hơn, nếu tôi quyết định làm điều đó.
mbomb007

14

TI-BASIC, 264 byte

Do những hạn chế trong TI-BASIC, điều này thực sự không đủ điều kiện cho thử thách này vì nó phá vỡ quy tắc 2; RAM của máy tính rất hạn chế và làm một cái gì đó như 30000->dim(L1(tôi sử dụng L1 cho ngăn xếp / mảng) sẽ buộc nó phải ném ERR:MEMORY. Như vậy, ngăn xếp / mảng bắt đầu ở kích thước 1 và phát triển nếu con trỏ trỏ đến một phần tử đi qua phần cuối của nó. Nó cũng phá vỡ quy tắc 3, vì nó đã phá vỡ quy tắc 2 nên tôi cũng không bận tâm đến giới hạn kích thước ô.

Nhân tiện, có thể vẫn bị đánh golf ... Tôi đã thực hiện một hoặc hai lần chỉnh sửa cho đến khi gửi lần đầu tiên, nhưng nếu phiên bản bên dưới không hoạt động thì hãy quay lại chỉnh sửa từ ngày 6 tháng 5 năm15 và sử dụng nó mã thay thế. Ngoài ra, vì thực sự không có ASCII trong TI-BASIC, điều này lấy các số có kích thước bất kỳ (và bất kỳ thứ gì trả về một số, như một biến hoặc biểu thức) làm đầu vào và lần lượt xuất ra các số.

Sử dụng SourceCoder để xây dựng nó thành tệp .8xp sau đó gửi nó đến máy tính của bạn bằng TI-Connect hoặc TILP hoặc một cái gì đó, và chạy nó bằng cách đưa chương trình brainfuck của bạn vào dấu ngoặc kép theo dấu hai chấm và bất cứ thứ gì bạn đặt tên là chương trình TI-BASIC. Ví dụ: nếu bạn đặt tên là BRAINF, bạn sẽ chạy một chương trình như thế này : "brainfuck goes here":prgmBRAINF. Tuy nhiên, nếu bạn có một vỏ trên calc của bạn chặn các lệnh khác khi phát hiện prgmmã thông báo, hãy làm điều này : "brainfuck goes here" -> press ENTER -> prgmBRAINF.

seq(inString("<>-+.,[]",sub(Ans,S,1)),S,1,length(Ans->L2
cumSum((Ans=7)-(Ans=8->L3
seq(Ans(X),X,dim(Ans),1,~1->L4
1->P:DelVar L11->dim(L1 //this is the same as DelVar L1:1->dim(L1 as DelVar does not require a colon or newline after its argument
For(S,1,dim(L2
L2(S->T
P-(T=1)+(T=2->P
dim(L1
Ans+(P-Ans)(P>Ans->dim(L1
L1(P)-(T=3)+(T=4->L1(P
If T=5
Disp Ans
If T=6:Then
Input V
V->L1(P
End
If T=7 and not(L1(P
S+2+sum(not(cumSum(L3(S)-1=seq(L3(X),X,S+1,dim(L3->S
1-S+dim(L3
If T=8 and L1(P
S-sum(not(cumSum(L4(Ans)=seq(L4(X),X,Ans+1,dim(L4->S
End

Nếu bạn không có cách kết nối máy tính với máy tính của mình và muốn gõ nó trên-calc thay vào đó (tôi không thể tưởng tượng được tại sao bạn muốn, nhưng tôi lạc đề) đó ->STO>nút phía trên BẬT khóa, ~là ký hiệu phủ định bên cạnh ENTER và để thay thế tất cả các phiên bản L<number>bằng mã thông báo danh sách tương ứng được tìm thấy trên2ND -> <number on keypad>

Cảm ơn thomas-kwa (ít nhất, tôi nghĩ đó là tên người dùng Stack của anh ấy) vì đã giúp tôi tối ưu hóa điều này, đặc biệt là với các hướng dẫn [].


1
Bạn có cần các parens xung quanh Ans+S?
Zacharý

@ Zacharý Bắt tốt, không. Tôi đã không chắc chắn về cách PEMDAS hoạt động hoặc một cái gì đó ... Tuy nhiên, tôi sẽ không chỉnh sửa, bởi vì nó đã quá lâu đến nỗi chắc chắn nó không đáng để đưa bài này lên phía trước và bởi vì hai byte giảm sẽ không đưa ra câu trả lời bất kỳ lợi thế nào so với những người khác lol.
MI Wright

1
Tôi nhớ như 2-3 năm trước khi tôi sử dụng chương trình này để diễn giải Brainf *** trên máy tính của mình. Và, đó là một câu hỏi diễn giải não bộ, tôi nghĩ rằng nó nên ở trên cùng để thành thật.
Zacharý

1
Trên thực tế, tôi nghĩ rằng toàn bộ dòng có thể được S-sum(not(cumSum(L4(Ans)=seq(L4(X),X,Ans+1,dim(L4->S. ( a-a=0). Và này, đừng lo lắng về việc quên MỘT thứ tự hoạt động ở đây, tôi đã thấy một loạt người quên thứ tự các thao tác cho %(mod) trong một thử thách.
Zacharý

1
Ồ, vâng. Được rồi, điều đó mang lại ít nhất 10 byte vì nếu có thể được tạo thành một lớp lót, cộng với một số thứ khác ... cũng có thể chỉnh sửa. Bạn đã khiến tôi sử dụng máy tính lần đầu tiên sau một năm để kiểm tra công cụ này, haha
MI Wright

13

Con trăn 275 248 255

Tôi đã quyết định là sẽ cố gắng với nó.

import sys
i=0
b=[0]*30000
t=''
for e in open(sys.argv[1]).read():
 t+=' '*i+['i+=1','i-=1','b[i]+=1','b[i]-=1','sys.stdout.write(chr(b[i]))','b[i]=ord(sys.stdin.read(1))','while b[i]:','pass','']['><+-.,['.find(e)]+'\n'
 i+=(92-ord(e))*(e in'][')
exec t 

12
Gọn gàng, bạn đang tạo mã nguồn python bằng brainfuck.

1
Bạn có thể tách 1 char, "nhập sys dưới dạng s" và thay thế "sys" thành "s" trong phần còn lại
BẠN

Lưu ý rằng đây thực sự là 247 ký tự. (Xem không gian khó chịu sau exec t?). Nếu bạn sử dụng mẹo của S.Mark và cũng thực hiện toàn bộ forchu trình thành một dòng, bạn có thể thu nhỏ số này thành 243 ký tự.
Oleh Prypin

Điều này không thành công trên bất kỳ đầu vào có chứa [], một chương trình bf hợp lệ mặc dù tầm thường. Tôi đã đề xuất một chỉnh sửa để sửa lỗi này, nhưng tăng số lượng ký tự. Để tiếp tục giảm số lượng ký tự, bạn có thể from sys import *và sử dụng 'i+=1,...'.split(',')thay vì ['i+=1',...].
gian hàng

7
Tôi muốn +1, nhưng nhiều cải tiến đã được đề xuất và không được thực hiện.
mbomb007

12

Haskell, 457 413 ký tự

import IO
import System
z=return
'>'#(c,(l,d:r))=z(d,(c:l,r))
'<'#(d,(c:l,r))=z(c,(l,d:r))
'+'#(c,m)=z(succ c,m)
'-'#(c,m)=z(pred c,m)
'.'#t@(c,_)=putChar c>>hFlush stdout>>z t
','#(_,m)=getChar>>=(\c->z(c,m))
_#t=z t
_%t@('\0',_)=z t
i%t=i t>>=(i%)
b('[':r)=k$b r
b(']':r)=(z,r)
b(c:r)=f(c#)$b r
b[]=(z,[])
f j(i,r)=(\t->j t>>=i,r)
k(i,r)=f(i%)$b r
main=getArgs>>=readFile.head>>=($('\0',("",repeat '\0'))).fst.b

Mã này "biên dịch" chương trình BF thành một IOhành động có dạng State -> IO Statetrạng thái là một khóa kéo trên một chuỗi vô hạn.

Đáng buồn là tôi đã phải tiêu tốn 29 ký tự để tắt bộ đệm. Không có những cái đó, nó hoạt động, nhưng bạn không thấy lời nhắc trước khi bạn phải nhập dữ liệu. Bản thân trình biên dịch ( b, fk) chỉ có 99 ký tự, thời gian chạy ( #%) là 216. Trình điều khiển w / trạng thái ban đầu khác 32.

>ghc -O3 --make BF.hs 
[1 of 1] Compiling Main             ( BF.hs, BF.o )
Linking BF ...

>./BF HELLO.BF 
Hello World!

>./BF PRIME.BF 
Primes up to: 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

cập nhật 2011/02/15: Kết hợp các đề xuất của JB, đổi tên một chút và thắt chặtmain


1
Bạn sẽ có thể nhận được bộ đệm từ chỉ IOvà các đối số chỉ System(-19). Vấn đề đệm cũng làm phiền tôi, vì thông số kỹ thuật không thực sự đề cập đến nó và câu trả lời được bình chọn hàng đầu thậm chí không làm I / O. Nếu bạn phải giữ nó, có lẽ nó sẽ ngắn hơn hFlushsau mỗi lần ghi hơn là thay đổi chế độ đệm toàn cầu (-34 + 15).
JB

11

Băng tải, 953

Đây có thể là mã đẹp nhất mà bạn từng thấy:

0

:I\1\@p
>#====)
^#====<
PP0
P<=======================<
00t:)01t1  a:P:P:P:P:P:P:^
>===========">">2>">2>">"^
^           +^-^5^ ^5^]^.^
^           "^"^*^"^*^"^"^
^           -^-^6^-^6^-^-^
^           #^#^*^#^*^#^#^
^           P P -^P )^P P
^           P P #^P )^P P
^t1\)t0:))t01   P   -^  1
^===========<   P   #^  0
^  t1\(t0:))t01     P   t
^=============<     P   )
^         t11(t01   0 0 )
^===============<. t P 10
^                 FT#T#=<
^=================< P 
^             t11)t01 
^===================< 10t))0tP00t:(01t(1a:P:
^                     >=====#=>==========">"
^                             ^          ]^[
^                           P ^          "^"
^===========================<=^#=====<   -^-
                            ^==<     ^ PP#^#=
                                     ^===PTPT<
                                     ^  )P P
                                     ^=<=< (
                                       ^===<

8
Bạn có thể thêm một lời giải thích và một liên kết đến một thực hiện? Tôi muốn hiểu vẻ đẹp. ;)
DLosc

1
Chà, tôi hiện đang phát triển nó, có một trình biên dịch và một lời giải thích rất tệ tại github.com/loovjo/Conveyor . Nguồn này khá dễ đọc nếu bạn muốn hiểu nó.
Loovjo

9

C 284 362 (Từ một tập tin)

#include <stdio.h>
char b[30000],z[9999],*p=b,c,*a,i;f(char*r,int s){while(c=*a++){if(!s){(c-62)?(c-60)?(c-43)?(c-45)?(c-46)?(c-44)?0:(*p=getchar()):putchar(*p):--*p:++*p:--p:++p;if(c==91)f(a,!*p);else if(c==93){if(!*p)return;else a=r;}}else{if(c==93){--s;if(!*p&&!s)return;}else if(c==91){s++;}}}}main(int c,char**v){fread(z,1,9999,fopen(*++v,"r"));a=z;f(0,0);}

Số nguyên tố:

Số nguyên tố lên tới: 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 97
Bấm phím bất kỳ để tiếp tục . . .

Biên dịch và chạy thành công VS2008

Giải pháp ban đầu không thể nhận ra các vòng lặp ban đầu được đặt thành không. Vẫn còn một số phòng để chơi gôn. Nhưng cuối cùng cũng giải quyết được chương trình Prime Number.

Ung dung:

#include <stdio.h>
char b[30000],z[9999],*p=b,c,*a,i;
f(char*r,int s)
{
    while(c=*a++)
    {   
        if(!s)
        {
            (c-62)?(c-60)?(c-43)?(c-45)?(c-46)?(c-44)?0:(*p=getchar()):putchar(*p):--*p:++*p:--p:++p;
            if(c==91)f(a,!*p);
            else if(c==93){if(!*p)return;else a=r;}
        }
        else
        {
            if(c==93)
            {
                --s;
                if(!*p&&!s)return;
            }
            else if(c==91)
            {
                s++;
            }
        }
    }
}

main(int c,char**v){
    fread(z,1,9999,fopen(*++v,"r"));
    a=z;
    f(0,0);
}

Các xét nghiệm:

Chào thế giới

Rot13


Bạn có đang kiểm tra cùng một con trỏ ( l) mỗi lần bạn lặp không? Tôi nghĩ bạn nên kiểm tra vị trí hiện tại của đầu ( p).
Alexandru

Tôi chuyển con trỏ đến bộ đệm và con trỏ tới luồng. Nó kiểm tra ở cuối vòng lặp để xem con trỏ ltrong bộ đệm có đạt đến 0 không và phá vỡ nó, nó đặt lại luồng trở lại vòng lặp ban đầu [. Điều này là cần thiết cho các [vòng lặp lồng nhau .
snmcdonald

1
Vâng. Tôi cũng nghĩ vậy Bạn không nên kiểm tra giá trị tại con trỏ lúc đầu nhập vào vòng lặp, nhưng giá trị ở con trỏ hiện tại. Kiểm tra bài kiểm tra trong câu hỏi. Chương trình của bạn bị treo.
Alexandru

1
Bạn có thể thay thế break;elsebằng return;.
Alexandru

3
Tôi nghĩ bạn có thể thay thế (c==62)?a:bbằng (c-62)?b:a.
Alexandru

9

PHP 5.4, 296 294 273 263 261 209 191 183 178 166 ký tự:

Tôi đã bắn nó mà không sử dụng eval, nhưng cuối cùng tôi phải sử dụng nó

<?$b=0;eval(strtr(`cat $argv[1]`,["]"=>'}',"["=>'while($$b){',"."=>'echo chr($$b);',","=>'$$b=fgetc(STDIN);',"+"=>'$$b++;',"-"=>'$$b--;',">"=>'$b++;',"<"=>'$b--;']));

Tất cả các lệnh đang làm việc. Điều này lạm dụng rất nhiều biến số và đưa ra cảnh báo. Tuy nhiên, nếu một người thay đổi php.ini của họ thành cảnh báo squelch (hoặc ống stderr thành / dev / null), thì điều này hoạt động rất tốt.

Xác minh (Đó là ví dụ "Hello World!" Từ Wikipedia ): http://codepad.viper-7.com/O9lYjl

Ungolfed, 367 365 335 296 267 ký tự:

<?php
$a[] = $b = 0;
$p = implode("",file($argv[1])); // Shorter than file_get_contents by one char
$m = array("]" => '}', "[" => 'while($a[$b]){',"." => 'echo chr($a[$b]);', "," => '$a[$b]=fgetc(STDIN);', "+" => '$a[$b]++;', "-" => '$a[$b]--;', ">" => '$b++;', "<" => '$b--;');
$p = strtr($p,$m);
@eval($p);

Điều này nên được chạy qua dòng lệnh: php bf.php hello.bf


8

Windows PowerShell, 204

'$c=,0*3e4;'+@{62='$i++
';60='$i--
';43='$c[$i]++
';45='$c[$i]--
';44='$c[$i]=+[console]::ReadKey().keychar
';46='write-host -n([char]$c[$i])
';91='for(;$c[$i]){';93='}'}[[int[]][char[]]"$(gc $args)"]|iex

Chuyển đổi khá đơn giản các hướng dẫn và sau đó Invoke-Expression.

Lịch sử:

  • 2011/02/13 22:24 (220) Nỗ lực đầu tiên.
  • 2011/02/13 22:25 (218) 3e4ngắn hơn 30000.
  • 2011/02/13 22:28 (216) Ngắt dòng không cần thiết. Kết hợp trên số nguyên thay vì ký tự ngắn hơn.
  • 2011/02/13 22:34 (207) Được sử dụng các chỉ mục vào bảng băm thay vì switch.
  • 2011/02/13 22:40 (205) Chuỗi tốt hơn để loại bỏ hai dấu ngoặc đơn.
  • 2011/02/13 22:42 (204) Không cần khoảng trắng sau khi đối số thành Write-Host.

8

C, 333 ký tự

Đây là trình thông dịch BF đầu tiên của tôi và là golf đầu tiên tôi thực sự phải gỡ lỗi.

Điều này chạy trình tạo số nguyên tố trên Mac OS X / GCC, nhưng #include<string.h>có thể cần thêm một chi phí với 19 ký tự nếu định nghĩa ngầm định strchrkhông xảy ra để hoạt động trên nền tảng khác. Ngoài ra, nó giả định O_RDONLY == 0. Bên cạnh đó, bỏ intqua tuyên bố Mlưu 3 ký tự nhưng dường như không tuân thủ C99. Tương tự với thứ ba *trong b().

Điều này phụ thuộc vào các chi tiết của mã hóa ASCII. Các toán tử Brainfuck là tất cả các cặp bổ sung cách nhau khoảng cách 2 trong không gian mã ASCII. Mỗi chức năng trong chương trình này thực hiện một cặp toán tử.

#include<unistd.h>
char C[30000],*c=C,o,P[9000],*p=P,*S[9999],**s=S,*O="=,-\\",*t;
m(){c+=o;}
i(){*c-=o;}
w(){o<0?*c=getchar():putchar(*c);}
b(){if(o>0)*c?p=*s:*--s;else if(*c)*++s=p;else while(*p++!=93)*p==91&&b();}
int(*M[])()={m,i,w,b};
main(int N,char**V){
read(open(V[1],0),P,9e3);
while(o=*p++)
if(t=strchr(O,++o&~2))
o-=*t+1,
M[t-O]();
}

Tôi nghĩ bạn có thể thu nhỏ nó nhiều hơn bằng cách sử dụng ký hiệu 'e' cho tất cả các số lớn.
luser droog

@luser: Ban đầu tôi cũng ngạc nhiên, nhưng ngôn ngữ và trình biên dịch sẽ không cho phép điều đó. Tôi đã quản lý để thu nhỏ 4 ký tự khác bằng các chỉnh sửa và sử dụng #definethay vì bảng chức năng cũng có thể bị thay đổi. Tôi chỉ thích số 333 và bảng: v).
Potatoswatter

Ô đúng rồi. Tôi thực sự nên biết điều đó. Ký hiệu điện tử được sản xuất cho hằng số dấu phẩy động, trong khi khai báo yêu cầu một số nguyên. BTW, điều này có thể là gian lận, nhưng hãy xem nieko.net/projects/brainfuck cho phiên bản Urban Müller's. Lợi ích lớn nhất dường như được sử dụng nhiều ||.
luser droog

8

CJam, 75 byte

lq3e4Vc*@{"-<[],.+>"#"T1$T=(t T(:T; { _T=}g \0+(@T@t _T=o "_'(')er+S/=}%s~@

Dùng thử trực tuyến: bộ đảo ngược chuỗi , Hello World .

Giải trình

Lấy mã trên dòng đầu tiên của STDIN và nhập vào tất cả các dòng bên dưới nó.

l            Read a line from STDIN (the program) and push it.
 q           Read the rest of STDIN (the input) and push it.
  3e4Vc*     Push a list of 30000 '\0' characters.
        @    Rotate the stack so the program is on top.

{               }%   Apply this to each character in prog:
 "-<[],.+>"#         Map '-' to 0, '<' to 1, ... and everything else to -1.
            ...=     Push a magical list and index from it.

s~       Concatenate the results and evaluate the resulting string as CJam code.
  @      Rotate the top three elements again -- but there are only two, so the
         program terminates.

Thế còn danh sách ma thuật đó?

"T1$T=(t T(:T; { _T=}g \0+(@T@t _T=o "  Space-separated CJam snippets.
                                        (Note the final space! We want an empty
                                        string at the end of the list.)
_'(')er+                                Duplicate, change (s to )s, append.
        S/                              Split over spaces.

Danh sách kết quả như sau:

T1$T=(t    (-)
T(:T;      (<)
{          ([)
_T=}g      (])
\0+(@T@t   (,)
_T=o       (.)
T1$T=)t    (+)
T):T;      (>)
{          (unused)
_T=}g      (unused)
\0+(@T@t   (unused)
_T=o       (unused)
           (all other characters)

Chúng tôi tạo ra các đoạn trích cho +>từ những người cho -<, chỉ đơn giản bằng cách thay đổi các parens bên trái (CJ dec'sement decrement,) thành các parens phải (tăng dần của CJam).


Câu trả lời ngắn nhất & người chiến thắng lớn nhất
Jack Giffin

7

F #: 489 ký tự

Chương trình sau không nhảy theo hướng dẫn '[' / ']', nhưng quét mã nguồn cho mã thông báo phù hợp tiếp theo. Điều này tất nhiên làm cho nó chậm, nhưng nó vẫn có thể tìm thấy các số nguyên tố dưới 100. Các kiểu số nguyên F # không tràn nhưng bao bọc.

Đây là phiên bản ngắn:

[<EntryPoint>]
let M a=
 let A,B,i,p,w=Array.create 30000 0uy,[|yield!System.IO.File.ReadAllText a.[0]|],ref 0,ref 0,char>>printf"%c"
 let rec g n c f a b=if c then f i;if B.[!i]=a then g(n+1)c f a b elif B.[!i]=b then(if n>0 then g(n-1)c f a b)else g n c f a b
 while !i<B.Length do(let x=A.[!p]in match B.[!i]with|'>'->incr p|'<'->decr p|'+'->A.[!p]<-x+1uy|'-'->A.[!p]<-x-1uy|'.'->w x|','->A.[!p]<-byte<|stdin.Read()|'['->g 0(x=0uy)incr '['']'|']'->g 0(x>0uy)decr ']''['|_->());incr i
 0

Một vấn đề khó chịu là chương trình primes.bf bị kẹt trên các dòng mới của windows. Để chạy nó, tôi phải lưu số đầu vào vào một tài liệu văn bản có định dạng UNIX và đưa nó vào chương trình bằng một đường ống:

interpret.exe prime.bf < number.txt

Chỉnh sửa: nhập Alt + 010 theo sau là Enter cũng hoạt động trong Windows cmd.exe

Đây là phiên bản dài hơn:

[<EntryPoint>]
let Main args =
    let memory = Array.create 30000 0uy
    let source = [| yield! System.IO.File.ReadAllText args.[0] |]
    let memoryPointer = ref 0
    let sourcePointer = ref 0
    let outputByte b = printf "%c" (char b)
    let rec scan numBraces mustScan adjustFunc pushToken popToken =
        if mustScan then
            adjustFunc sourcePointer
            if source.[!sourcePointer] = pushToken then
                scan (numBraces + 1) mustScan adjustFunc pushToken popToken
            elif source.[!sourcePointer] = popToken then
                if numBraces > 0 then scan (numBraces - 1) mustScan adjustFunc pushToken popToken
            else
                scan numBraces mustScan adjustFunc pushToken popToken 

    while !sourcePointer < source.Length do
        let currentValue = memory.[!memoryPointer]
        match source.[!sourcePointer] with
            | '>' -> incr memoryPointer
            | '<' -> decr memoryPointer
            | '+' -> memory.[!memoryPointer] <- currentValue + 1uy
            | '-' -> memory.[!memoryPointer] <- currentValue - 1uy
            | '.' -> outputByte currentValue
            | ',' -> memory.[!memoryPointer] <- byte <| stdin.Read()
            | '[' -> scan 0 (currentValue = 0uy) incr '[' ']'
            | ']' -> scan 0 (currentValue > 0uy) decr ']' '['
            |  _  -> ()
        incr sourcePointer
    0 

Tôi đã giải quyết vấn đề Enter bằng cách không nhấn nó nhưng Ctrl + J :-)
Joey

Ctrl + J không hoạt động với tôi, nhưng nhập Alt + 010, sau đó là Enter.
cfern

7

Delphi, 397 382 378 371 366 364 328 ký tự

Ăn Delphi này!

328 var p,d:PByte;f:File;z:Word=30000;x:Int8;begin p:=AllocMem(z+z);d:=p+z;Assign(F,ParamStr(1));Reset(F,1);BlockRead(F,p^,z);repeat z:=1;x:=p^;case x-43of 1:Read(PChar(d)^);3:Write(Char(d^));0,2:d^:=d^+44-x;17,19:d:=d+x-61;48,50:if(d^=0)=(x=91)then repeat p:=p+92-x;z:=z+Ord(p^=x)-Ord(p^=x xor 6);until z=0;end;Inc(p)until x=0;end.

Ở đây cùng mã, thụt lề và nhận xét:

var
  d,p:PByte;
  x:Int8;
  f:File;
  z:Word=30000;
begin
  // Allocate 30000 bytes for the program and the same amount for the data :
  p:=AllocMem(z+z);
  d:=p+z;
  // Read the file (which path must be specified on the command line) :
  Assign(F,ParamStr(1));
  Reset(F,1);
  BlockRead(F,p^,z);
  // Handle all input, terminating at #0 (better than the spec requires) :
  repeat
    // Prevent a begin+end block by preparing beforehand (values are only usable in '[' and ']' cases) :
    z:=1;                       // Start stack at 1
    x:=p^;                      // Starting at '[' or ']'
    // Choose a handler for this token (the offset saves 1 character in later use) :
    case x-43of
      1:Read(PChar(d)^);        // ','     : Read 1 character from input into data-pointer
      3:Write(Char(d^));        // '.'     : Write 1 character from data-pointer to output
      0,2:d^:=d^+44-x;          // '+','-' : Increase or decrease data
      17,19:d:=d+x-61;          // '<','>' : Increase or decrease data pointer
      48,50:                    // '[',']' : Start or end program block, the most complex part :
        if(d^=0)=(x=91)then     // When (data = 0 and forward), or when (data <> 0 and backward)
        repeat                  //
          p:=p+92-x;            // Step program 1 byte back or forward
          z:=z+Ord(p^=x)        // Increase stack counter when at another bracket
              -Ord(p^=x xor 6); // Decrease stack counter when at the mirror char
        until z=0;              // Stop when stack reaches 0
    end;
    Inc(p)
  until x=0;
end.

Cái này làm tôi mất vài giờ, vì nó không phải là loại mã tôi thường viết, nhưng hãy tận hưởng!

Lưu ý: Bài kiểm tra chính hoạt động, nhưng không dừng ở mức 100, vì nó đọc # 13 (CR) trước # 10 (LF) ... các bài nộp khác có gặp phải vấn đề này khi chạy trên HĐH CRLF không?


Ồ Tôi sẽ không bao giờ mong đợi sẽ thổi phồng C trong sự căng thẳng với Delphi! Không phải cho đến khi bạn áp dụng ý tưởng của tôi cho CI đoán ;-)
PatrickvL

7

C, 260 + 23 = 283 byte

Tôi đã tạo ra một chương trình C có thể được tìm thấy ở đây .

main(int a,char*s[]){int b[atoi(s[2])],*z=b,p;char*c=s[1],v,w;while(p=1,
*c){q('>',++z)q('<',--z)q('+',++*z)q('-',--*z)q('.',putchar(*z))q(',',*z
=getchar())if(*c=='['||*c==']'){v=*c,w=184-v;if(v<w?*z==0:*z!=0)while(p)
v<w?c++:c--,p+=*c==v?1:*c==w?-1:0;}c++;}}

Phải được biên dịch thông qua gcc -D"q(a,b)"="*c-a||(b);" -o pmmbf pmmbf.cvà có thể được gọi như sau: pmmbf ",[.-]" 30000theo đó đối số thứ nhất (được trích dẫn) chứa chương trình bf để chạy, lần thứ hai xác định băng phải lớn đến mức nào.


1
Tôi nghĩ rằng bạn cần thêm 23 ký tự vào số đếm của mình cho -D"q(a,b)"="*c-a||(b);"tùy chọn, vì điều đó dường như (ít nhất là theo hiểu biết hạn chế của tôi) để giúp bạn thu nhỏ mã của mình.
Gareth

Các tùy chọn được bao gồm trong văn bản được đăng. Lý do là để tránh từ dài dòng definevà dòng mới, nhưng tôi không nghĩ đó thực sự là kosher. Dù sao với các trích dẫn, bình luận, và gcc -Dtôi không thấy lợi thế nào cả.
Potatoswatter

5

C, 267

#define J break;case
char*p,a[40000],*q=a;w(n){for(;*q-93;q++){if(n)switch(*q){J'>':++p;J'<':--p;J'+':++*p;J'-':--*p;J'.':putchar(*p);J',':*p=getchar();}if(*q==91){char*r=*p&&n?q-1:0;q++;w(r);q=r?r:q;}}}main(int n,char**v){p=a+read(open(v[1],0),a,9999);*p++=93;w(1);}

Chạy dưới dạng ./a.out primes.bf

Phiên bản Ungolfed:

#define J break;case

char*p,a[40000],*q=a; // packed so program immediately followed by data

w(n){
    for(;*q-93;q++){ // until ']'
        if(n)switch(*q){ // n = flagged whether loop evaluate or skip(0)
                J'>':++p;
                J'<':--p;
                J'+':++*p;
                J'-':--*p;
                J'.':putchar(*p);
                J',':*p=getchar();
        }
        if(*q==91){char*r=*p&&n?q-1:0;q++;w(r);q=r?r:q;} // recurse on '[', record loop start
    }
}

main(int n,char**v){
    p=a+read(open(v[1],0),a,9999);
    *p++=93; // mark EOF with extra ']' and set data pointer to next
    w(1); // begin as a loop evaluate
}

5

Con trăn 2, 223

Tôi thừa nhận rằng tôi đã tái chế một chương trình cũ của tôi (nhưng phải thay đổi nó khá nhiều, vì phiên bản cũ không có đầu vào, nhưng kiểm tra lỗi ...).

P="";i,a=0,[0]*30000
import os,sys
for c in open(sys.argv[1]).read():x="><+-.[,]".find(c);P+=" "*i+"i+=1 i-=1 a[i]+=1 a[i]-=1 os.write(1,chr(a[i])) while+a[i]: a[i]=ord(os.read(0,1)) 0".split()[x]+"\n";i+=(x>4)*(6-x)
exec P

Chạy máy tính số nguyên tố tốt.

Bây giờ tôi thấy Alexandru có một câu trả lời có một số điểm tương đồng. Dù sao tôi cũng sẽ đăng câu trả lời, vì tôi nghĩ có một số ý tưởng mới trong đó.


5

C (gcc) Linux x86_64, 884 621 525 487 439 383 358 354 byte

*z,*mmap();d[7500];(*p)();*j(a,g)char*a;{char*t=a,*n,c,q=0;for(;read(g,&c,!q);)t=c==91?n=j(t+9,g),z=mempcpy(t,L"\xf003e80Ƅ",5),*z=n-t-9,n:c==93?q=*t++=233,z=t,*z=a-13-t,z+1:stpcpy(t,c-62?c-60?c-43?c-45?c-46?c-44?"":"1\xc0P_\xF\5":"RXR_\xF\5":L"໾":L"۾":L"컿":L"웿");return t;}main(P,g)int**g;{p=mmap(0,1<<20,6,34,0,0);p(*j(p,open(g[1],0))=195,d,1);}

Hãy thử trực tuyến!

Đây là một JIT biên dịch mã BF thành ngôn ngữ máy x86_64 khi chạy. Này thực hiện một bản dịch thẳng nên thường xảy ra các chuỗi như >>>, <<<, +++---không được kết hợp lại thành hướng dẫn nhanh hơn.

Phiên bản ít chơi gôn hơn:

// size of data area
*z,c,*mmap();d[7500];(*p)();
// recursive function translates BF commands to x86_64 instructions
*j(a,g)char*a;{
  char*t=a,*n,q=0;
  for(;read(g,&c,!q);)
    t=c==91? // [
        // cmpb $0x0,(%rsi)
        // je n-t-9
        n=j(t+9,g),
        z=mempcpy(t,L"\xf003e80Ƅ",5)
        *z=n-t-9,
        n
      :
        c==93? // ]
          // jmp a-13-t
          q=*t++=233,
          z=t,
          *z=a-13-t,
          z+1
        :
          stpcpy(t,c-62? // >
                     c-60? // <
                       c-43? // +
                         c-45? // -
                           c-46? // .
                             c-44? // ,
                               ""
                             :
                               // xor %eax,%eax
                               // push %rax
                               // pop %rdi
                               // syscall
                               "1\xc0P_\xF\5"
                           :
                             // push %rdx
                             // pop %rax
                             // push %rdx
                             // pop %rdi
                             // syscall
                             "RXR_\xF\5"
                         :
                           // decb (%rsi)
                           L"໾"
                       :
                         // incb (%rsi)
                         L"۾"
                     :
                       // dec %esi
                       L"컿"
                   :
                     // inc %esi
                     L"웿");
  return t;
}
main(P,g)int**g;{
  // allocate text (executable) memory and mark as executable
  p=mmap(0,1<<20,6,34,0,0);
  // run JIT, set %rdx=1 and call code like a function
  p(*j(p,open(g[1],0))=195,d,1);
}

4

C, 374 368

Đọc từ một tập tin. Vượt qua bài kiểm tra PRIME.BF.

Cách sử dụng: ./a.out PRIME.BF

#include <stdio.h>
main(int c,char**v){int m[30000],s[99],p=0,i=0,n=0;char l[9999],d;FILE*f=fopen(v[1],"r");for(l[i]=0;i<9999&&l[i]!=EOF;l[i]=getc(f))i++;for(i=1;d=l[i];i++){if(!n){p+=d-62?0:1;p-=d-60?0:1;m[p]+=d-43?0:1;m[p]-=d-45?0:1;if(d==46)putchar(m[p]);if(d==44){m[p]=getchar();}if(d==93){i=s[c]-1;c--;n++;}}if(d==91){if(m[p]){c++;s[c]=i;}else{n++;}}n-=d-93?0:1;}}


Định dạng lại:

#include <stdio.h>
main(int c,char**v){
    int m[3000],s[99],p=0,i=0,n=0;
    char l[9999],d;
    FILE*f=fopen(v[1],"r");
    for(l[i]=0;i<9999&&l[i]!=EOF;l[i]=getc(f))i++;
    for(i=1;d=l[i];i++){
        if(!n){ // > < + - . , ] \n [ ]
            p+=d-62?0:1;
            p-=d-60?0:1;
            m[p]+=d-43?0:1;
            m[p]-=d-45?0:1;
            if(d==46)putchar(m[p]);
            if(d==44){m[p]=getchar();}
            if(d==93){i=s[c]-1;c--;n++;}
        }
        if(d==91){if(m[p]){c++;s[c]=i;}else{n++;}}
        n-=d-93?0:1;
    }
}

3000 so với 30000. Bộ đệm của bạn quá nhỏ. Kích thước chương trình cũng quá nhỏ.
Alexandru

Tôi đã sửa lỗi chính tả. Bạn có ý nghĩa gì bởi kích thước chương trình? Nếu bạn có nghĩa là kích thước tệp tối đa, bạn đã không chỉ định mức tối thiểu mà nó sẽ xử lý.
jtjacques

4

Lua, 285

loadstring("m,p={0},1 "..io.open(arg[1]):read"*a":gsub("[^.,<>[%]+-]",""):gsub(".",{["."]="io.write(string.char(@)) ",[","]="@=io.read(1):byte() ",["<"]="p=p-1 ",[">"]="p=p+1 @=@or 0 ",["["]="while @~=0 do ",["]"]="end ",["+"]="@=(@+1)%256 ",["-"]="@=(@-1)%256 "}):gsub("@","m[p]"))()

Phiên bản có thể đọc được:

loadstring( --execute
    "m,p={0},1 ".. --initialize memory and pointer
    io.open(arg[1]) --open file
        :read"*a" --read all
            :gsub("[^.,<>[%]+-]","") --strip non-brainfuck
                :gsub(".", --for each character left
                    {["."]="io.write(string.char(@)) ", -- '@' is shortcut for 'm[p]', see below
                    [","]="@=io.read(1):byte() ",
                    ["<"]="p=p-1 ",
                    [">"]="p=p+1 @=@or 0 ", --if a before unexplored memory cell, set to 0
                    ["["]="while @~=0 do ",
                    ["]"]="end ",
                    ["+"]="@=(@+1)%256 ", --i like it overflowing
                    ["-"]="@=(@-1)%256 "
                    }
                )
                    :gsub("@","m[p]") --replace the '@' shortcut
    ) --loadstring returns a function
() --call it

Hoạt động hoàn hảo

Lua, 478, w / o tải

local m,p,i,r,c={0},1,1,{},io.open(arg[1]):read"*a"while i<=#c do(({[43]=function()m[p]=(m[p]+1)%256 end,[45]=function()m[p]=(m[p]-1)%256 end,[62]=function()p=p+1 m[p]=m[p]or 0 end,[60]=function()p=p-1 end,[46]=function()io.write(string.char(m[p]))end,[44]=function()m[p]=io.read(1):byte()end,[91]=function()if m[p]==0 then i=select(2,c:find("%b[]",i))else r[#r+1]=i end end,[93]=function()if m[p]==0 then r[#r]=nil else i=r[#r] end end})[c:byte(i)]or function()end)()i=i+1 end

Phiên bản dễ đọc:

local m,   p, i, r,  c= --memory, pointer, brackets stack, code
      {0}, 1, 1, {}, io.open(arg[1]) --open file
              :read"*a" --read it
while i<=#c do --while there's code
    (
        (
            {
                [43]=function() -- +
                    m[p]=(m[p]+1)%256
                end,
                [45]=function() -- -
                    m[p]=(m[p]-1)%256
                end,
                [62]=function() -- >
                    p=p+1 m[p]=m[p]or 0 --if new memory cell, set it to 0
                end,
                [60]=function() -- <
                    p=p-1
                end,
                [46]=function() -- .
                    io.write(string.char(m[p]))
                end,
                [44]=function() -- ,
                    m[p]=io.read(1):byte()
                end,
                [91]=function() -- [
                    if m[p]==0 then
                        i=select(2,c:find("%b[]",i)) --find matching ]
                    else
                        r[#r+1]=i --push position to the stack
                    end
                end,
                [93]=function() -- ]
                    if m[p]==0 then
                        r[#r]=nil --pop from stack
                    else
                        i=r[#r] --go to position on the top of stack
                    end
                end
            }
        )[c:byte(i)] --transform character into code
        or function()end --do nothing on non-brainfuck
    )() --run the resulting function
    i=i+1 --go to the next opcode
end

4

Brainfuck, 948 byte

Vâng, mất một lúc. Tôi đã chơi một trình thông dịch tự Brainfuck bằng cách ... không phải tôi.

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

4

Nhớ lại , 594 byte

Tóm lại: Recall không có toán tử số học theo nghĩa cổ điển, nó chỉ có các phép toán bitwise. Bạn không thể chỉ "thêm một", vv Recall cũng hoàn toàn dựa trên stack.

DC505M22022M32032M606M42042M707M92092M4405022o032o06o042o07o092o044o1305022o06o042o092o52052q.q2305022o06o07o93093q.q5403206o07o14014q.q6403206o042o07o24024q.q74Yx34034z03MMMMMMMM034o3yY030401r3.4.101zyY040301r4.3.101zY01052gZ02Z040301052023s4.3.10zyY01023gZ02z030401023052s3.4.10zyY01093gZ02q20zyY01054gZ02u20zyY01014gZx20zyY01064gZ02X0zyY01024gZ03304302r33.43.20zyY01074gZ04303302r43.33.20zyyQ6205.8Y06208g6206208iZ08M808013izy062U7205.9Y07209g7207209iz09M909013izy072R53.63.82063MMMMMMMM053o63082013i53082KKKKKKKK82053063082S84.94.12.73.83t012073083TY083073012r83.73.12012084gzY012094gZt0zyy

Ví dụ 1: In một cái gì đó

Đầu vào:

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

Đầu ra:

PPCG rocks!

Ví dụ 2: Xuất số vuông lên tới 100

Đầu vào:

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

Đầu ra:

0
1
4
9
16
25
36
49
64
81
100

Ví dụ này có thể mất vài phút để thực thi và có thể gây ra thông báo "tab này bị đóng băng". Bỏ qua điều đó và chờ đợi.


4
Tên miền trang web của bạn đã hết hạn. Ngoài ra, câu trả lời này là không cạnh tranh, vì ngôn ngữ mới hơn thách thức.
mbomb007

3

OCaml (lex), 497 ký tự

OCamllex là một phần của phân phối tiêu chuẩn của OCaml.

{let a=Array.create 30000 0
let(%)f g h=f(g h)
let s v i=a.(i)<-v;i
let o d i=s(a.(i)+d)i
let p i=print_char(Char.chr a.(i));flush stdout;i
let r i=s(Char.code(input_char stdin))i
let rec w g i=if 0=a.(i)then i else w g(g i)
let n x=x}
rule t f=parse
|'>'{t(succ%f)lexbuf}
|'<'{t(pred%f)lexbuf}
|'+'{t((o 1)%f)lexbuf}
|'-'{t((o(-1))%f)lexbuf}
|'.'{t(p%f)lexbuf}
|','{t(r%f)lexbuf}
|'['{t((w(t n lexbuf))%f)lexbuf}
|']'|eof{f}
|_{t f lexbuf}
{let _=t n(Lexing.from_channel(open_in Sys.argv.(1)))0}

Lưu dưới dạng b.mll và chạy với

ocamllex b.mll && ocaml b.ml prime.bf

Tôi không thích phân tích cú pháp bằng tay, vì vậy tôi đã sử dụng trình tạo lexer được cung cấp. Từ các mã thông báo đã đọc, chúng tôi soạn một hàm cho toàn bộ chương trình brainf * ck.


3

C # (2861 char, ~ 84 dòng)

Đây không phải là giải pháp đẹp nhất cho vấn đề này và có lẽ không phải là tất cả 'Golf-ish', vì tôi không quan tâm đến độ dài như tôi có lẽ nên có. (Tôi đã không xóa các nhận xét hoặc khoảng trắng thừa.) Tôi chỉ muốn thử một cái gì đó bằng ngôn ngữ mới, để xem liệu tôi có thể. Nếu tôi làm lại, tôi sẽ bỏ việc sử dụng ngăn xếp để trở về từ ']' và chỉ cần nhìn lại. Chạy mà không có đối số dòng lệnh, nó chạy chương trình hello world được đưa ra trong phần mô tả vấn đề. Nó chấp nhận một đối số dòng lệnh, tên tệp của chương trình để chạy.

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            String ProgSource;
            if (args.Length > 0)
                ProgSource = System.IO.File.ReadAllText(args[0]);
            else //hello world
                ProgSource = "";

            Stack<int> stack = new Stack<int>();
            char[] bfProg = ProgSource.ToCharArray();
            char[] mem = new char[30000];
            int ptr = 0;

            for (int ip = 0; ip<bfProg.Length; ip++){
                switch (bfProg[ip])
                {
                    case ('>'): ptr++;  break;
                    case ('<'): ptr--;  break;
                    case ('+'): mem[ptr]++; break;
                    case ('-'): mem[ptr]--; break;
                    case ('.'): Console.Write(mem[ptr]); break;
                    case (','): 
                        char key = Console.ReadKey(false).KeyChar;
                        if (key == '\r')
                        {
                            key = (char)10;
                            Console.WriteLine();
                        }
                        mem[ptr] = key;
                        break;
                    case ('['):
                        if (mem[ptr] == 0)
                        {
                            int openBraces = 1;
                            //find the closing brace for this expression
                            for (int x = 1; x < (bfProg.Length - ip); x++)
                            {
                                if (bfProg[ip + x] == ']') openBraces--;
                                if (bfProg[ip + x] == '[') openBraces++;
                                if (openBraces == 0)
                                {
                                    if (stack.Peek() == ip) stack.Pop();
                                    ip += x;
                                    break;
                                }                                
                            }
                       }
                       else
                       {
                           stack.Push(ip);
                       }
                       break;
                    case (']'):
                        if (mem[ptr] == 0)
                            stack.Pop();
                        else
                        {
                            ip = stack.Peek();
                        }
                        break;
                }
            }

            Console.WriteLine("\n\n\nExecution Completed Sucessfully. Press any key to continue...");
            Console.ReadKey();

        }
    }

}

Chỉnh sửa: Đã xóa các tài liệu tham khảo không sử dụng.


1
@ mbomb007 - Cập nhật. Hoàn toàn quên tôi thậm chí đã làm điều này. (Thậm chí không nhận ra bất kỳ ai thậm chí đã đọc những câu hỏi cũ này)
B

Mọi người không chỉ đọc chúng, họ vẫn trả lời và đánh golf chúng.
mbomb007

3

C (gcc) , 273 268 byte

main(_,a){_=fopen("w.c","w");fputs("main(){char a[30000],*p=a;",_);x:a=getchar();fputs(a-62?a-60?a-43?a-45?a-46?a-44?a-91?a-93?~a?"":"}":"}":"while(*p){":"*p=getchar();":"putchar(*p);":"--*p;":"++*p;":"--p;":"++p;",_);if(~a)goto x;fclose(_);system("cc w.c;./a.out");};

Hãy thử trực tuyến!

-5 nhờ trần

Lấy đầu vào từ stdin.

Điều này phụ thuộc một chút vào môi trường, nhưng khá nhất quán. Đây là giải pháp hiệu quả cho c. Nó viết một chương trình C thích hợp vào tệp wc, biên dịch nó và chạy nó như là tệp thực thi mong muốn. Do đó, như một hiệu ứng tiền thưởng, điều này thực sự biên dịch mã bf và để lại a.outdưới dạng nhị phân cho nó. Lưu ý rằng tùy thuộc vào hệ thống, bạn có thể cần phải sửa đổi chuỗi cuối cùng. Cụ thể, hầu hết các trình biên dịch windows c đều gọi tệp thực thi mặc định là "a.exe". May mắn thay như tôi có thể nói, tất cả chúng đều có cùng độ dài, do đó, bytecount là như nhau. (mặc dù nếu bạn không có cc được xác định, bạn có thể cần thêm một chữ cái như gcc vào lệnh biên dịch, thêm 1 byte).

Tôi biết rằng chủ đề này hơi cũ, nhưng tôi chưa thấy phong cách giải pháp C này, vì vậy tôi nghĩ rằng tôi đã thêm nó.



2

[BIÊN TẬP]

C ++ 11, 355, đọc từ tệp:

#include<functional>
#include<stdio.h>
main(){
char b[30000],g[9999],*f=g,*p=b,n[]="+-,.><[]",j;
std::function<void()>m[]={
[&p]{(*p)++;},
[&p]{(*p)--;},
[&p]{*p=getchar();},
[&p]{putchar(*p);},
[&p]{p++;},
[&p]{p--;},
[&p,&f]{if(!(*p))while(*f-93)f++;},
[&f,&m]{while(*f-91)f--;m[6]();}
};
fread(g,1,9999,fopen(a[1],0));
for(;*f;f++)for(j=0;n[j];j++)if(n[j]==*f)m[j]();
}

Kiểm tra

http://ideone.com/b7vO4

[PHIÊN BẢN CŨ]

C ++ 11, 391, để xem chạy: http://ideone.com/yZHVv

#include<functional>
#include<stdio.h>
main(int c,char **a) {
  char b[30000],g[9999],*f=g,*r=f,*p=b;
  std::function<void()>m[256];
  m['>']=[&p]{p++;};  
  m['<']=[&p]{p--;};
  m['+']=[&p]{(*p)++;};
  m['-']=[&p]{(*p)--;};
  m['.']=[p]{putchar(*p);};
  m[',']=[&p]{*p=getchar();};
  m['[']=[p,&r,&f]{*p?r=f-1:r=0;};
  m[']']=[&r,&f]{r?f=r:r=f;};
  fread(g,1,9999,fopen(a[1],"r"));
  while (c=*(f++))if(m[c]&&(r||c==']'))m[c]();
}
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.