Это намного сложнее, чем « Как рандомизировать буквы в слове» и « Кембриджская транспозиция» из-за правила о том, какие буквы можно поменять с какими. Простого регулярного выражения здесь будет недостаточно.
Хорошо известно, что текст все еще можно прочитать, пока внутренности его слов зашифрованы, пока их первая и последняя буквы плюс их общие контуры остаются постоянными. Получив печатный текст Ascii + Newline, скремблируйте каждое слово в соответствии с этими правилами:
Скремблирование должно быть (псевдо) случайным.
Слово - это последовательность латинских символов от A до Z.
Только начальные буквы всегда будут заглавными.
Первые и последние буквы должны остаться нетронутыми.
При скремблировании только буквы в одной из следующих групп могут поменяться местами:
acemnorsuvwxz
bdfhkl
gpqy
it
j
(остается на месте)
пример
Srcmable wrods в то время как psrrnveieg их oeiltnus
Хорошо известно, что текст все еще может быть прочитан, в то время как внутренности его слов были сняты, пока их первые и последние буквы плюс их ovaerll ontliues raemin не могут сделать. Принимая участие в программе Acsii + Nwnliee, вы можете найти слово anoccdirg для этих людей:
Smncrbliag должен быть (pusedo) rondam.
Wrod - это продолжение латинских chreratacs, A thurogh Z.
Только начальные члены будут выше.
Первые и последние письма должны оставаться уктоэнхудом.
Когда sarnclbimg, только буквы с одним из fwllnoiog guorps могут поменять местами:
aneusvrowxmcz
bhkfdl
gqpy
it
j
(остается в отеле)Emxaple
t
должен быть короче, чемh
хотя многие люди не пишут это так.t
из группы 2? Или, может быть, положитьt
в группу 4 сi
?printable
/patnirlbe
не совсем читабельно. Я думаю, чтоi
/t
своп виноват. Хм ...paintrlbe
Нет, это тоже не помогло. Это, вероятно,pr
/pa
своп, то. Контур поддерживает, но я думаю , что я прочитал «PR» и «па» как семантический (?) 1 письмо.prtnialbe
О да. Это сделал это. Не уверен, что могу предложить исправление алгоритма.Ответы:
Желе ,
8074 байта-2 байта, переходя от
czar + vex + mow + sun
кczar + vexes + unmown
(повторяющиесяe
s иn
s не проблема)-1 байт, используя
Tị
вместоȦÐf
-1 байт,
Œle€Øa
вместоi@€ØB>⁵
-2 байт, немного перенастроив схему
Полная программа, содержащая список символов (или строку в формате Python), которая печатает результат скремблирования.
Попробуйте онлайн!
Кажется, здесь очень много трудностей для Jelly (либо я, либо пропустил уловку, которая, как известно, случается!). Это наверняка будет преодолено языками с лучшими манипуляциями со строками, такими как
Retina(без случайной функциональности) или 05ab1e .Как?
источник
czar + vex + mow + sun
‽acemnorsuvwxz
. Я напишу комментированный код тоже в какой-то момент.PHP, 278 байт
Попробуйте онлайн!
расширенный
функции
array_combine
array_filter
array_keys
ksort
preg_replace_callback
шарканье
источник
Pyth , 79 байт
где
❤
U + 0018.Попробуйте онлайн!
Образец
Хорошо известно, что текст все еще может быть прочитан, пока ирланды его слов были seraclbmd, до тех пор, пока их первая и последняя буквы плюс их oaervll ontliues rmeain conntsat. Учитывая текст, пожертвуйте каждый ответ на этот вопрос:
Scamrlbing должен быть (puesdo) rnadom.
Слово является преемником латинских chraectars, A thuorgh Z.
Только iaitinl lettres будет когда-либо наверху.
Первый и последний письма остаются без ответа.
Когда srancblimg, только письма с одним из следующих guorps могут включать в себя:
amsuvrcnoxewz
bhfkdl
gpqy
it
j
(остается на месте)источник
\pL
вместо[A-Za-z]
?\pL
?\w
будет достаточно?JavaScript 176 байт
Метод:
RegExp выполняет итерацию по центру каждого слова (
/\B(\w+)\B/g
) с помощью 1-й замены fn.Первая замена fn повторяет массив RegExp для каждой буквы-группы (
/[bdfkhl/g, /[gqpy]/g, etc..
).Каждая итерация создает временный массив символов центра слов, появляющихся в текущей группе букв.
Затем каждая итерация использует RegExp текущей группы букв для итерации по всему центру слов, используя 2-ю замену fn.
Вторая замена fn случайным образом соединяет временный массив, удаляя случайный символ и возвращая его.
Демо-версия:
Запустите его в JSFiddle: https://jsfiddle.net/CookieJon/bnpznb7r/
источник
\pL(\pL+)\pL
а не\B(\w+)\B
исключать цифры и подчеркивание.b=>[...].map(...)&&b
сохраняет еще один байт. Также я не уверен, что тыi
нужен.t.replace(/[A-Za-z]([a-z]+)(?=[a-z])/g,(w,b)=>...w[0]+b...)
или что-то подобное.С,
453, 356,369 байт.разворачивать с комментариями
источник
Python 3.6,
349340 байтОтступ с вкладками. Функция названа
A
. Он не использует грубую силу, время выполнения детерминировано, как спросил OP.источник
Mathematica 232 байта
Основная идея состоит в том, чтобы переставить подмножества, соответствующие 4 различным группам символов. Вероятно, есть место для улучшения.
источник
C
306282 байтаПопробуйте онлайн
Ungolfed:
источник
JavaScript (ES6),
380327311294 байта(
298282265 байт без правил)Спасибо @Shaggy за полезные советы!
Функция f принимает строку любого вида (одно слово, несколько слов, несколько слов со знаками в ней - которые она интерпретирует как разбивающие слова) и
массивстрок «правил» любой длины, разделенных запятыми.Этот набор правил, в случае вашего вопроса, будет
["aneusvrowxmcz", "bhkfdl", "gqpy", "it"]
"aneusvrowxmcz,bhkfdl,gqpy,it"
Некоторые буквы не смешиваются, даже если бы они могли, поскольку вы указали в своем вопросе, что буквы «могут поменяться местами». Если я неверно истолковал это, я могу изменить код, чтобы всегда перемешивать буквы, которые соответствуют правилам.
Я знаю, что это огромное количество байтов, и оно не сможет конкурировать с языками игры в гольф, но я все равно хотел попробовать, надеюсь, вам понравится :)
Читаемый человеком неуглифицированный код:
источник
var
Slet
с. 02) Если это не рекурсивная функция, нет необходимости включать объявление переменной (f=
) в ваш счетчик байтов. 03) Используйте каррирование, когда функция имеет 2 параметра (b=>d=>
вместо(b,d)=>
) и вызывайте вашу функцию с помощьюf(b)(d)
. 04) У вас естьi
флаг, поэтому нет необходимости включать егоA-Z
в регулярное выражение. 05) Вы можете использоватьindexOf
илиsearch
строку, не разбивая ее на массив.Clojure,
326322324 байтаОбновление 1: заменено
(map(fn[[k v]]...)...)
на(for[[k v]...]...)
Обновление 2: исправлено регулярное выражение,
\pL
вместо использования\w
и т. Д.Я с нетерпением жду, чтобы увидеть что-то короче. Более ранняя версия с несколькими примерами запускается:
источник
\pL+
и\PL+
вместо того ,\w+
и\W+
исключить цифры и подчеркивания.Perl 6 ,
241195 байтВключает +1 байт для
-p
переключателя командной строки.Ungolfed:
источник
(\pL)(\pL+)(\pL)
а не(\w)(\w+)(\w)
исключать цифры и подчеркивание.\pL
включает в себя много символов за пределами допустимого диапазона латинских букв AZ. Я обновил свой код для более точного отражения требований.\pL
записано<:L>
в Perl 6, хотяC #,
438394380374 байтаСохраните 10 байтов благодаря @ MartinEnder ♦.
Досадно,
CaptureCollection
не реализуется,IEnumerable<T>
и поэтому.Cast<Capture>()
это необходимо. Надеюсь, я могу объединить запрос Linq иforeach
цикл, хотя.Я уверен, что есть много чего можно сыграть в гольф, но мне потребовалось достаточно много времени, чтобы заставить его работать ...
Попробуйте онлайн!
Отформатированная / Полная версия:
источник