Giriş
Diyelim ki siz ve arkadaşınız bir oyun oynuyorsunuz. Arkadaşınız belirli bir n
bit dizisini düşünüyor ve göreviniz diziyi sorular sorarak çıkarmaktır. Ancak, sormanıza izin verilen tek soru türü, "dizinizin en uzun ortak dizisi ne kadardır S
" ve S
herhangi bir bit dizisinin nerede olduğudur. Ne kadar az soruya ihtiyacınız olursa o kadar iyidir.
Görev
Göreviniz girdi olarak pozitif bir tam sayı n
ve ikili R
uzunluk dizisi alan bir program veya işlev yazmaktır n
. Sekans, bir tamsayı dizisi, bir dize veya seçtiğiniz başka bir makul tür olabilir. Programınız sıralamayı çıkarır R
.
Programınız edilir değil dizisini erişmesine izin R
doğrudan. Sadece o yapmak izin verilen şey R
fonksiyonuna girdi olarak vermek len_lcs
başka bir ikili dizisi ile birlikte S
. Fonksiyon len_lcs(R, S)
en uzun ortak alt dizisinin uzunluğunu döndürür R
ve S
. Bu, hem R
ve hem de (mutlaka bitişik olmayan) bir alt sekans olarak ortaya çıkan en uzun bit dizisi anlamına gelir S
. Girdileri len_lcs
farklı uzunluklarda olabilir. Program bu işlevi R
ve diğer dizileri birkaç kez çağırmalı ve daha sonra R
bu bilgilere dayanarak diziyi yeniden yapılandırmalıdır .
Misal
Girişleri n = 4
ve R = "1010"
. İlk olarak, değerlendirmek olabilir len_lcs(R, "110")
veren 3
beri, "110"
en uzun ortak sonradan olan "1010"
ve "110"
. Sonra biliyoruz ki bir noktaya bir bit sokarak R
elde edilir "110"
. Daha sonra, en uzun ortak alt diziler olduğu ve bu yüzden doğru olmadığı için len_lcs(R, "0110")
geri dönen deneyebiliriz . Sonra deneriz , geri döner . Şimdi bunu biliyoruz , böylece bu diziyi doğru çıktı olarak geri verebiliriz. Bunun için 3 çağrı gerekiyordu .3
"110"
"010"
"0110"
len_lcs(R, "1010")
4
R == "1010"
len_lcs
Kurallar ve puanlama
Gelen bu depo , sen adlı bir dosya bulacaksınız subsequence_data.txt
75 ve 124 arası uzunluklarda 100 rastgele ikili dizileri Onlar 0 ile 1 arasında rasgele üç yüzer alarak ortalama alınarak üretildi içeren a
bir ve sonra saygısız a
-biased sikke n
kez. Puanınız, bu dizilere yapılan ortalama çağrı sayısıdırlen_lcs
, daha düşük puan daha iyidir. Gönderiniz çağrı sayısını kaydetmelidir. Göndermeden önce programınızı dosya üzerinde çalıştırmanız dışında hiçbir zaman sınırı yoktur.
Gönderiniz belirleyici olacaktır. PRNG'lere izin verilir, ancak bugünün tarihini 200116
(veya en yakın eşdeğerini) rastgele tohum olarak kullanmaları gerekir . Gönderinizi bu belirli test senaryolarına göre optimize etmenize izin verilmez. Bunun olduğundan şüpheleniyorsam, yeni bir parti oluşturacağım.
Bu kod golf değildir, bu nedenle okunabilir kod yazmanız önerilir. Rosetta Kodunda bir en uzun ortak alt sayfası ; bunu len_lcs
kendi dilinizde uygulamak için kullanabilirsiniz .
lcs
yerine erişebileceğiniz yer olduğunu düşünüyorum len_lcs
.
lcs(R, "01"*2*n)
döndüğünden beri çok ilginç olmazdı R
. ;) Ama eğer arama 1 yerine lcs(R, S)
skoru artıracaksa işe yarayabilir len(S)
ya da bunun gibi bir şey ...