รหัสล็อคแบบ 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 testdata สำหรับทุกความยาวดังนั้นจำนวนของ testdata ทั้งหมดคือ 1000 ข้อมูล testdata จะถูกสร้างแบบสุ่ม
คะแนนสุดท้ายจะเป็น (จำนวนการเดาทั้งหมดใน testdata ทั้งหมด) * ln (ความยาวโค้ดเป็นไบต์ + 50) คะแนนต่ำสุดชนะ (ln เป็นบันทึกธรรมชาติ)
ฉันจะทำคะแนนโปรแกรมให้คุณ หากคุณต้องการทราบว่าฉันจะให้คะแนนโปรแกรมของคุณหรือคุณต้องการให้คะแนนด้วยตัวเองลองดูการแก้ไขก่อนหน้าของโพสต์นี้
ความท้าทายนี้จะสิ้นสุดใน 2017/12/07 14:00 UTC ฉันจะโพสต์โซลูชันของฉันแล้ว
ตัวอย่างการวิ่ง
บรรทัดที่เริ่มต้นด้วยการ>
เป็นตัวแทนอินพุตและอื่น ๆ เป็นตัวแทนเอาท์พุทโปรแกรม
คุณสามารถมีรหัสผ่านในใจและโต้ตอบกับโปรแกรมของคุณเพื่อทดสอบ
> 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
คุณได้คะแนนที่ดีของ