Пароли Боба

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 Боб Уильямс 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значение. Просто небольшое несоответствие, которое может сбить с толку ...
briantist
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 ), я думаю, что было бы короче просто жестко закодировать список простых чисел :) Используя предложенный метод регулярных выражений.
  5. Определите блок сценария (по сути, анонимную функцию) для выполнения шифра Цезаря.
  6. Примените шифр к SLD, имени и фамилии
  7. Получите символ с помощью хеш-таблицы и индексирования забавного бизнеса.
  8. Наконец, гигантский беспорядок, в котором я применяю соответствующий шаблон, запускаю замену для согласных триплетов, заменяя каждый подвыражением (кодом), который заменит этот раздел соответствующим значением, а затем запускает полученную строку через Invoke-Expression( iex), чтобы выполнить генерируется код emebedded, затем окончательная замена последовательных букв одной буквой.
briantist
источник
@TimmyD Ничего себе, я никогда не видел это раньше, и это блестяще. Благодарность!
Бриантист
@TimmyD вы знаете, я изначально пытался написать его с одинарным -joinи мог поклясться, что он соединяется с пробелами, а не $nullс s, что удивило меня, но, просто попробовав это снова, получилось , как я и ожидал. Странно (и еще раз спасибо)!
Бриантист