Общие слова по-прежнему следует избегать использования в качестве паролей. Эта задача о кодировании очень простая программа , которая munges данный пароль ( M odify U ntil N ВЗ G uessed E asily).
вход
Слово, которое представляет собой строку, написанную в алфавите abcdefghijklmnopqrstuvwxyz
. Не имеет значения, являются ли буквы строчными или прописными.
Munging
- Замените любую повторяющуюся последовательность одной и той же буквы на себя, с предшествующим количеством повторений буквы (
LLLL
с4L
) - Измените первое
a
с@
- Измените первое
b
с8
- Измените первое
c
с(
- Измените первое
d
с6
- Измените первое
e
с3
- Измените первое
f
с#
- Измените первое
g
с9
- Измените первое
h
с#
- Измените первое
i
с1
- Изменить второй
i
с!
- Измените первое
k
с<
- Измените первое
l
с1
- Изменить второй
l
сi
- Измените первое
o
с0
- Измените первое
q
с9
- Измените первое
s
с5
- Изменить второй
s
с$
- Измените первое
t
с+
- Измените первое
v
с>
- Изменить второй
v
с<
- Измените первое
w
сuu
- Изменить второй
w
с2u
- Измените первое
x
с%
- Измените первое
y
с?
Правило 1 должно применяться необходимое количество раз, пока не станет возможным применить его еще раз. После этого применяются остальные правила.
Выходные данные Манипулированное слово
Примеры
codegolf
->(0639o1#
programming
->pr09r@2m1ng
puzzles
->pu2z135
passwords
->p@25uu0r6$
wwww
->4uu
aaaaaaaaaaa
->11a
lllolllolll
->3103io3l
jjjmjjjj
->3jm4j
Это код-гольф , поэтому, пожалуйста, сделайте свою программу максимально короткой!
Ничто в этом посте не должно использоваться в качестве идей паролей или как часть практики паролей.
Ответы:
Java 8,
237321319280247241240237 байт+84 байта, потому что правила получили изменения .. ( РЕДАКТИРОВАТЬ: Наконец, вернемся к моим начальным 237 байтам. ) Заменить
WWWW
на222W
легко в Java, но4W
нет. Если бы только в Java был способ использовать группу захвата регулярных выражений для чего-то. Получение длины с"$1".length()
, замена самого соответствия на"$1".replace(...)
, преобразование соответствия в целое числоnew Integer("$1")
или использование чего-то похожего на Retina (то естьs.replaceAll("(?=(.)\\1)(\\1)+","$#2$1")
) или JavaScript (то естьs.replaceAll("(.)\\1+",m->m.length()+m.charAt(0))
) было бы моей вещью номер 1, которую я хотел бы видеть в Java в будущее принесет пользу кодегольфингу ..>.> Я думаю, что это 10-й раз, когда я ненавижу, что Java ничего не может сделать с совпадением группы захвата ..-78 байт благодаря @ OlivierGrégoire .
Ввод / вывод в верхнем регистре.
Объяснение:
Попробуй это здесь.
источник
JavaScript (ES6), 147 байт
Тестовые случаи
Показать фрагмент кода
объяснение
Выполняет серию замен во входной строке
s
в порядке, указанном в запросе. Каждый элемент в серии - это массив или строка с двумя элементами, которые затем распространяются (...r
) и передаютсяs.replace()
.источник
05AB1E , 69 байт
-9 байт благодаря Emigna
Попробуйте онлайн!
источник
'w„uu„2u‚â
4uu
γvygD≠×yÙ}J
Perl 5 , 152 + 1 (
-p
) = 153 байтаПопробуйте онлайн!
источник
-p
используется в качестве аргумента дляperl
командной строки, которая автоматически считывает вводSTDIN
и сохраняетprint
содержимое$_
в конце скрипта. TIO допускает эту опцию, и, посколькуperl -pe<code>
она на 1 байт больше, чемperl -e<code>
считается одним дополнительным байтом.~
междуj~k
быть!
вместо этого? В настоящее время он заменил второе вхождениеi
с~
вместо!
.Вероятно, не самый удачный гольф, но это работает.
-6 байт благодаря овсу
-77 байт благодаря NieDzejkob и Джонатану Френчу
Python 3 ,
329323 байта,246 байтовПопробуйте онлайн!
источник
.lower()
jjjmjjjj
должен выводить3jm4j
но выводит3jm3jj
. Редактировать: 258 байт с этой проблемой исправленоСетчатка ,
166124 байтаПопробуйте онлайн! Объяснение:
Замените серию повторяющихся букв длиной и буквой.
Сопоставьте первое вхождение букв
a
вy
и пометить их с заполнителем.Исправить первое появление
w
.Исправить первое вхождение всех других букв из
a
вy
и удалить заполнители.Марк (первоначально) второе вхождение букв
i
,l
,s
,v
, илиw
с заполнителем.Исправить второе появление
w
.Исправьте второе вхождение остальных четырех букв.
источник
Haskell ,
221218213 байтовПопробуйте онлайн!
Злоупотребления
foldr
для запуска строки через последовательность строковых преобразований в обратном направлении. Последовательность «запускается», сr
которой выполняется замена счетчика повторений с помощьюspan
разрыва хвоста строки, когда он перестает быть равным голове. Если первая часть не пуста, это повторение, поэтому мы печатаем длину +1. Далее мы приводим аргументf
для замены каждого символа в (обратном) порядке. Замены кодируются в виде одной строки, причем первый символ является заменяемым символом, а остальная часть - строкой (поскольку замены w являются несколькими символами), чтобы занять ее место. Я поместил эти закодированные строки в одну большую строку, разделенную пробелами, чтобыwords
разбить ее на список для меня.РЕДАКТИРОВАТЬ: Спасибо @Laikoni за спасение мне 5 байтов! Это было умное использование, о котором
$
я не думал. Я тоже не знал этого<-
трюка.источник
(p,q)<-span(==a)b
вместоlet(p,q)=span(==a)b
иp>[]
вместоp/=[]
.m
pointfree:($(f<$>words"w2u ... y?")++[r]).foldr($)
попробуйте онлайн!Lua , 173 байта
Попробуйте онлайн!
Разгромил и объяснил:
источник
C # (.NET Core),
317,289, 279 байтПопробуйте онлайн!
Я надеюсь, что можно получить массив символов в качестве входных данных, а не строку.
Ungolfed :
источник
С ++,
571495478444 байта-127 байт благодаря Захари
"/a@/b8/c(/d6/e3/f#/g9/h#/i1//i!/k</l1//li/o0/q9/s5//s$/t+/v>/wuu//w2u/x%/y?/"
строка используется для преобразования из одного символа другим. 1/
означает, что первый «следующий символ» должен быть заменен тем, что следует за следующим/
, 2 означает, что второй «следующий символ» должен быть заменен следующим.Попробуйте онлайн
источник
R ,
224219 байтПопробуйте онлайн!
Неприятно, но основной частью является итеративная замена в
Reduce
.sub
меняет только первое вхождение матча.Спасибо JayCe за указание на хороший гольф!
источник
Perl 5 , 123 байта
122 байта код + 1 для
-p
.Разработано независимо от @ Xcali «S ответа , но используя очень похожий процесс.
Попробуйте онлайн!
источник
Python 2 ,
220216194190188 байтПопробуйте онлайн!
Python 3 , 187 байт
Попробуйте онлайн!
источник
Пип ,
103102 байтаПопробуйте онлайн!
объяснение
Код выполняет три шага преобразования:
* Нам нужно проверить,
a@?m@0
есть ноль. Недостаточно проверить, что это правда, поскольку 0 является допустимым индексом, который ошибочен. У Pip нет короткого встроенного способа проверить, является ли значение ноль, но проверка его длины работает достаточно хорошо в этом случае: любое число будет иметь длину по крайней мере 1 (истинно), а nil имеет длину ноль (ложь).источник