Bu kaba kuvvet programlarının, denedikleri her kombinasyonu gösteren şifreyi kırmasını hatırladınız mı? Daha doğrusu, bir noktada n ilk karakterleri sabittir (başarılı bir şekilde tahmin edilmiştir) ve geri kalanlar için her olası karakter test edilir. Muhtemelen bazılarını filmlerde ya da fantezi arayüzleri seven insanlar tarafından yazılmış bir yazılımda gördünüz.
Üzgünüm, üzüldüm, ancak şifreyi kırmak için bir program yazmayacağız, yalnızca güzel çıktıları üretmek için bir program yazalım.
Meydan okuma
Yazdırılabilir ascii karakterleri içeren ancak yeni satırlar içermeyen (ascii kodu 32 - 126 veya regex ile eşleşen ^[ -~]{2,}$
) bir dize verildiğinde , bu kuralları izleyerek bir çıktı yazdırın:
- O zaman
t=n seconds
,n
basılann
ilk karakterler giriş dizesinin ilk karakterleridir. - Sonra
n
sabit karakterleri, sen (Unicode aralığından üniform sözde rastgele seçilmiş bir dize oluşturulan rasgele karakter eklenir gerektiğiiçin
~
, ilk bir uzunluğu bir dizi oluşturmak üzere (kod 126 32)). - En az (daha sonradan sonra) her saniyede 20 satır çıktı vermelisiniz : her biri aynı
n
ilk karaktere, ancak farklı bir rasgele sona erecektir.
Muhtemelen henüz ne yapmanız gerektiği henüz belli değil, bu yüzden bir örnek gözden geçirelim:
Örnek
Sadece daha okunaklı olması için 20 saniyenin yerine her saniye için yalnızca 5 farklı satır yazdıracağım.
Girişi düşünün abcde
.
İlk saniye boyunca geçerli bir çıktı (tamamen rastgele) gibi bir şey olabilir:
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Ardından, t=1
aşağıdaki her dizenin a
ilk karakteri (girişin ilk karakteri) olacaktır:
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Şimdi, t=2
ilk iki karakter ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Şimdi, t=3
ilk üç karakter abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Şimdi t=4
ilk dört karakter şöyle olacak abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Son olarak, t=5
girişi yazdırıyoruz (yalnızca bir kez):
abcde
Birkaç hassas
- Dil hassasiyetinizle saniyeler boyunca çok fazla uğraşmamalısınız (örn. Algoritmanız doğru ise ancak sistem / dilinizde hassasiyet yoksa, sorun yoktur).
- İlk saniye bir saniyeden daha kısa olabilir (Yani, bir saniye boyunca programı başlatırsanız, ilk saniye sadece geçerli saniyenin sonuna kadar kalan süre olabilir). Veya farklı olarak, çıktıları yazdırmaya başlamak için yeni bir saniyenin başlamasını beklemeniz gerekmez.
- Saniyede en az 20 satır : En doğal yol, saniyede özel bir davranışa sahip (veya bir zaman aşımı veya her neyse) özel bir davranışa sahip sonsuz bir döngü olacaktır, bu da saniyede birkaç bin satır ile sonuçlanacaktır (ve bu tamamen iyidir! ). Ancak başka bir fikriniz varsa, saniyede en az 20 satır yazdırdığınız sürece kullanmaktan çekinmeyin.
- Giriş her zaman 2 karakterden uzun olacaktır.
- Girişin, yardımcı olması halinde 30 karakterden daha uzun olmayacağını düşünebilirsiniz. (Ama daha uzun olanlar için çalışıyorsa, en iyisi için)
- Giriş formatı, bir dize dilinizde en doğal gösterimi olmalıdır.
- İzleyen bir yeni satır yazdırmanıza izin verilir.
Kod örneği
Tam olarak ne yapmanız gerektiğini hala anlamadıysanız, aşağıdaki kodu görmek için linux terminalinde çalıştırabilirsiniz:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Kazanma kriteri
Bu kod-golf , bayt cinsinden kazanılan en kısa kod!
Önerilerinde ve sanal alandaki iyileştirmelerinden dolayı Laikoni ve Flp.Tkc'ye teşekkür ederiz.
\r
(animasyondaki gibi bunların hepsini birbirlerinin yerine koymalarını sağlayarak) veya \n
kabul edilebilir mi?
\n
tamamen kabul edilebilir. Sürüm \r
sadece burada çünkü daha iyi görünüyor, ama bunlara ihtiyacınız yok \r
.