Kata Sandi Bob

13

pengantar

Bob suka memiliki kata sandi yang berbeda untuk setiap situs web yang ia gunakan. Dia ingin kata sandi dalam format khusus sehingga dia bisa mengingat. Bantu dia dengan membuat generator kata sandi yang sesingkat mungkin dalam panjang kode, karena dia suka menyimpan barang sesingkat namanya.

Tantangan

Buat Bob generator kata sandi yang mengambil empat parameter -

  • Alamat domain, (mis: stackexchange.com)
  • Nama depan,
  • nama keluarga,
  • Tanggal dan tahun lahir.

dan menghasilkan string yang telah mengalami transformasi berikut.

Setiap kata sandi memiliki templat yang didasarkan pada l panjang nama domain. Jika l adalah prima maka templatnya adalah dari bentuk ini -

[birth-date][domain-name][lastname][birth-year][symbol]

selain itu dari formulir ini -

[symbol][birth-year][firstname][domain-name][birth-date].

Bidang simbol akan memiliki nilai berdasarkan tipe domain.

.com -> $$$
.org -> &&&
.net -> %%%
.edu -> +++
.gov -> @@@
.mil -> >>>
default -> ~~~

Sekarang, ia juga ingin menjalankan cesar caesar di atas bidang - [firstname][domain-name][lastname]. Arah pergeseran tepat jika aku adalah yang utama itu kiri. Nilai shift ditentukan oleh nilai penambahan tanggal lahir dan tahun.

Setelah proses di atas, teks tidak dapat dengan mudah diingat sehingga ia ingin teks yang diacak itu dapat diucapkan. Untuk melakukan ini ia ingin mengganti setiap konsonan ketiga berturut-turut dengan vokal dalam urutan abjad (yaitu, aeiou).

Akhirnya, ia ingin menghapus kejadian berturut-turut dari huruf yang sama.

Contoh

Masukan - stackexchange.com bob williams 0894

Output - 08qraicvafyecugjigyoq94 $$$.

Penjelasan:

Templat kata sandi adalah [birth-date][domain-name][lastname][birth-year][symbol], karena panjang nama domain stackexchangeadalah yang utama. Simbol akan berupa $$$tipe domain .com.

Mari kita mengisi nilai-nilai itu di templat - 08stackexchangewilliams94$$$. Sekarang caesar cipher harus dijalankan di bidang [firstname][domain-name][lastname](hanya nama belakang dalam kasus ini). Arah shift benar karena l adalah prima dan nilai shift adalah 08+94 = 102.

Jadi, 08stackexchangewilliams94$$$berubah menjadi 08qryaicvafylecugjjgykq94$$$. Sekarang setiap konsonan ketiga berturut-turut diganti dengan vokal - 08qraaicvafyeecugjigyoq94$$$ setiap kali berturut-turut huruf yang sama dihapus - 08qraicvafyecugjigyoq94$$$. Jangan khawatir itu bisa diucapkan untuk Bob.

informasi tambahan

  • Alamat domain, nama depan dan nama belakang hanya berisi huruf kecil.
  • Alamat domain akan selalu hanya terdiri dari domain level kedua dan level atas, suka stackexchange.comdan tidak codegolf.stackexchange.com. Juga, domain seperti .co.uktidak diizinkan tetapi adil .ukatau .invalid.
  • Penggantian vokal dalam urutan abjad adalah siklik. Maksud saya setelah u, adigunakan untuk menggantikan.
  • Rentang ASCII untuk cipher Caesar adalah 97 - 122 inklusif.
  • Anda dapat mengambil input seperti yang dijelaskan di sini .
  • Output harus berupa string.
  • Format tanggal dan tahun lahir adalah dddan yy. Jadi 02dapat diterima dan 2tidak.

Ini adalah kode-golf, jadi kode terpendek dalam byte menang. Selamat Golf!

Gurupad Mamadapur
sumber
4
Akankah nama domain selalu hanya terdiri dari domain tingkat kedua dan tingkat atas, seperti stackexchange.com, bukan img.stackexchange.com? Bagaimana dengan domain negara bbc.co.uk?
briantist
Contoh panggilan Anda menggunakan 0894yang menambahkan hingga 102tetapi penjelasan menggunakan 08+96=106. Teks ciphered tampaknya menggunakan 102nilai. Hanya sedikit ketidakkonsistenan yang bisa membingungkan ...
briantist
6
Bob adalah salah satu mofo gila jika dia bisa mengucapkan itu.
Magic Gurita Guci
5
@carusocomputing Mungkin Bob adalah orang Wales?
briantis
1
Tidak, maksud saya Anda defualttidak mengetikdefault
Roman Gräf

Jawaban:

7

PowerShell 3+, 480 476 474 453 450 448 byte

param($d,$f,$l,$b)$s,$t=$d-split'\.'
$m,$y=$b-split'(?<=..)(?=..)'
$v=+$m+$y
$p='1'*$s.Length-match'^(?!(..+)\1+$)..'
$c={-join([char[]]"$input"|%{[char](97..122)[((+$_-97)+((26-$v),$v)[$p])%26]})}
$s=$s|&$c
$f=$f|&$c
$l=$l|&$c
$a=(($a=@{com='$';org='&';net='%';edu='+';gov='@';mil='>'}.$t),'~')[!$a]*3
("`"$(("$a$y$f$s$m","$m$s$l$y$a")[$p]-replace'([^aeiou\d]{3})',"`$('`$1'-replace'[a-z]`$$',('aeiou'[`$i++%5]))")`""|iex)-replace'([a-z])\1+','$1'

Cobalah online!

Disimpan 24 26 byte berkat TimmyD !

Wow, ini gila. Saya tidak berpikir saya dapat memposting rincian lengkap ini sampai nanti atau besok.

Catatan: semua akhiran baris adalah \n( 0x10), jadi saya tidak perlu menggunakan ;dan meletakkan ini semua di satu baris.

Ikhtisar cepat:

  1. Membagi domain menjadi level kedua dan level atas.
  2. Bagi tanggal lahir menjadi bulan dan tahun.
  3. Hitung nilai shift.
  4. Tentukan apakah panjang SLD adalah prima. Karena segmen tidak boleh lebih dari 63 karakter ( lihat juga RFC 1035 ), saya pikir itu lebih pendek hanya untuk hardcode daftar bilangan prima :) Menggunakan metode regex yang disarankan.
  5. Tentukan scriptblock (fungsi anonim dasarnya) untuk melakukan cipher Caesar.
  6. Terapkan cipher ke SLD, nama depan, dan nama belakang
  7. Dapatkan simbol dengan bisnis lucu yang mudah diindeks dan diindeks.
  8. Akhirnya, kekacauan besar di mana saya menerapkan templat yang sesuai, menjalankan pengganti untuk kembar tiga konsonan, mengganti masing-masing dengan subekspresi (kode) yang akan mengganti bagian itu dengan nilai yang sesuai, kemudian jalankan string yang dihasilkan melalui Invoke-Expression( iex) untuk menjalankan kode emebedded yang dihasilkan, kemudian penggantian akhir dari huruf berturut-turut dengan satu huruf.
briantis
sumber
@TimmyD wow Saya belum pernah melihat itu sebelumnya, dan ini brilian. Terima kasih!
briantist
@TimmyD tahukah Anda, saya awalnya mencoba menulisnya dengan unary -joindan saya bisa bersumpah itu bergabung dengan spasi dan bukan $null, yang mengejutkan saya, tetapi setelah mencobanya lagi itu bekerja seperti yang saya harapkan. Aneh (dan terima kasih lagi)!
briantis