Pengantar:
Saya memiliki banyak cipher yang berbeda yang disimpan dalam dokumen yang pernah saya kompilasi sebagai seorang anak, saya memilih beberapa yang saya pikir paling cocok untuk tantangan (tidak terlalu sepele, dan tidak terlalu keras) dan mengubahnya menjadi tantangan. Sebagian besar dari mereka masih berada di kotak pasir, dan saya belum yakin apakah saya akan memposting semuanya, atau hanya beberapa. Tapi di sini adalah yang pertama dari mereka untuk memulai.
Computer Cipher akan mengenkripsi teks yang diberikan ke dalam kelompok karakter 'acak' dari suatu yang diberikan length
. Jika grup tersebut berisi angka, itu akan menggunakan angka itu untuk mengindeks ke dalam kelompoknya sendiri untuk karakter yang dienkripsi. Jika tidak ada digit yang ada dalam grup, itu berarti karakter pertama digunakan.
Misalnya, katakanlah kita ingin menyandikan teks this is a computer cipher
dengan panjang tertentu 5
. Ini adalah output potensial (catatan: angka 1-diindeks pada contoh di bawah):
t h i s i s a c o m p u t e r c i p h e r (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv (without spaces of course, but added as clarification)
Mari kita ambil beberapa kelompok sebagai contoh untuk menjelaskan cara menguraikan grup:
qu5dt
: Kelompok ini berisi digit5
, sehingga (1-diindeks) karakter ke-5 dari kelompok ini adalah karakter yang digunakan untuk teks diuraikan:t
.hprit
: Kelompok ini tidak mengandung angka, sehingga karakter pertama dari kelompok ini digunakan secara implisit untuk teks diuraikan:h
.osyw2
: Kelompok ini mengandung digit2
, sehingga (1-diindeks) karakter 2 dari kelompok ini adalah karakter yang digunakan untuk teks diuraikan:s
.
Tantangan:
Diberikan bilangan bulat length
dan string word_to_encipher
, menghasilkan string acak terenkripsi seperti yang dijelaskan di atas.
Anda hanya perlu mengenkripsikan yang diberikan length
dan word_to_encipher
, jadi tidak perlu membuat program / fungsi penguraikan juga. Saya mungkin membuat tantangan bagian 2 untuk menguraikan di masa depan.
Aturan tantangan:
- Anda dapat mengasumsikan
length
akan berada dalam kisaran[3,9]
. - Anda dapat mengasumsikan surat
word_to_encipher
wasiat tersebut hanya berisi surat. - Anda dapat menggunakan huruf besar atau huruf besar penuh (sebutkan mana yang Anda gunakan dalam jawaban).
- Output Anda, setiap grup, dan posisi digit dalam grup (jika ada) harus acak secara seragam . Jadi semua huruf acak dari alfabet memiliki peluang yang sama terjadi; posisi huruf yang dienkripsi dalam setiap kelompok memiliki peluang yang sama terjadi; dan posisi digit memiliki peluang yang sama terjadi (kecuali ketika itu karakter pertama dan tidak ada digit; dan itu jelas tidak bisa berada pada posisi yang sama dengan karakter yang dienkripsi).
- Anda juga diizinkan untuk menggunakan angka 0-diindeks daripada 1-diindeks. Silakan sebutkan yang mana dari dua yang Anda gunakan dalam jawaban Anda.
- Digit
1
(atau0
ketika 0-diindeks) tidak akan pernah ada dalam output. Jadib1ndh
bukan grup yang valid untuk mengenkripsi karakter 'b'. Namun,b4tbw
berlaku, di mana4
enciphers yangb
di-4 (1-diindeks) posisi, dan karakter lainb
,t
,w
adalah acak (yang kebetulan juga berisib
). Kelompok valid kemungkinan lain darilength
5 untuk menulis dlm kode karakter 'b' adalah:abcd2
,ab2de
,babbk
,hue5b
, dll
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'. - Aturan standar berlaku untuk jawaban Anda dengan aturan I / O default , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
- Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.
Kasus uji:
Input:
Length: 5
Word to encipher: thisisacomputercipher
Possible output:
qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv
Input:
Length: 8
Word to encipher: test
Possible output:
ewetng4o6smptebyo6ontsrbtxten3qk
Input:
Length: 3
Word to encipher: three
Possible output:
tomv3h2rvege3le
abcd2
,ab2de
,babbk
semua sama? Jugab1akk
valid?b1akk
saya akan mengatakan tidak. Akan mengeditnya dalam deskripsi tantangan untuk diklarifikasi. Jika karakter pertama adalah karakter terenkripsi, tidak boleh ada digit."a??"
memiliki 676 hasil yang mungkin, tapi"1a?"
,"?a1"
,"2?a"
,"?2a"
, memiliki only104 hasil. Jadi, jika saya mencoba untuk memilih satu hasil dari semua 780 hasil ini, distribusi "posisi huruf yang dienkripsi" adalah 13: 1: 1, bukan 1: 1: 1. Dan saya akan menganggap ini sebagai cara "acak seragam" bekerja.Jawaban:
Pyth, 22 byte
Cobalah online.
Gunakan huruf kecil dan pengindeksan nol.
Penjelasan
Algoritma yang sangat mudah.
sumber
Perl 6 , 125 byte
Cobalah online!
Membawa input dan output dalam huruf besar. Membawa input yang kari, seperti
f(n)(string)
. Gunakan 1 pengindeksan.Penjelasan:
sumber
Python 2 ,
187177176156154148 byteCobalah online!
Menggunakan huruf besar, dan angka 0-diindeks.
-3 byte, terima kasih kepada Kevin Cruijssen
sumber
sample(R(l),2)[::1|-(random()<.5)]
artinyarange(l)
, dan mengocoknya. Tapi ternyata sampel tidak menjamin pesanan, jadi tidak diperlukan :)(j==i)*(n>0)
? Multiply memiliki operator diutamakan atas pengurangan bukan?JavaScript (Node.js) , 135 byte
Cobalah online!
Terima kasih Arnauld untuk 1B
sumber
R ,
134132123 byteCobalah online!
Mengambil huruf besar.
Penjelasan kode lama (sebagian besar pendekatan yang sama):
sumber
Java (JDK) , 193 byte
Cobalah online!
IntStream
(didapatString::chars
) sebagai input, serta nomor dan mengembalikan yang lainIntStream
.double
keint
tidak perlu karena+=
peretasan.sumber
Japt , 29 byte
Cobalah online!
Diindeks nol.
Penjelasan:
sumber
C, 115 byte
Cobalah online!
Diindeks, huruf kecil.
Sedikit tidak berbulu dan meluas:
Kode harus cukup mudah. Dua random
i
, yangj
dihasilkan dalam saturand()
panggilan bagus dan independen karena gcd (n
,~-n
) = 1 danRAND_MAX
besar.sumber
Bersih , 256 byte
Cobalah online!
Memilih:
x
(posisi karakter di segmen)y
yang tidak sama denganx
(posisi digit di segmen)x
dan tidak sama dengany
kecualix
nolsumber
JavaScript, 134 byte
Cobalah online!
Jawaban ini memilih string yang disandikan dari semua string yang mungkin disandikan secara seragam. Jadi lebih mungkin untuk membuat surat yang disandikan sebagai yang pertama.
sumber
C # (Visual C # Interactive Compiler) , 171 byte
Cobalah online!
Penjelasan...
sumber
Arang ,
3530 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Diindeks 0. Penjelasan:
Masukkan panjangnya.
Masukkan kata dan loop di atas karakter.
Pilih posisi acak untuk huruf yang diuraikan.
Pilih posisi acak yang berbeda untuk digit, kecuali jika hurufnya ada di posisi 0, dalam hal ini letakkan digit pada posisi 0 juga.
Ulangi satu kali untuk setiap karakter keluaran dan aktifkan posisi.
Jika ini adalah posisi digit maka keluarkan posisi huruf yang diuraikan.
Tetapi jika ini adalah posisi huruf yang diuraikan maka output surat itu. Ini lebih diutamakan daripada posisi digit karena Charcoal mengambil entri terakhir jika beberapa sakelar saklar memiliki nilai yang sama.
Kalau tidak, output surat acak.
sumber
05AB1E , 26 byte
Diindeks 0.
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber