Meydan okuma
Göreviniz bir tamsayıyı ASCII karakterleri dizisi olarak kodlamak ve ardından söz konusu dizginin rasgele karıştırılmasından sonra başarıyla kodunu çözmek.
Kodlayıcı ve Kod Çözücü olarak adlandırılacak iki program / fonksiyon yazacaksınız .
Encoder
- Giriş: [ 0 , 2 31 - 1 ] aralığında bir tam sayı .
- Çıktı: Bir dize arasında ASCII karakterleri (ille yazdırılabilir değil).
şifre çözücü
- Girdi: rastgele permütasyon dizesi içinde .
- Çıkış: tam sayı .
puanlama
Let olmak maksimum uzunluğu arasında bütün olası değerleri arasında . Eğer Kodlayıcı olmayan deterministik hareket (izin verilen, aşağıya bakınız), daha sonra maksimum uzunlukta olacaktır (muhtemelen oluşabilecek ).
Let olmak uzunluğu Encoder bayt ve uzunluğu Dekoder bayt.
O zaman puanın .
Zafer en düşük puanı sunmaya verilir .
Zaman sınırı
Tek bir test çantası için hem Encoder hem de Kod Çözücünün çalıştırma süresinde 1 dakikalık bir keyfi zaman sınırı var (yani n'nin tek bir değeri ).
Amaç, belirli dizilere sahip tüm dizileri numaralandırarak kodlamaya kaba kuvvet uygulayan çözümü önlemek. Çözümünüz bundan daha akıllıca bir şey yaparsa, büyük olasılıkla zaman kısıtlamasına uyacak ve geçerli sayılacaktır. Aynı şekilde, n'nin rastgele seçilmiş bazı değerleri için TIO üzerinde çalışıyorsa, geçerli sayılacaktır. Aksi halde, makinemde test edeceğim, ancak çözümünüz saf kaba kuvvet ise neredeyse kesin olarak başarısız olacağını unutmayın.
kurallar
- Encoder ve Decoder yazılmalıdır aynı dil .
- Dekoder zorunluluk çıkışı doğru tamsayı mümkün olan her permütasyon için dizesi arasında tarafından döndürülen Encoder .
- Encoder ve Decoder vardır değil izin hisse bilgilerine (küresel değişkenler veya dosyaların vasıtasıyla örneğin) herhangi bir şekilde.
- Çıktısı Encoder gerek yok olmak deterministik (aynı giriş olduğunu ise farklı çıkış dizeleri üretebilir Encoder birden çok kez çalıştırılır), ancak Dekoder her zaman doğru tamsayı tahmin gerekir .
- Kodlayıcı ve Dekoder alıp tamsayı döndürebilir de , herhangi bir uygun şekilde (örneğin, eğer , giriş olması için ince
14
,"14"
ya da[1,4]
). - Kodlayıcı olabilir dizgesinden yoluyla baskı üzerine
stdout
ya ile dönen bir dizi, bir liste / dizi karakter veya aralığında bir tamsayı liste / dizi ; O notu Dekoder girdi olarak bir permütasyon alacak tarafından döndürülen Encoder o dize kabul etmelidir, böylece de aynı biçimde olarak . - Standart boşluklar yasaktır.
- Mümkünse, kodunuzun nasıl çalıştığını ve iddia ettiğiniz puanın neden doğru olduğunu açıklayın .
Örnek
varsayalım .
- Kodlayıcı alan
14
girdi olarak kullanılmaktadır. Çıktısı olabilir"qwerty"
.- Dekoder bir permütasyon alır
"qwerty"
, örneğin, olarak giriş"tweyqr"
. Çıkması gerekir14
(uygun herhangi bir biçimde).
Kodlayıcı geri olabilir [113,119,101,114,116,121]
, bu durumda, hem de kod çözücü (örneğin) almış olur [116,119,101,121,113,114]
.
Kodlayıcı tarafından döndürülen dizenin, yazdırılamayan ASCII karakterleri de içerebileceğini (ancak her zaman aralık dahilinde [0x00, ..., 0x7F]
) unutmayın.