普通的N位数字密码锁由N个旋转盘组成。每个光盘上都有按顺序刻印的数字0-9,您需要将它们转换为正确的密码才能打开它。显然,如果您不知道密码,则在解锁之前最多需要尝试10 N次。那没意思。
因此,让我们考虑一下组合锁的一种变体,将其命名为距离公开锁。
在每次尝试不打开距离显示锁的尝试中,它都会响应最小数量的动作以解锁。
一个运动是通过一个位置定义为一个旋转,例如,它需要从1个运动890
到899
,并且从9个运动137
到952
。
挑战
给定具有密码未知的距离揭示锁,请尝试以最少的尝试次数(而不是移动)打开锁,同时防止程序过长。
规则和计分
- 您应该编写一个完整的程序,该程序将从stdin输入并将其输出到stdout。该程序应执行以下输入/输出:
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
您的程序最多可以处理N = 200,并且在任何输入上都应运行少于5秒。
输出中的前导零不应该被忽略。
每个长度有5个测试数据,因此测试数据的总数为1000。该测试数据是随机生成的。
最终分数将是(所有测试数据中的猜测总数)* ln(以字节为单位的代码长度+ 50)。最低分获胜。(ln是自然对数)
我会为您评分该程序。如果您想知道我将如何给您的程序打分,或者想自己给它打分,请查看此帖子以前的修改。
该挑战赛将于世界标准时间2017/12/07 14:00结束。然后,我将发布解决方案。
运行示例
以行开头的行>
代表输入,其他行代表程序输出。
您可以记住一个密码,然后与您的程序进行交互以对其进行测试。
> 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
样例程序
编辑:也许上面的输入/输出格式不清楚。这是Python中的示例程序。
Python,369个字节,尝试总次数= 1005973,得分= 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
感谢Jonah简化了挑战。
162751*ln(388+50)=989887
。