2010-11-03 29 views
6

Làm thế nào để tuyên bố này có thể được đơn giản hóa? Nó tạo dấu cộng: http://i.stack.imgur.com/PtHO1.pngLàm thế nào để tuyên bố này có thể được đơn giản hóa?

Nếu câu lệnh được hoàn thành, thì khối được đặt theo tọa độ x và y.

for y in range(MAP_HEIGHT): 
    for x in range(MAP_WIDTH): 
     if (x%5 == 2 or x%5 == 3 or x%5 == 4) and \ 
      (y%5 == 2 or y%5 == 3 or y%5 == 4) and \ 
      not(x%5 == 2 and y%5 == 2) and \ 
      not(x%5 == 4 and y%5 == 2) and \ 
      not(x%5 == 2 and y%5 == 4) and \ 
      not(x%5 == 4 and y%5 == 4): 
      ... 
+0

Có lẽ tôi đã không giải thích đủ rõ. Một khối được đặt ở tọa độ x và y trong đó câu lệnh if được hoàn thành. –

+2

Vui lòng không thêm nhận xét. Vui lòng ** cập nhật ** câu hỏi cần hoàn thành. Vui lòng ** sửa ** câu hỏi và xóa nhận xét. –

+0

Tôi khá chắc chắn rằng bạn có thể ngưng tụ điều này rất nhiều bằng cách sử dụng một số cắt thông minh, nhưng tôi là một chút quá lười biếng để làm việc nó ra. – Daenyth

Trả lời

15

Điều này tương tự:

if (x % 5 == 3 and y % 5 > 1) or (y % 5 == 3 and x % 5 > 1): 
+1

Chết tiệt, bạn thắng. ;-) Nhưng hãy xóa các dấu ngoặc thừa thừa. –

+1

Trừ khi tôi bị nhầm lẫn, tuyên bố của OP * không * vẽ khối cho ví dụ: x = 1; y = 3. –

+0

@Iain Galloway - điểm tốt - đã sửa nó ngay bây giờ. –

7

Có hai tầm thường sửa:

  • cache kết quả của x % 5y % 5
  • Sử dụng in hoặc xích < để kiểm tra các giá trị:

Bên cạnh đó, các thử nghiệm cho <= 4 (hoặc < 5) thực sự thừa vì mỗi giá trị của lxly sẽ < 5.

for y in range(MAP_HEIGHT): 
    for x in range(MAP_WIDTH): 
     lx = x % 5 # for local-x 
     ly = y % 5 # for local-y 
     if lx > 1 and y > 1 and \ 
      not (lx == 2 and ly == 2) and \ 
      not (lx == 4 and ly == 2) and \ 
      not (lx == 2 and ly == 4) and \ 
      not (lx == 4 and ly == 4): 

Hoặc bạn chỉ có thể giữ một danh sách của các bộ thực sự cho phép:

cross_fields = [(2, 3), (3, 2), (3, 3), (3, 4), (4, 3)] 

for y in range(MAP_HEIGHT): 
    for x in range(MAP_WIDTH): 
     if (x % 5, y % 5) in cross_fields: 
+1

Wow. Bạn đã làm cho nó như vậy .. có thể đọc được và tôi không nghĩ đến việc sử dụng danh sách/tuple cả. Cả hai đều làm việc, ngoại trừ đoạn mã đầu tiên có một vài lỗi. Các câu lệnh điều kiện kết hợp cuối cùng không nên (lX == 4 và lY == 4) và phải có một lX! = 0 và lY! = 0. –

+0

@Azrathud: Tôi thực sự thấy câu trả lời của Dave có phần tốt hơn. Dù sao, cảm ơn cho sửa chữa. –

+0

Tôi nghĩ rằng việc sử dụng bộ dữ liệu là cách để đi. Không chỉ nó sạch hơn những gì nó làm, nhưng nó cũng linh hoạt hơn. –

2

Xây dựng về câu trả lời Konrad, bạn có thể đơn giản hóa nó hơn nữa :

for y in range(MAP_HEIGHT): 
    for x in range(MAP_WIDTH): 
     lx = x % 5 # for local-x 
     ly = y % 5 # for local-y 
     if (1 < lx < 5 and 1 < y < 5 and 
      (lx, ly) not in ((2, 2), (4, 2), (2, 4), (4, 2))): 
+0

Tôi không nghĩ rằng danh sách các bộ dữ liệu là chính xác. Không nên (2,3), (3,3), (4,3), (3,2) và (3,4)? (Hoặc chờ đã, bạn chỉ bỏ lỡ một không?) –

+0

Có, bỏ lỡ không, thêm nó trở lại. –

1

trả lời thứ hai của Konrad: -

cross_fields = [(2, 3), (3, 2), (3, 3), (3, 4), (4, 3)] 

for y in range(MAP_HEIGHT): 
    for x in range(MAP_WIDTH): 
    if (x % 5, y % 5) in cross_fields: 

có lẽ là tốt nhất.

Tuy nhiên, tôi sẽ góp phần: -

for y in range(MAP_HEIGHT): 
    for x in range(MAP_WIDTH): 
    lx = x % 5 
    ly = y % 5 
    if (lx > 1 and ly == 3) or (ly > 1 and lx == 3): 
12

Về cơ bản bạn đang ốp lát một mô hình nhị phân 5x5. Đây là một biểu hiện rõ ràng về điều đó:

pattern = [[0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0], 
      [0, 0, 0, 1, 0], 
      [0, 0, 1, 1, 1], 
      [0, 0, 0, 1, 0]] 

for y in range(MAP_HEIGHT): 
    for x in range(MAP_WIDTH): 
     if pattern[x%5][y%5]: 
      ... 

Cách tiếp cận rất đơn giản và chung này sẽ cho phép dễ dàng sửa đổi mẫu.

0

Giải pháp chung để tối ưu hóa chức năng logic như thế này là Karnaugh map. Bảng chân lý của bạn sẽ là hình chữ nhật cộng với hình dạng bạn muốn với các hàng và cột là các bài kiểm tra mô đun của bạn.

+0

Ah. Vì vậy, tương tự như câu trả lời của martineau? –

+0

Bước đầu tiên sẽ là tương tự, nhưng bản đồ Karnaugh là một kỹ thuật để chưng cất biểu thức logic tối thiểu cần thiết để bao gồm các trường hợp. –

+0

(& @Iain Galloway): Bitmap được sử dụng trong câu trả lời của tôi về cơ bản là bản đồ K của hai biến đầu vào ('x% 5' và' y% 5') - vì vậy, có, kết quả sẽ giống như câu trả lời của tôi nhưng đã đến một cách hoàn toàn khác (và đơn giản hơn IMHO). – martineau

Các vấn đề liên quan