Ingat program brute-force untuk memecahkan kata sandi yang menunjukkan setiap kombinasi yang mereka coba? Lebih tepatnya, pada satu titik, karakter n pertama diperbaiki (mereka telah berhasil ditebak), dan setiap karakter yang mungkin untuk yang tersisa sedang diuji. Anda mungkin pernah melihat beberapa di film, atau di beberapa perangkat lunak yang ditulis oleh orang-orang yang suka antarmuka mewah.
Maaf mengecewakan, tapi kami tidak akan menulis program untuk memecahkan kata sandi, hanya satu untuk mereproduksi output yang bagus.
Tantangan
Diberikan string yang mengandung karakter ascii yang dapat dicetak tetapi tidak ada baris baru (kode ascii 32 hingga 126 atau cocok dengan regex ^[ -~]{2,}$
), cetak output mengikuti aturan ini:
- Pada saat itu
t=n seconds
,n
karakter pertama yang dicetak adalahn
karakter pertama dari string input. - Setelah
n
karakter tetap, Anda harus menambahkan string yang membentuk karakter acak (dipilih pseudo-acak secara acak dari rentang unicodeke
~
(kode 32 hingga 126)) untuk membentuk string dengan panjang karakter awal. - Anda harus menghasilkan setidaknya (lebih lanjut tentang itu nanti) 20 baris setiap detik: masing-masing dari mereka akan memiliki
n
karakter pertama yang sama , tetapi ujung acak yang berbeda.
Mungkin belum terlalu jelas apa yang harus Anda lakukan, jadi mari kita lihat sebuah contoh:
Contoh
Saya hanya akan mencetak 5 baris berbeda untuk setiap detik, bukan 20 minimum hanya untuk membuatnya lebih mudah dibaca.
Pertimbangkan inputnya abcde
.
Selama detik pertama, output yang valid dapat berupa (benar-benar acak):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Kemudian, t=1
karakter pertama dari setiap string berikut adalah a
(karakter pertama dari input):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Sekarang,, t=2
dua karakter pertama adalah ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Sekarang, t=3
tiga karakter pertama adalah abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Sekarang,, t=4
empat karakter pertama adalah abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Akhirnya, t=5
kami mencetak input (hanya sekali):
abcde
Beberapa persiapan
- Anda tidak perlu terlalu repot dengan ketepatan bahasa Anda terhadap detik (mis. Jika algoritme Anda benar tetapi sistem / bahasa Anda kurang presisi maka tidak masalah).
- Detik pertama bisa lebih pendek dari satu detik (Yaitu, jika Anda meluncurkan program Anda selama satu detik, detik pertama dapat menjadi waktu yang tersisa hingga akhir detik saat ini). Atau dengan kata lain, Anda tidak perlu menunggu dimulainya detik baru untuk mulai mencetak hasilnya.
- Setidaknya 20 baris per detik : Cara yang lebih alami akan menjadi loop tanpa batas dengan perilaku khusus setiap detik (atau batas waktu, atau apa pun), sehingga mungkin menghasilkan beberapa ribu baris per detik (dan itu tidak apa-apa! ). Tetapi jika Anda memiliki ide lain, silakan menggunakannya selama Anda mencetak setidaknya 20 baris per detik.
- Input akan selalu lebih dari 2 karakter.
- Anda dapat mempertimbangkan bahwa input tidak akan lebih dari 30 karakter jika itu membantu. (Tetapi jika itu bekerja untuk yang lebih lama, itu untuk yang terbaik)
- Format input harus merupakan representasi string yang paling alami dalam bahasa Anda.
- Anda diizinkan untuk mencetak baris tambahan.
Contoh kode
Jika Anda masih tidak mengerti apa yang harus Anda lakukan, Anda dapat menjalankan kode berikut di terminal linux untuk melihat:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Kriteria menang
Ini adalah kode-golf , jadi kode terpendek dalam byte menang!
Terima kasih kepada Laikoni dan Flp.Tkc untuk saran dan peningkatan mereka di kotak pasir.
\r
(membuat mereka semua saling menggantikan pada layar seperti dalam animasi), atau\n
dapat diterima?\n
sangat bisa diterima. Versi dengan\r
hanya ada di sini karena terlihat lebih baik, tetapi Anda tidak memerlukannya\r
.Jawaban:
Pyth -
2724 byteIni sebenarnya terlihat sangat keren: D
Cobalah online di sini (jelas tidak secara real time, tetapi jika Anda gulir ke bawah dengan tangan yang mantap).
sumber
HTML / JavaScript,
170168167 byteSunting: Disimpan 2 byte berkat @ETHproductions. Disimpan 1 byte berkat @jrich.
sumber
setInterval
akan menerima string untuk dievaluasi, yang berpotensi menghemat satu byte?setInterval('o.textContent...',d=50)
menyimpan_=>
dan menambahkan sepasang tanda kutipNode,
145142 byteIni sepertinya agak lama, dan mungkin ada sedikit ruang untuk bermain golf. Perhatikan bahwa tanda titik koma di bagian akhir diperlukan; tanpa itu program melempar kesalahan sintaksis karena
for
pernyataan tidak memiliki tubuh.Output jauh lebih dari 20 baris per detik; seekor burung kecil memberi tahu saya bahwa sekitar 12 ribu. Berikut tampilannya di emulator terminal ConEmu di komputer saya (direkam pada 30 fps):
sumber
05AB1E , 26 byte
Saya memposting ini sebagai jawaban yang berbeda sehubungan dengan jawaban 05AB1E lainnya karena pendekatannya berbeda
Cobalah online!
sumber
η
bukannya.p
;õš
(di manaš
prepend as list) alih-alihõ¸ì
(di mana¸ì
wrap in list, dan prepend);₂
(di mana₂
26 jika tidak ada input kedua diberikan) alih-alihT·
(yaitu push 10, dan double);]
bukannya}}
(di mana]
menutup semua loop, pernyataan if-else, dll. pada saat yang sama)BASH,
99 93 92 9188 bytedengan
tr
+head
+urandom
(thx. ke @manatwork)
sumber
[ "$n" = ${#1} ]
→((n==${#1}))
;${1:0:$n}
→${1::n}
<
tidak diperlukan.((n==${#1}))
->((${#1}-n))
${1::n=SECONDS}
tampaknya berfungsi sekarang.05AB1E, 30 byte
Menggunakan pengkodean CP-1252 . Cobalah online!
Tolong bantu saya bermain golf ini.
sumber
C,
182176128126125 byteGolf:
Tidak Disatukan:
Saya pernah mendengar bahwa ada kemungkinan untuk menjatuhkan beberapa standarSaya hanya seorang idiot, itu berfungsi dengan baik tanpa mereka.#include
, tetapi saya tidak dapat membuatnya bekerja pada kompiler MingW GCC yang baru saja saya unduh. Juga tidak tahu bagaimana caranya#define b #include
tanpa menggunakan lebih banyak ruang dari yang seharusnya.sumber
a,b,c,d;
semua variabel global menyatakan seperti itu int dan init oleh 0 juga karena Anda tidak mengembalikan apa pun Anda harus menuliskannya di main ()while(i++<x)
sebagai gantifor (...)
i
harus nol setiap kali for loop berjalan lagi.for
ganti yang samai <x
dengani++<x
dan menghapusi++
Java 7,
271265207 byte-58 byte disimpan berkat @ OliverGrégoire . ( Jangan lupa untuk membatalkan jawaban Java 8 yang lebih pendek. )
Tidak Disatukan:
Input:
abcde
Keluaran:
sumber
x
:r+=(char)(33+Math.random()*94)
. JugaThread.sleep(9)
untuk menyimpan byte.r=s.substring(0,i/20)
alih-alih loop aktifj
.r.substring(0,i/20)
(yang bodoh saya), dan(char)(33+Math.random()*94)
(trik yang bagus dari Anda).WinDbg,
400391 byte-9 byte dengan menyederhanakan beberapa matematika
Ini jelas bukan jenis hal yang ingin dilakukan WinDbg. ;)
Input diambil dengan memasukkan string ascii di lokasi memori dan mengatur alamat itu ke register semu
$t0
. Misalnya:Prng yang saya gunakan adalah apa pun isi dalam memori, beberapa byte melewati string input. Chrome.exe muncul untuk mengisi ruang memori setelah
0x2000000
dengan byte yang tampak cukup acak jadi saya menggunakan dump chrome.exe. Tidak diketahui apakah ini seragam, tetapi terlihat cukup acak bagi saya.Bagaimana itu bekerja:
Catatan: Beberapa byte bisa di-golf dengan menggunakan
j
alih-alih.if
, tapi itu menyebabkannya berjalan terlalu lambat di mesin saya sehingga tidak menghasilkan setidaknya 20 baris per detik, jadi jangan menyimpan byte itu.Contoh Output: http://pastebin.com/H4H74sAx
sumber
R, 138 byte
Membaca input dari stdin.
Menghitung sekitar 61 baris di mesin saya antara setiap huruf tambahan di "kata sandi".
sumber
Bash,
247245212207 byteTerima kasih banyak Bash karena begitu sensitif terhadap ruang ...
Bagaimanapun, output diberikan secara real time pada jalur yang berbeda. Simpan sebagai
.sh
skrip dan aktifkan dengan:bash <File Name>.sh <Input>
Misalnya,
bash Cracking_In_Progress.sh okayerty
menghasilkan output berikut, yang direkam pada 30 frame per detik:sumber
Haskell (GHC), 202 byte
-5 byte tanpa aksi pengembalian carriage mewah
sumber
>
dilakukan di akhir output?MATL , 26 byte
Cobalah online!
Di bawah ini adalah output real-time dari kompiler offline. Perhatikan bahwa GIF animasi direkam pada 20 fps agar ukurannya kecil, tetapi kecepatan sebenarnya jauh lebih besar.
Bagaimana itu bekerja
sumber
Python3,
149141139 byteMasukan dari stdin.
Versi mata (157 byte):
sumber
t=time.clock
, tetapi Anda hanya menggunakan t satu kali dalam kode. Menggantinya dengan hanyatime.clock
akan menghemat 3 byte. Hal yang sama untuk dicetak.for _ in range(l-x)
juga bisafor _ in"a"*(l-x)
untuk 2 byte.print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))
alih-alihprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
Node.js, 134 byte
Mirip dengan @ETHproductions (meminjam beberapa optimasinya), tetapi sebaliknya menggunakan pendekatan yang berbeda. Menggunakan Node's
Buffer
untuk menangani pembuatan karakter alih-alih panjangString.fromCharCode
, yang memiliki manfaat tambahan yaitu membiarkan kita menggunakanmap
tanpa banyak string-> array-> overhead string conversion.sumber
Buffer
. Asal tahu saja, menugaskan kembaliDate
untukD
tidak menyimpan byte; Saya mencobanya sendiri.Python 3,
167166 byteMembaca input dari stdin. Versi 171-byte berjalan di bawah Python 2 (diganti
input
denganraw_input
):Tidak Disatukan:
sumber
Dyalog APL ,
5958 byteLarutan
Membutuhkan
⎕IO←0
yang default pada banyak sistem.Tampilan
Dengan menyesuaikan jendela menjadi dua garis, kita mendapatkan ilusi transformasi di tempat:
Penjelasan
Ini adalah fungsi kereta anonim yang mengambil kata sandi sebagai argumen yang benar.
⊢⊣
mengembalikan kata sandi dan mengabaikan hasil≢{
...}¨
fungsi di bawah ini, dengan panjang kata sandi sebagai argumen kiri, diterapkan untuk masing-masing2⊃⎕AI
waktu saat ini (lit. elemen ketiga dari informasi A ccount I )1E3+
tambahkan sebentart←
tetapkan itu ke t⊣
abaikan itu⍵{
...}⍣{t≤2⊃⎕AI}⍺
terapkan fungsi berikut (dengan sub-string sebagai ⍺ dan panjang kata sandi sebagai ⍵ ) berulang kali hingga waktu habis mencapai t⍵⍴95
95 diulang sebanyak karakter dalam kata sandi?
bilangan bulat acak 0 ... 9432+
tambahkan 32 (sehingga menghasilkan ⍵ bilangan bulat acak di kisaran 32 ... 126)⎕UCS
dikonversi ke karakter Unicode⍺,
tambahkan sub-string yang saat ini diproses⍵↑
ambil hanya karakter sebanyak yang ada di kata sandi⎕←
output yang di jalur terpisah≢
mengembalikan panjang string yang dihasilkan (= panjang kata sandi)⍳∘≢
0 ... panjang-1↑¨
masing-masing mengambil karakter dari⊂
kata sandisumber
Java, 159 byte
Algoritma yang sama dengan jawaban Kevin Cruijssen , hanya benar-benar dioptimalkan untuk Java 8.
Tidak Disatukan:
sumber
C #,
203197195190 byteGolf:
Tidak Disatukan:
l
menyimpan panjang input.StopWatch
danPath.GetRandomFileName()
merupakan bagian dari .NET framework.EDIT1:
Stopwatch
Deklarasi implisit .EDIT2:
l
inisialisasi digabung dengan deklarasi.EDIT3: Terima kasih, @ Chris.
sumber
t++
dapat dimasukkan di suatu tempat diif ()
if (w.Elapsed.Seconds > t++)
dan hapust++;
Scala,
259254248233232231227225 byteTidak Disatukan:
sumber
ForceLang ,
322309 bytesumber
C ++ (gcc) ,
280278 byteCobalah online!
Ini hanya mencetak 20 string acak menunggu 50
std::chrono::milliseconds
antara satu sama lain (sehingga menghasilkan tepat 20 baris per detik) dan kemudian melanjutkan ke langkah "cracking" berikutnya.sumber
Pergi , 244 byte
Cobalah online!(Memotong hasilnya sehingga tidak menunjukkan setiap contoh)
Ini adalah jawaban Golang pertamaku \ o /
(Difilmkan @ 30fps)
Bagaimana:
sumber
PHP, 222 byte
Tidak disatukan
(saya tahu videonya omong kosong)
sumber
$c=range(32,127)
kemudian$r=chr($c[rand(0,94)])
, mengapa tidak adil$r=chr(rand(0,94)+32)
?<?$l=strlen($a=$argv[1]);$e=$l+$s=time();while(time()<=$e&&$o!=$a){$o=substr($a,0,time()-$s);while(strlen($o)<$l)$o.=chr(rand(0,94)+32);echo "$o\n";}
adalah 149 byte, dan saya yakin itu bisaTcl , 295 byte
Golf pertama untuk saya di Tcl. Bukan bahasa yang sangat golf, karena semuanya diperlakukan sebagai string di sini sehingga spasi putih biasanya harus ...
Tidak Disatukan:
sumber
-nonewline
padaputs
parameter?expr
pada akhirnya; satu sudah cukup, dan Anda juga dapat menghindari ruang di sekitar>
expr
di akhir, saya tidak bisa melihatnya.[set k [expr $k-1]]
bisa[incr k -1]
. Dan setiap `<` bisa<
, tanpa spasi.Kotlin, 188 byte
Golf
Tidak disatukan
Mengganti nama
System.currentTimeMillis
menyimpan beberapa byte!sumber
QBIC ,
9288 byteSaya sudah memecahkannya!
Ini bergantung pada fungsi SLEEP QBasic menggunakan kode literal
$sleep 1|
, dan pada QBasicLEFT$
fungsi karena saya belum mengimplementasikan fungsi itu di QBIC ...Berhasil mengikis beberapa byte dengan mengganti semua
20
untukt
dan menetapkan ke 20. Juga, merampingkan panggilan ke acak dan loop UNTUK.Penjelasan:
Output (sepotong bagian tengah di 'helloworld')
sumber