đoán số của bạn

Oct 17 2020

Tập lệnh đơn giản yêu cầu bạn nghĩ về một số từ 1 đến 63, sau đó đưa ra danh sách các số và hỏi xem số của bạn có trong danh sách đó không. Điều này có thể được tái cấu trúc thêm không? Có cách nào tốt hơn để tạo danh sách không? Có cải tiến nào không?

x= [xx for xx in range(1,64)]
num_i = [i for i in range(1,64,2)]
num_ii = x[1::16]+ x[2::16]+ x[5::16]+ x[6::16]+ \
         x[9::16]+ x[10::16]+ x[13::16]+ x[14::16]
num_ii.sort()
num_iii= x[3::16]+ x[4::16]+ x[5::16]+ x[6::16]+ \
         x[11::16]+ x[12::16]+ x[13::16]+ x[14::16]
num_iii.sort()
num_iv=  x[7::16]+ x[8::16]+ x[9::16]+ x[10::16]+ \
        x[11::16]+ x[12::16]+ x[13::16]+ x[14::16]
num_iv.sort()
num_v= x[15::32]+ x[16::32]+ x[17::32]+ x[18::32]+ \
       x[19::32]+ x[20::32]+ x[21::32]+ x[22::32]+ \
       x[23::32]+ x[24::32]+ x[25::32]+ x[26::32]+ \
       x[27::32]+ x[28::32]+ x[29::32]+ x[30::32]
num_v.sort()
num_vi= [x for x in range(32,64)]
num_lists=[num_i,num_ii,num_iii,num_iv,num_v,num_vi]
addition_num= [1,2,4,8,16,32]
start_end= ["Think of a number between 1 and 63","I think the number you thought of was ..."]
intro= ["Is your number in the group of numbers below?",
        "Is your number in this group of numbers ?","Is your number in this third group of numbers ?",
        "Half way there. Is your number in this group of numbers ?",
        "One more after this one. Is your number in this group of numbers ?",
        "Last one. Is your number in this group of numbers ?"]
def format_list(xx):    
    for a,b,c,d,e,f,g,h in zip(xx[::8],xx[1::8],xx[2::8],xx[3::8],xx[4::8],xx[5::8],xx[6::8],xx[7::8]):
        print('{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}{:<}'.format(a,b,c,d,e,f,g,h))
    print('-'*62)
def main():    
    count=0
    your_guess= 0
    print(start_end[0])
    ready= input('are you ready?(enter to quit or any key)')
    if ready:
        while count < 6:
            print(intro[count])    
            format_list(num_lists[count])
            reply = input("y/n ?")
            if reply == "y" :
                your_guess += addition_num[count]
            count +=1
    print(start_end[1] + str(your_guess))
    replay= input('Play again? (enter to quit or any key)')
    if replay:        
        main()
if __name__ == '__main__':
    main()

Trả lời

10 hjpotter92 Oct 17 2020 at 23:17

Những con số kỳ diệu

Như đã được đề cập trong phần bình luận, các con số \$ 1, 2, \cdots \$dường như hoàn toàn ngẫu nhiên đối với bất kỳ ai không chắc chắn về cách tổng kết sẽ hoạt động (hoặc được cho là) ​​hoạt động. Việc tạo ra các danh sách cũng rất cồng kềnh. Thủ thuật tương tự có thể được mở rộng thành lựa chọn tối đa \$ 127, 255, 511, \cdots, 2^{n} - 1 \$.

Đệ quy main

Bạn có một cuộc gọi đệ quy đến maintrong trường hợp người chơi muốn chơi lại trò chơi. Các cuộc gọi đệ quy khi bạn không bao giờ quay lại có thể dẫn đến tràn ngăn xếp. Trong trường hợp này, dù sao thì đệ quy cũng không thực sự cần thiết.

Sử dụng quá nhiều danh sách

Bạn có hầu hết mọi thứ được đưa vào danh sách. Điều này bao gồm tất cả các số từ \$ 1-63 \$, tất cả các biểu đồ được tạo từ những con số này, tổng hợp của tất cả các danh sách trên, danh sách quyền hạn của \$ 2 \$, và như thế.

Đối với một số người trong số đó, một tuple (bất biến) là tốt, những người khác không cần phải đặt trong danh sách.

Đặt tên biến

x, xx, xxx, xxxx, .. không thực sự có ý nghĩa. Sử dụng tên biến tốt hơn.


Để tạo danh sách số:

for start in (2 ** i for i in range(6)):
    l = [_ for _ in range(start, 64) if _ % (start * 2) >= start]

