Паролі Боба


13

Вступ

Боб любить мати різні паролі для кожного веб-сайту, який він використовує. Він хоче паролі в спеціальному форматі, щоб він міг запам'ятати. Допоможіть йому, створивши генератор паролів, який є максимально коротким за довжиною коду, тому що він любить зберігати речі короткими, як його ім'я.

Виклик

Створіть Боб генератор паролів, який приймає чотири параметри -

  • Адреса домену, (наприклад: stackexchange.com)
  • Ім'я,
  • прізвище,
  • Дата народження та рік народження.

і виводить рядок, який зазнав наступних перетворень.

Кожен пароль має шаблон на основі довжини l доменного імені. Якщо l є простим, то шаблон такої форми -

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

інакше це така форма -

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

Поле символу матиме значення на основі типу домену.

.com -> $$$
.org -> &&&
.net -> %%%
.edu -> +++
.gov -> @@@
.mil -> >>>
за замовчуванням -> ~~~

Тепер він також хоче запустити кесарів шифр над полями [firstname][domain-name][lastname]. Напрямок зсуву правильний, якщо l - це інше, ліве. Значення зсуву визначається значенням додавання дати народження та року народження.

Після вищезазначеного процесу текст не може бути легко запам'ятований, тому він хоче, щоб зашифрований текст був вимовляється. Для цього він хоче замінити кожного третього поспіль приголосного на голосну в алфавітному порядку (тобто aeiou).

Нарешті, він хоче видалити послідовні зустрічі одних і тих же літер.

Приклад

Вхід - stackexchange.com bob williams 0894

Вихід - 08qraicvafyecugjigyoq94 $$$.

Пояснення:

Шаблон пароля є [birth-date][domain-name][lastname][birth-year][symbol], оскільки довжина доменного імені stackexchangeє головним. Символ буде таким, $$$як є тип домену .com.

Давайте заповнимо ці значення у шаблоні - 08stackexchangewilliams94$$$. Тепер цезарний шифр повинен бути запущений на полях [firstname][domain-name][lastname](у цьому випадку це лише прізвище). Напрямок зсуву є правильним, оскільки l є простим, а значення зсуву - 08+94 = 102.

Отже, 08stackexchangewilliams94$$$перетворюється на 08qryaicvafylecugjjgykq94$$$. Тепер кожен третій послідовний приголосний замінюється голосним - 08qraaicvafyeecugjigyoq94$$$ усі послідовні окуляри тієї самої літери видаляються - 08qraicvafyecugjigyoq94$$$. Не хвилюйтесь, що це можна вимовити для Боба.

додаткова інформація

  • Адреса домену, ім'я та прізвище містять лише алфавіти з малих літер.
  • Адреса домену завжди буде складатися лише з домену другого рівня та верхнього рівня, як stackexchange.comі ні codegolf.stackexchange.com. Крім того, такі домени .co.ukне дозволені, але справедливі .ukабо .inдійсні.
  • Заміна голосної в алфавітному порядку - циклічна. Я маю на увазі після u, aвикористовується для заміни.
  • Діапазон ASCII для шифру Цезар становить 97 - 122 включно.
  • Ви можете взяти інформацію, як описано тут .
  • Вихід повинен бути рядком.
  • Формат дати та року народження є ddі yy. Отже, 02прийнятний і 2ні.

Це код-гольф, тому виграє найкоротший код у байтах. Щасливого гольфу!


4
Чи завжди доменне ім’я буде складатися лише з домену другого рівня та верхнього рівня, наприклад stackexchange.com, ні img.stackexchange.com? Що з доменами країн bbc.co.uk?
британіст

Ваш приклад використовує виклик, 0894який додає, 102але пояснення використовує 08+96=106. Здається, що в зашифрованому тексті використовується 102значення. Просто невелика непослідовність, яка могла б бентежити ...
брианіст

6
Боб - один божевільний мофо, якщо він може це вимовити.
Чарівна урва восьминога

5
@carusocomputing Можливо, Боб є валлійською?
британіст

1
Ні, я мав на увазі, що ти defualtнеdefault
Роман Гряф

Відповіді:


7

PowerShell 3+, 480 476 474 453 450 448 байт

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'

Спробуйте в Інтернеті!

Збережено 24 26 байт завдяки TimmyD !

Ого, це був божевільний. Я не думаю, що зможу опублікувати повну інформацію про це пізніше чи завтра.

Примітка: усі закінчення рядка є \n( 0x10), так що мені не доведеться використовувати ;та ставити все це на один рядок.

Швидкий огляд:

  1. Розділіть домен на другий і верхній рівні.
  2. Розділіть дати народження на місяць та рік.
  3. Обчисліть значення зсуву.
  4. Визначте, чи є довжина SLD простим. Оскільки сегмент не може бути довше 63 символів ( див. Також RFC 1035 ), я вважаю, що це було коротше, лише для жорсткого кодування списку прайметів :) Використовуючи запропонований метод regex.
  5. Визначте сценарій блоку (по суті анонімна функція) для виконання шифру Цезаря.
  6. Застосуйте шифр до SLD, імені та прізвища
  7. Отримайте символ за допомогою смішного та індексуючого смішного бізнесу.
  8. Нарешті, гігантський безлад, де я застосовую відповідний шаблон, запускаю заміну для приголосних трійок, замінюючи кожну з піддепресії (код), яка замінить цей розділ відповідним значенням, а потім запустіть отриманий рядок через Invoke-Expression( iex) для виконання згенерований смарагдовий код, потім остаточна заміна послідовних букв однією буквою.

@TimmyD Нічого цього не бачив, і це геніально. Спасибі!
британіст

@TimmyD Ви знаєте, я спочатку намагався написати це унарним, -joinі я міг присягнути, що він з'єднується з пробілами, а не $nulls, що мене здивувало, але, лише спробувавши його знову, воно спрацювало так, як я спочатку очікував. Дивно (і ще раз дякую)!
британіст
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.