Bob Şifreleri


13

Giriş

Bob kullandığı her web sitesi için farklı şifreler bulmayı sever. Hatırlayabilmesi için özel bir biçimde şifreler istiyor. Kod uzunluğunda olabildiğince kısa bir şifre üreticisi oluşturarak ona yardımcı olun, çünkü şeyleri adı gibi kısa tutmayı seviyor.

Meydan okuma

Bob'a dört parametre alan bir şifre üreticisi oluşturun.

  • Alan adresi, (ör: stackexchange.com)
  • İsim,
  • Soyadı,
  • Doğum tarihi ve yılı.

ve aşağıdaki dönüşümlerden geçmiş bir dize çıktılar.

Her parolanın etki alanı adının l uzunluğunu temel alan bir şablonu vardır . Eğer l asalsa, şablon bu formda olur -

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

aksi halde bu formdadır -

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

Sembol alanı, alan türüne göre değerlere sahip olacaktır.

.com -> $$$
.org -> &&&
.net -> %%%
.edu -> +++
.gov -> @@@
.mil -> >>>
varsayılan -> ~~~

Şimdi, aynı zamanda tarlalar üzerinde bir sezar şifresi çalıştırmak istiyor - [firstname][domain-name][lastname]. L başka bir şey kaldıysa kaydırma yönü doğru . Vardiya değeri doğum tarihi ve yılı ilavesiyle belirlenir.

Yukarıdaki işlemden sonra, metin kolayca hatırlanamaz, böylece şifrelenen metnin belirgin olmasını ister. Bunu yapmak için her üç ardışık ünsüzü alfabetik sırayla bir sesli harfle değiştirmek istiyor (yani aeiou).

Son olarak, aynı harflerin ardışık tekrarlarını silmek istiyor.

Misal

Giriş - stackexchange.com bob williams 0894

Çıktı - 08qraicvafyecugjigyoq94 $$$.

Açıklama:

Parola şablonu [birth-date][domain-name][lastname][birth-year][symbol], çünkü etki alanı adının uzunluğu stackexchangeasaldır. Sembol, $$$alan türü gibi olacaktır .com.

Şablondaki bu değerleri dolduralım - 08stackexchangewilliams94$$$. Şimdi sezar şifresinin tarlalarda çalıştırılması gerekiyor [firstname][domain-name][lastname](bu durumda sadece soyadı). Vites yönü doğru çünkü l asal ve kaydırma değeri 08+94 = 102.

Böylece, 08stackexchangewilliams94$$$dönüşür 08qryaicvafylecugjjgykq94$$$. Şimdi her üç ardışık ünsüz bir sesli harfle değiştirilir - 08qraaicvafyeecugjigyoq94$$$ aynı mektubun her ardışık okeyleri silinir - 08qraicvafyecugjigyoq94$$$. Merak etme Bob için belirgindir.

ilave bilgi

  • Etki alanı adresi, ad ve soyadı yalnızca küçük harfli alfabe içerir.
  • Alan adresi daima, sadece ikinci düzey ve üst düzey etki alanı oluşur gibi olacak stackexchange.comdeğil codegolf.stackexchange.com. Ayrıca, gibi alan adlarına .co.ukizin verilmez, yalnızca .ukveya .ingeçerlidir.
  • Sesli harfin alfabetik sırayla değiştirilmesi döngüseldir. Demek istediğim u, ayerine kullanılır.
  • Sezar şifresi için ASCII aralığı 97-122 dahildir.
  • Burada açıklandığı gibi girdi alabilirsiniz .
  • Çıktı bir dize olmalıdır.
  • Doğum tarihi ve yıl biçimidir ddve yy.Peki 02kabul edilebilir ve 2değildir.

Bu kod golfüdür, bu nedenle bayttaki en kısa kod kazanır. Mutlu Golf!


4
Alan adı her zaman yalnızca ikinci ve üst düzey alanlardan oluşacak mı stackexchange.com, değil img.stackexchange.commi? Peki ülke alanları nasıl bbc.co.uk?
Briantist

Sizin örnek çağrı kullandığı 0894kadar ekler 102ama açıklama kullanımları 08+96=106. Şifrelenmiş metin 102değeri kullanıyor gibi görünüyor . Kafa karıştırıcı olabilecek hafif bir tutarsızlık ...
Briantist

6
Bob bunu telaffuz edebiliyorsa çılgın bir mofo.
Sihirli Ahtapot Urn

5
@carusocomputing Belki Bob Galce?
Briantist

1
Hayır demek istediğim tür defualtdeğildefault
Roman Gräf

Yanıtlar:


7

PowerShell + 3, 480 476 474 453 450 448 bayt

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'

Çevrimiçi deneyin!

Kaydedilen 24 26 sayesinde bayt TimmyD !

Vay be, bu çılgınca biriydi. Daha sonraya veya yarına kadar bunun tam bir dökümünü gönderebileceğimi sanmıyorum.

Not: tüm satır sonları \n( 0x10), böylece kullanmak ;ve hepsini tek bir satıra koymak zorunda değilim .

Hızlı genel bakış:

  1. Alan adını ikinci ve en üst seviyeye ayırın.
  2. Doğum tarihini ay ve yıla bölün.
  3. Kaydırma değerini hesaplayın.
  4. SLD uzunluğunun asal olup olmadığını belirleyin. Yana segmenti uzun 63 karakterden fazla olamaz ( aynı zamanda RFC 1035 bakınız ), ben sadece asal listesini :) kodlamalısınız kısaydı düşünüyorum önerdi regex yöntemi kullanarak.
  5. Sezar şifresini gerçekleştirmek için bir scriptblock (esasen anonim işlev) tanımlayın.
  6. Şifreyi SLD'ye, adınıza ve soyadınıza uygulayın
  7. Bir karma ve indeksleme komik iş ile sembol olsun.
  8. Son olarak, uygun şablonu uygulamak dev karışıklık, ardından aracılığıyla ortaya çıkan dize çalıştırmak, uygun değerle o bölümü yerini alacak alt ifadenin bir (kod) ile her biri yerine ünsüz üçüz için yerine bir çalıştırmak Invoke-Expression( iex) yürütmek için Gömülü kod oluşturduktan sonra ardışık harflerin tek bir harfle son bir yerine konması

@TimmyD wow Bunu daha önce hiç görmedim ve harika. Teşekkürler!
Briantist

Bildiğiniz gibi, başlangıçta tekli ile yazmaya çalıştım -joinve $nulls ile değil, boşluklarla birleştiğine yemin edebilirdim , ama beni şaşırttı, ama yine de denedikten sonra beklediğim gibi çalıştı. Tuhaf (ve tekrar teşekkürler)!
Briantist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.