Viết lại:

INTROS = (
    "Is your number in the group of numbers below?",
    "Is your number in this group of numbers?",
    "Is your number in this third group of numbers?",
    "Half way there. Is your number in this group of numbers?",
    "One more after this one. Is your number in this group of numbers?",
    "Last one. Is your number in this group of numbers?",
    # "Or maybe the following?",
    # "Add more intro strings here",
    # "to get larger guessing range",
)
COUNT = len(INTROS)
UPPER_LIMIT = 2 ** COUNT


def display_chart(index: int, columns: int = 8):
    print(INTROS[index])
    start = 1 << index
    chart = [str(x) for x in range(start, UPPER_LIMIT) if x % (start * 2) >= start]
    for i in range(len(chart) // columns):
        print("\t".join(chart[i * columns : (i + 1) * columns]))


def game():
    guess = 0
    print(f"Think of a number between 1 and {UPPER_LIMIT - 1}")
    for current in range(COUNT):
        display_chart(current)
        reply = input("y/n? ")
        if reply == "y":
            guess += 1 << current
    print(f"I think the number you thought of was ... {guess}")


def main():
    while True:
        game()
        character = input("Play again? (enter to quit or any key)")
        if not character:
            break


if __name__ == "__main__":
    main()

Việc viết lại bây giờ là hoàn toàn động về bản chất. Nếu bạn muốn tăng phạm vi, chỉ cần thêm một phần khác vào INTROSbộ tuple.

3 Reinderien Oct 17 2020 at 23:33

Đầu tiên vượt qua:

  • Di chuyển hầu hết các nội dung tạo danh sách vào một hàm
  • Các bản sửa lỗi của PEP8: chuẩn hóa khoảng trắng, loại bỏ lỗi thoát tiếp tục, khoảng cách giữa các hàm
  • Một số bộ giá trị bất biến thay vì danh sách
def make_num_lists():
    x = [xx for xx in range(1, 64)]
    num_i = [i for i in range(1, 64, 2)]
    num_ii = (x[ 1::16] + x[ 2::16] + x[ 5::16] + x[ 6::16] +
              x[ 9::16] + x[10::16] + x[13::16] + x[14::16])
    num_ii.sort()
    num_iii = (x[ 3::16] + x[ 4::16] + x[ 5::16] + x[ 6::16] +
               x[11::16] + x[12::16] + x[13::16] + x[14::16])
    num_iii.sort()
    num_iv = (x[ 7::16] + x[ 8::16] + x[ 9::16] + x[10::16] +
              x[11::16] + x[12::16] + x[13::16] + x[14::16])
    num_iv.sort()
    num_v = (x[15::32] + x[16::32] + x[17::32] + x[18::32] +
             x[19::32] + x[20::32] + x[21::32] + x[22::32] +
             x[23::32] + x[24::32] + x[25::32] + x[26::32] +
             x[27::32] + x[28::32] + x[29::32] + x[30::32])
    num_v.sort()
    num_vi = [x for x in range(32, 64)]
    return [num_i, num_ii, num_iii, num_iv, num_v, num_vi]


num_lists = make_num_lists()
addition_num = (1, 2, 4, 8, 16, 32)
start_end = (
    "Think of a number between 1 and 63",
    "I think the number you thought of was ...",
)
intro = (
    "Is your number in the group of numbers below?",
    "Is your number in this group of numbers ?",
    "Is your number in this third group of numbers ?",
    "Half way there. Is your number in this group of numbers ?",
    "One more after this one. Is your number in this group of numbers ?",
    "Last one. Is your number in this group of numbers ?",
)


def format_list(xx):
    for a,b,c,d,e,f,g,h in zip(xx[::8],xx[1::8],xx[2::8],xx[3::8],xx[4::8],xx[5::8],xx[6::8],xx[7::8]):
        print('{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}{:<}'.format(a,b,c,d,e,f,g,h))
    print('-'*62)


def main():
    count = 0
    your_guess = 0
    print(start_end[0])
    ready = input('are you ready?(enter to quit or any key)')
    if ready:
        while count < 6:
            print(intro[count])
            format_list(num_lists[count])
            reply = input("y/n ?")
            if reply == "y":
                your_guess += addition_num[count]
            count += 1
    print(start_end[1] + str(your_guess))
    replay = input('Play again? (enter to quit or any key)')
    if replay:
        main()


if __name__ == '__main__':
    main()

Nhưng điều này là không đủ. Làm những gì @ hjpotter92 đề xuất.