Mô hình bắn tỉa Prime Nerd


16

Ngày dài nhất trong năm - đây là thứ để lãng phí thêm thời gian ...


Tổng quat

Lưu ý đây không phải là một cuộc thi phổ biến và không phải là một thử thách đầu ra đồ họa - bạn chỉ được yêu cầu xuất ra một chuỗi gồm 65.536 số không và số không. Đoạn trích Stack ở cuối câu hỏi sẽ hiển thị đây là hình ảnh đen trắng 256 x 256 và tính điểm chính thức của bạn. Sau đó, bạn có thể lưu hình ảnh và tải nó lên câu trả lời của mình cùng với mã của bạn (vì đầu ra chuỗi sẽ không phù hợp với câu trả lời Stack Exchange 30.000 ký tự).


Chấm điểm

Điểm của một hình ảnh là tổng số điểm của các pixel riêng lẻ. Điểm của một pixel riêng lẻ là tổng của các điểm con cho mỗi pixel không chính trực , các khoảng cách nguyên tốmàu đối diện với pixel được ghi. Các subscore cho mỗi pixel như là 1/pnơi plà khoảng cách thủ.

Trong bối cảnh của câu hỏi này, các thuật ngữ có các định nghĩa sau:

  • Không trực giao: Một pixel không trực giao với pixel được ghi nếu nó không nằm trong cùng một hàng và không nằm trong cùng một cột.

  • Khoảng cách nguyên tố : Một pixel nằm ở khoảng cách chính so với pixel được ghi nếu chúng được phân tách bằng khoảng cách Euclide chính xác là số nguyên tố. Cụ thể, khoảng cách là khoảng cách tối thiểu được đo theo hình xuyến - pixel trên cùng bên trái là khoảng cáchsqrt(2)từ pixel dưới cùng bên phải (bao gồm cả 4 cạnh).

  • Màu đối diện: Một pixel có màu đối diện với pixel được ghi nếu giá trị của chúng tổng bằng 1. Nghĩa là, đầu tiên là 0 và thứ hai là 1 hoặc thứ nhất là 1 và thứ hai là 0.

Đoạn mã Stack bao gồm mã ví dụ cho biết cách ghi điểm hình ảnh, nhưng không bao gồm bất kỳ tối ưu hóa hoặc cách tiếp cận hiệu quả nào, chỉ cần mã chính xác để việc chấm điểm các hình ảnh cuối cùng có thể được thực hiện một cách nhất quán.

Nếu bất cứ điều gì trong mã không chính xác, xin vui lòng cho tôi biết trong các bình luận hoặc trong trò chuyện .

JavaScript có thể không nhất thiết là ngôn ngữ tốt nhất để trả lời cho thách thức cụ thể này. Lưu ý rằng mã Snippet cố tình không đưa ra manh mối nào về cách tiếp cận nhanh hơn. Nó sẽ chỉ có hiệu quả được giới thiệu đã được chứng minh trong một câu trả lời hiện có.


Hình dung

Các pixel ghi điểm

Để có cảm giác trực quan về việc phân phối các pixel cho điểm, ở đây (màu tím) là các pixel khoảng cách nguyên tố không trực giao cho pixel (128, 128) của hình ảnh 256 x 256:

hình ảnh phân bố khoảng cách nguyên tố không trực giao


Một hình ảnh ngẫu nhiên

Đây là hình ảnh được tạo ngẫu nhiên từ câu trả lời Python 3 ví dụ. Nó có số điểm 138.267,64 và cung cấp cho bạn một cái gì đó để đánh bại.

hình ảnh được tạo ngẫu nhiên


Đầu vào

Mã không yêu cầu đầu vào.

Đầu ra

Mã phải xuất ra một chuỗi gồm 65.536 số 0 và số 0, đại diện cho các pixel của ảnh đen trắng 256 x 256. Các chữ số phải là một chuỗi liên tục, không có dấu phân cách. Bạn có thể thấy việc sao chép và dán dễ dàng hơn nếu bạn xuất ra một tệp, nhưng điều này tùy thuộc vào bạn.

Mã của bạn cũng có thể xuất thông tin khác mà bạn thấy hữu ích, miễn là chuỗi có thể được sao chép và dán vào Stack Snippet. Ví dụ: bạn có thể muốn xuất chuỗi tốt nhất cho tệp và điểm tốt nhất cho STDOUT theo định kỳ, cho phép người dùng chọn thời điểm dừng tìm kiếm.


Đoạn trích

