Một khóa kết hợp chữ số N thông thường bao gồm N đĩa quay. Mỗi đĩa có các chữ số 0-9 được ghi theo thứ tự và bạn cần chuyển chúng sang mật khẩu chính xác để mở. Rõ ràng, nếu bạn không biết mật khẩu, bạn sẽ cần thử tối đa 10 N lần trước khi mở khóa. Điều đó không thú vị.
Vì vậy, hãy xem xét một biến thể của khóa kết hợp, đặt tên là khóa tiết lộ khoảng cách.
Trong mọi nỗ lực không thành công để mở khóa tiết lộ khoảng cách, nó sẽ đáp ứng số lượng chuyển động tối thiểu để mở khóa.
Một chuyển động được định nghĩa là xoay theo một vị trí, ví dụ: nó cần 1 chuyển động từ 890
đến 899
và 9 chuyển động từ 137
đến 952
.
Các thách thức
Đưa ra một khóa tiết lộ khoảng cách với mật khẩu không xác định, hãy thử mở khóa với số lần thử tối thiểu (không phải chuyển động), trong khi giữ cho chương trình không bị quá lâu.
Nội quy & Điểm
- Bạn nên viết một chương trình đầy đủ mà đầu vào từ stdin và đầu ra đến thiết bị xuất chuẩn. Chương trình nên thực hiện đầu vào / đầu ra như sau:
Start
Input an integer N (number of digits) from stdin
Do
Output a line containing decimal string of length N (your attempt) to stdout
Input an integer K (response of the lock) from stdin
While K not equal 0
End
Chương trình của bạn sẽ xử lý tối đa N = 200 và chỉ chạy dưới 5 giây cho bất kỳ đầu vào nào.
Số không hàng đầu trong đầu ra không nên được bỏ qua.
Có 5 testdata cho mỗi độ dài, vì vậy tổng số testdata là 1000. Testdata được tạo ngẫu nhiên.
Điểm cuối cùng sẽ là (tổng số lần đoán trong tất cả các bài kiểm tra) * ln (độ dài mã tính bằng byte + 50). Điểm số thấp nhất chiến thắng. (ln là nhật ký tự nhiên)
Tôi sẽ chấm điểm chương trình cho bạn. Nếu bạn muốn biết làm thế nào tôi sẽ chấm điểm chương trình của bạn, hoặc bạn muốn tự chấm điểm chương trình đó, hãy xem các chỉnh sửa trước đây trên bài đăng này .
Thử thách này sẽ kết thúc vào 2017/12/07 14:00 UTC. Tôi sẽ đăng giải pháp của tôi sau đó.
Chạy ví dụ
Các dòng bắt đầu bằng >
đại diện cho đầu vào và các dòng khác đại diện cho đầu ra chương trình.
Bạn có thể có một mật khẩu trong tâm trí của bạn và tương tác với chương trình của bạn để kiểm tra nó.
> 3 # 3-digit lock. The hidden password is 746
000 # 1st guess (by program)
> 11 # response to the 1st guess
555 # 2nd guess
> 4 # ...
755
> 2
735
> 2
744
> 2
746 # finally the correct answer! The program attempts 6 times.
> 0 # this is not necessary
Chương trình mẫu
EDIT: Có thể định dạng đầu vào / đầu ra ở trên không rõ ràng. Đây là một chương trình mẫu trong Python.
Python, 369 byte, tổng số lần thử = 1005973, điểm = 6073935
import sys
N = int(input()) # get the lock size
ans = ''
for i in range(N): # for each digit
lst = []
for j in range(10): # try all numbers
print('0' * i + str(j) + '0' * (N - i - 1)) # make a guess
result = int(input()) # receive the response
lst.append(result)
ans += str(lst.index(min(lst)))
print(ans) # output the final answer
Cảm ơn Jonah vì đã đơn giản hóa thử thách.
162751*ln(388+50)=989887
.