Sıradan bir N basamaklı şifreli kilit, N döner diskten oluşur. Her disk sırayla 0-9 arası rakamlara sahiptir ve açmak için doğru şifreye çevirmeniz gerekir. Açıkçası, şifreyi bilmiyorsanız, kilidini açmadan önce en fazla 10 N kez denemeniz gerekir. Bu ilginç değil.
Öyleyse kombinasyon kilidinin bir varyantını düşünelim, mesafeyi ortaya çıkaran kilit olarak adlandırın.
Mesafeyi açığa çıkaran bir kilidi açmaya yönelik her başarısız girişimde, kilidini açmak için minimum hareket sayısına yanıt verir.
Bu 1 hareket ihtiyacı örneğin, bir hareket, bir konum bir dönme hareketi olarak tanımlanır 890
için 899
ve 9 hareketleri 137
için 952
.
Meydan okuma
Şifresi bilinmeyen bir mesafeyi ortaya çıkaran bir kilit verildiğinde , programı çok uzun süre engellemekten korurken , kilidi minimum sayıda denemeyle (hareketlerle değil) açmaya çalışın .
Kurallar ve Puanlamalar
- Stdin'den çıkışlara ve stdout'a çıkış yapan tam bir program yazmalısınız. Program giriş / çıkışı aşağıdaki gibi yapmalıdır:
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
Programınız N = 200 değerine kadar işlem görmeli ve herhangi bir girişte 5 saniyeden daha kısa sürede çalışmalıdır.
Çıktıda önde gelen sıfırlar atlanmamalıdır.
Her uzunluk için 5 test verisi olduğundan toplam test verisi sayısı 1000'dir. Test verileri rastgele oluşturulur.
Nihai puan (tüm test verilerindeki toplam tahmin sayısı) * ln (bayt cinsinden kod uzunluğu + 50) olacaktır. En düşük puan kazanır. (ln doğal kütüktür)
Programı senin için puanlayacağım. Programınızı nasıl puanlayacağımı bilmek istiyorsanız veya kendiniz puanlamak istiyorsanız , bu yayındaki önceki düzenlemelere göz atın .
Bu mücadele 2017/12/07 14:00 UTC de sona erecek. O zaman çözümümü göndereceğim.
Koşu Örneği
İle başlayan satırlar >
girişi, diğerleri ise program çıktısını temsil eder.
Aklınızda bir şifre olabilir ve test etmek için programınızla etkileşimde bulunabilirsiniz.
> 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
Örnek Program
EDIT: Belki yukarıdaki giriş / çıkış biçimi net değildi. İşte Python'da örnek bir program.
Python, 369 bayt, toplam deneme sayısı = 1005973, puan = 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'a mücadeleyi basitleştirdiği için teşekkürler .
162751*ln(388+50)=989887
.