Như ra nhọn bởi Sp3000 , đoạn được dùng 10 phút để tính toán điểm, đó là một chút quá chậm, ngay cả đối với một tài liệu tham khảo thực hiện cố tình không hiệu quả. Tôi đã chỉnh sửa trong cải tiến đề xuất của Sp3000 về việc tính toán trước các điểm ảnh pixel để tính điểm và bây giờ mất vài giây để tính điểm.


Nếu bạn sử dụng đầu ra hoặc mã của câu trả lời khác làm điểm bắt đầu cho mã của riêng bạn, hãy nhớ cung cấp tín dụng và liên kết đến câu trả lời hỗ trợ. Câu trả lời cho câu hỏi này không cần ghi có câu trả lời mẫu hoặc mã trong câu hỏi.

Tín dụng cho Randall Munroe cho thuật ngữ Nerd Sniping

Câu trả lời:


36

CJam, điểm số 276496.9062958626

2,128*_(]128*

Hóa ra là tối ưu, bởi vì: Không có bất kỳ cặp không trực giao nào có khoảng cách 2. Vì vậy, khoảng cách phải là số lẻ và khoảng cách bình phương cũng vậy. Vì p 2 = x 2 + y 2 , một trong số x và y (bình phương hoặc không) phải là số lẻ và số còn lại phải là số chẵn. Những điểm đó luôn ở màu đối diện trong hình ảnh này.

Điều này và tiêu cực của nó cũng là giải pháp tối ưu duy nhất. Trong một giải pháp tối ưu, không có các pixel khoảng cách nguyên tố không trực giao nên có cùng màu. Có các pixel đối diện chéo nhau như (3,4) và (4,3). Bằng cách điền vào các pixel đối diện của màu đối diện, v.v., chúng ta có thể có được một đường chéo có cùng màu. Bắt đầu từ mỗi pixel theo đường chéo, chúng ta có thể nhận được tất cả các đường chéo được điền theo cùng một cách. Lưu ý rằng họ quấn quanh. Nó vẫn là tối ưu nếu họ không, mặc dù.


3
Tôi đã hy vọng mọi người sẽ mất nhiều thời gian hơn để nhận ra rằng ...
trichoplax

1
Tôi đã mất một thời gian dài để tìm ra rằng có một giải pháp tối ưu khi viết câu hỏi này, vì vậy tôi nghĩ rằng nó sẽ đáng để đăng lên như một thách thức. Làm thế nào bạn nhìn thấy nó rất nhanh? Nó chỉ rõ ràng hoặc bạn đã có một quá trình suy nghĩ cụ thể?
trichoplax

4
Tái bút Tôi không biết bạn đã xem câu hỏi này lúc mấy giờ nhưng một giải pháp tối ưu 71 phút sau khi câu hỏi được đăng là xứng đáng với tiền thưởng - tôi sẽ phải đợi 2 ngày trước khi tôi có thể chỉ định ...
trichoplax

@trichoplax Từ hình ảnh đầu tiên của bạn, dường như có nhiều điểm trong cùng một đường chéo. Tôi đã nghĩ đến việc sử dụng các sọc rộng hơn lúc đầu. Và sau đó tôi đã mở Gimp để xác minh ý tưởng của mình. Và thật ngạc nhiên, tôi đã có một hình ảnh hoàn toàn đen khi tôi điền nó với mẫu này.
jimmy23013

8
@trichoplax Cho rằng bạn biết rằng có một giải pháp tối ưu, tôi nghĩ rằng bạn nên sửa đổi câu hỏi để làm cho nó ít giải quyết hơn. Mặc dù jimmy23013 đã tìm thấy nó nhanh, nhưng nó luôn là vấn đề thời gian cho đến khi ai đó tìm thấy nó, và rồi nó cũng kết thúc.
xnor

1

Trăn 3, điểm 138267,64

Đây là một câu trả lời tối thiểu như một ví dụ về những gì được yêu cầu và như một thứ gì đó để đánh bại ...

Nó bao gồm

  • Tên ngôn ngữ.
  • Điểm từ Stack Snippet trong câu hỏi.
  • Hình ảnh được lưu từ Stack Snippet.
  • Mã được sử dụng để sản xuất chuỗi 65.536 số không và số.

Đầu ra

hình ảnh được tạo ngẫu nhiên

from random import random

output_string = ''
filename = '65536digits.txt'

for t in range(65536):
    digit = int(random() * 2)
    output_string += str(digit)

with open(filename, 'w') as output_file:
    output_file.write(output_string)

Đây chỉ là một ví dụ. Python có thể không nhất thiết là ngôn ngữ tốt nhất cho câu trả lời cạnh tranh cho thách thức cụ thể này.

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.