2010-06-12 76 views
12

'~' có nghĩa là gì trong python?'~' có nghĩa là gì trong python?

tôi đã tìm thấy thông dịch viên BF này trong python một thời gian trước đây.

import sys 

#c,i,r,p=0,0,[0]*255,raw_input() 

c=0 
i=0 
p=raw_input()  
r=[0]*255 

while c<len(p): 
    m,n,u=p[c],0,r[i] 
    if m==">":i+=1 
    if m=="<":i-=1 
    if m=="+":r[i]+=1 
    if m=="-":r[i]-=1 
    if m==".":sys.stdout.write(chr(u)) 
    if m=="[": 
     if ~u: 
      while 1: 
       m=p[c] 
       if m=="]":n-=1 
       if m=="[":n+=1 
       if ~n:break 
       c+=1 
    if m=="]": 
     if u: 
      while 1: 
       m=p[c] 
       if m=="]":n-=1 
       if m=="[":n+=1 
       if ~n:break 
       c-=1  
    c+=1 

và tôi muốn biết những gì nó làm, vì tôi muốn thực hiện một trên ti của tôi 84 (và một PF một) BF

http://en.wikipedia.org/wiki/Brainfuck và PF là một cái gì đó tương tự

+9

Thật thú vị với tôi rằng trình thông dịch Python BF có các biến bí ẩn như vậy và được viết bằng cách sử dụng các cấu trúc Python không chuẩn. Rất nhiều trong tinh thần của BF, nhưng rất nhiều không theo tinh thần của Python. – Omnifarious

+0

i phong cách mã hóa kỳ lạ thứ hai (như được dịch từ ngôn ngữ cấp thấp sang python?) Nhưng nó hoạt động - đã thử nghiệm nó với chương trình hello-world.btw, không thực hiện lệnh ',' (đầu vào) –

+2

@Omnifarious - Nếu bạn đang viết bằng tinh thần của Python, bạn sẽ không viết một thông dịch viên BF. –

Trả lời

13

Trong ngữ cảnh cụ thể này, chỉ cần thay thế '~' bằng 'không'.

PS. ok tôi đoán tôi sẽ phải giải thích - bắt đầu nhận được tát với -1, có lẽ trên tiền đề tôi không biết sự khác biệt giữa tiêu cực hợp lý và bitwise.

Vấn đề là mã trong câu hỏi là bị hỏng. Có một lỗi trong đó. Nếu bạn kiểm tra như thế nào Brainfuck nên hoạt động, nó vòng trong vòng [] niềng răng trong khi các tế bào bộ nhớ hiện nay là! = 0 (điều này sẽ được kiểm tra như điều kiện tiên quyết khi nhập [ và như tối ưu hóa trước khi trở về từ ]).

Nhưng thay vì tranh luận, có lẽ dễ dàng hơn để hiển thị với các ví dụ về mã không hoạt động. Hãy lấy chương trình đơn giản '[+]'. Cố gắng điều chỉnh điều này chỉ nên thoát (vì ô hiện tại là 0, nó thậm chí còn giành được vòng lặp). Thay vào đó, nếu bạn chạy nó trong trình thông dịch này, nó sẽ đi vào vòng lặp vô hạn.

Vì vậy, tôi vui lòng sẽ yêu cầu bạn trở lại -1 phiếu bầu của bạn nếu làm rõ của tôi có ý nghĩa bây giờ ;-)

Đây là phiên dịch một chút trang hoàng đẹp đẽ, với ~ lỗi cố định và tôi cũng bổ sung các thiếu , đầu vào:

from sys import stdin, stdout 

bfHelloWorld = '++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.' 

# http://esoteric.sange.fi/brainfuck/bf-source/prog/yapi.b 
bfPiDigits = '''> +++++ (5 digits) 
[<+>>>>>>>>++++++++++<<<<<<<-]>+++++[<+++++++++>-]+>>>>>>+[<<+++[>>[-<]<[>]<-]>> 
[>+>]<[<]>]>[[->>>>+<<<<]>>>+++>-]<[<<<<]<<<<<<<<+[->>>>>>>>>>>>[<+[->>>>+<<<<]> 
>>>>]<<<<[>>>>>[<<<<+>>>>-]<<<<<-[<<++++++++++>>-]>>>[<<[<+<<+>>>-]<[>+<-]<++<<+ 
>>>>>>-]<<[-]<<-<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]>[-]>+<<<-[>>+<<-]<]<<<<+>>>>>>> 
>[-]>[<<<+>>>-]<<++++++++++<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]>[-]>+>[<<+<+>>>-]<<< 
<+<+>>[-[-[-[-[-[-[-[-[-<->[-<+<->>]]]]]]]]]]<[+++++[<<<++++++++<++++++++>>>>-]< 
<<<+<->>>>[>+<<<+++++++++<->>>-]<<<<<[>>+<<-]+<[->-<]>[>>.<<<<[+.[-]]>>-]>[>>.<< 
-]>[-]>[-]>>>[>>[<<<<<<<<+>>>>>>>>-]<<-]]>>[-]<<<[-]<<<<<<<<]++++++++++. 
''' 

code = bfPiDigits # the code 
data = [0] * 255 # data memory 
cp = 0    # code pointer 
dp = 0    # data pointer 

while cp < len(code): 
    cmd = code[cp] 
    if cmd == '>': dp += 1 
    elif cmd == '<': dp -= 1 
    elif cmd == '+': data[dp] += 1 
    elif cmd == '-': data[dp] -= 1 
    elif cmd == '.': stdout.write(chr(data[dp])) 
    elif cmd == ',': data[dp] = ord(stdin.read(1)) 
    elif cmd == '[' and not data[dp]: # skip loop if ==0 
     n = 0 
     while True: 
      cmd = code[cp] 
      if cmd == '[': n += 1 
      elif cmd == ']': n -= 1 
      if not n: break 
      cp += 1 
    elif cmd == ']' and data[dp]: # loop back if !=0 
     n = 0 
     while True: 
      cmd = code[cp] 
      if cmd == '[': n+=1 
      elif cmd == ']': n-=1 
      if not n: break 
      cp -= 1 
    cp += 1 
+1

nếu ~ x sẽ thực hiện cho mọi giá trị ngoại trừ -1 – mikerobi

+0

@mikerobi: xem câu trả lời của tôi - tôi đã thêm giải thích và mã –

4

~ là bitwise-not.

Tôi thực sự không thể nghĩ ra cách tốt để minh họa nó (trừ khi bạn biết rằng -1 là sự phủ định bitwise của 0), nhưng the wikipedia entry là khá tốt.

21

Bitwise NOT, giống như trong C.

Trong đại diện bổ sung hai nhân, ~n tương đương với -n - 1.

+1

Với mục đích hoạt động thay đổi và mặt nạ, biểu diễn bổ sung hai cho số âm luôn được giả định trong Python http://docs.python.org/reference/datamodel.html – jfs

6

Chỉ để belabor điểm: '~' được gọi là dấu ngã.

+2

Tôi muốn +1 cho bạn nếu tôi không cung cấp cho bạn miễn phí đại diện – Ponkadoodle

10

Và để hiển thị một câu trả lời khác: hành vi của ~ đối với lớp do người dùng xác định có thể thay đổi bằng cách ghi đè phương pháp __invert__ (hoặc khe nb_invert nếu bạn đang sử dụng API Python/C) .