Эта задача, по сути, идентична этой, только с одним отличием: теперь разрешено перетасовывать буквы в любом месте строки.
сценарий
У Джона есть важный номер, и он не хочет, чтобы другие видели это.
Он решил зашифровать номер, используя следующие шаги:
Его число всегда является неубывающей последовательностью (т. Е. "1123"
)
Он перевел каждую цифру в английские слова. (т.е. "123" -> "ONETWOTHREE"
)
А затем переставить буквы случайным образом. (т.е. "ONETWOTHREE" -> "EEWOOHRNTET"
)
Джон чувствовал, что его номер был в безопасности при этом. На самом деле, такое шифрование может быть легко расшифровано :(
задача
Учитывая зашифрованную строку s, ваша задача расшифровать ее и вернуть исходный номер.
правила
- Это код гольф, поэтому самый короткий ответ в байтах выигрывает
- Вы можете предположить, что входная строка всегда действительна
- Входная строка содержит только заглавные буквы
- Оригинальные номера всегда располагаются в порядке возрастания
- Вы можете вернуть число в строковом или целочисленном формате
Буквы будут перетасовываться только между одним словом, а не между всей строкой.Буквы могут быть перемешаны в любом месте строки.- Числа будут только от 1 до 9 включительно (
ONE
доNINE
)
Возможная расшифрованная строка
Вот список строк сразу после того, как они были преобразованы в строки из чисел:
1 -> ONE
2 -> TWO
3 -> THREE
4 -> FOUR
5 -> FIVE
6 -> SIX
7 -> SEVEN
8 -> EIGHT
9 -> NINE
Примеры
"NEO" -> 1
"NWEOOT" -> 12
"TOEERWNEHOT" -> 123
"IHNEVGENNEISTE" -> 789
"WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" -> 123456789
"EWHEWROETOTTON" -> 1223
"ONEWESTV" -> 27
(спасибо, ETHпродукция!)
источник
"ONEWESTV" -> 27
(включает число, которое на самом деле не появляется)Ответы:
Python 2 , 123 байта
Полная программа, принимающая введенные данные и печатающая номер Джона.
Попробуйте онлайн! или увидеть тестовый набор
Как?
Давайте работать с примером "NEONSEXTOWNII" (чтобы получить 1269, и быть несколько Leisure Suite Larry -esque!)
Сначала
c=map(input().count,"OWHUFXSGIQ")
берется ввод и подсчитывается число каждого из нихOWHUFXSGIQ
- это буквы, которые появляются в каждом номере в порядке возрастания, где 2,4,6 и 8 имеют свои «собственные» буквы (WUXG
) плюс лишняя буква,Q
чтобы добавить ноль до конца и выровняйте длину полученного списка. Для примера:Записи для 1, 3, 5, 7 и 9 нуждаются в корректировке, чтобы исправить количество других букв. Это выполняется следующим циклом:
Обратите внимание, что записи для корректировки являются альтернативными (1,3,5,7,9,1,3,5, ...), поэтому мы можем добавить два к индексной переменной на каждом шаге и по модулю на 10, чтобы остаться в диапазон, если нам нужно пройти более одного раза (что мы делаем). Чтобы сэкономить несколько байтов, мы можем увеличить на единицу и по модулю на 5 и использовать двойной индекс.
Поскольку корректировки для 9 требуют большей работы, которую мы начинаем там - она находится в индексе 8, поэтому мы начинаем с
i=4
. Затем строка"71735539994"
дает индексыj
значений, которые нужно удалить на каждом этапе (где мы убедились, что девятый индекс будет содержать ноль при использовании"Q"
при созданииc
);c[i*2]-=c[int(j)]
выполняет каждую отдельную корректировку иi=-~i%5
переходитi
к следующему индексу (где-~i
есть-(-1-i)
илиi+1
сохранение скобок(i+1)%5
), сохраняяi*2
в пределахc
.Таким образом, мы сначала вычитаем число в индексе
j=7
из числа в индексеi*2=8
, вычитая количество «G», подсчитанное из числа «I», корректируя счет «NINE» вниз на (правильное) число «EIGHT» s ( который также имеет "я"). Затем мы переходим наi=0
(-~4%5 = (4+1)%5 = 0
), ссылаясь на индекс,i*2 = 0
который предназначен для «ОДИН», и вычитаем значение, найденное в индексеj=1
записи, считая «W» и, следовательно, «ДВА», корректируя счет «О» вниз. К концу цикла у нас есть исправленные значения:так что все, что осталось, это распечатать то, что
c
сейчас представляет (1269
).i
теперь вернулся в0
, поэтому мы увеличиваем его в начале цикла и используем в качестве нашей цифры:Задние тиков,
`i`
являются python2 стенография дляrepr(i)
которых получает строковое представление объекта (цифра символа в вопросе в виде строки) и умножения строки на целый ряд Creats новую строку , что многие повторы (здесь мы показываем толькоn=0
поворот`i`
от Say"5"
к""
иn=1
превращение, скажем,"6"
как"6"
, но это также работает для больших положительных целых чисел, так"3"*4
становится,"3333"
например.)источник
05AB1E , 31 байт
Попробуйте онлайн!
объяснение
Очень неэффективно для большого ввода.
источник
‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']
Можете ли вы объяснить немного, я изо всех сил пытаюсь понять, как можно генерировать любую строку.‘
ограничивает сжатую в верхнем регистре строку слов, разделенных пробелом.Z
значитZ
. Все остальные пары из двух символов обозначают сжатое слово из словаря 05AB1E . Так например€µ
переводится какONE
.2419
. Символы, которые нам нужны, это символы, за которыми следуют24
и19
в документах . В нашем случае это24=Ÿ
и19=™
такHELLO
будет‘Ÿ™‘
Сетчатка ,
11297 байтПопробуйте онлайн!
-12 байт благодаря @Neil
-3 байта за счет использования L символьных классов в транспозиции
Как это устроено
По сути, это зависит от того факта, что буквы используются только в определенных числовых именах. Например,
SIX
это единственное имя, которое содержитX
. Это становится сложнее с тем фактом, что некоторые слова накладываются друг на друга, например, обаFIVE
иSEVEN
использованиеV
. Это можно исправить путем идентификацииFIVE
сF(.*)V
.источник
GH
иNO
было бы рядом, за исключением любой предыдущей8
или1
от предыдущей замены ...}`GH
8
будет работать8
-}
бы вызвать символы , которые будут отсортированы снова, таким образом , размещая все оставшиесяG
иH
вместе.NO -> 1
, что было удобно.Котлин 1,1 ,
359352331327325 байтпредставление
Не работает на TryItOnline из-за того, что Kotlin 1.1 не поддерживается
Тестовое задание
логика
Я использовал лист выше, чтобы выработать самый простой способ решить каждую букву
Правки
источник
var s=""
иreturn s
кr=""
иreturn r
путем повторного ввода-String, вам больше не нужно , которые в этот момент? Я никогда раньше не программировал в Котлине, так что, может быть, я здесь чушь несуразная. ; pfinal
по умолчанию. Хм, еще одна вещь, которую вы могли бы сыграть в гольф: поместите вvar s=""
качестве первой вещи в методе и заменитеval f=r.split("").
наval f=r.split(s).
. Опять же, не знаю, работает ли это. Жаль, что TIO еще не поддерживает v1.1, иначе я бы сам попробовал эти предложения, прежде чем казаться глупым ..Желе , 37 байт
Попробуйте онлайн!
-1 спасибо Джонатану Аллану .
источник
NINEFIVE
,THREEFIVE
). Это ошибка или код просто неэффективен?Œ!
означает «перестановки»)...“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»...
Java 8,
248234 байтаОбъяснение кода:
-14 Благодаря Оливье Грегуару
источник
Java 8,
346345344336327 байтПопробуй это здесь.
Общее объяснение:
Я посмотрел на вхождения каждого символа в алфавите:
G=8; U=4; W=2; X=6
.F=5; H=3
.V=7
(вычитаяF=5
).O=1; N=9
.N
есть два вхожденияNINE
, мне приходилось делать дополнительные-1
для каждого вхожденияN
, поэтому я использовалI=9
вместо этого (вычитая три предыдущих совпадения вместо двух).Объяснение кода:
источник
Perl 5 , 100 байт
99-байтовый код + 1 байт для
-n
переключения.Попробуйте онлайн!
источник
Python 3 , 225 байт
Попробуйте онлайн!
Просто: сначала удалите цифры, которые обозначены конкретной буквой.
источник
Python 3 , 125 байт
Попробуйте онлайн!
Прочитав связанный вопрос, я понял, что это вариант решения Python от mdahmoune , которое само основано на решении ES6 Draco18s , но, по крайней мере, мы проиграли два байта.
Подобно этому решению, мы вычисляем ответ через линейную комбинацию количества вхождений определенных букв. Мы кратко кодируем линейные комбинации, записывая их в виде слов, в которые должны быть добавлены первые две буквы, а затем все вычтено. Иногда требуется символ для дополнения первых двух символов; мы используем это, чтобы скрыть цифру, которую мы хотим вывести (которая никогда не появится на входе, поэтому не повлияет на наш алгоритм), которую мы извлекаем
min
.источник
R 154
Попробуйте онлайн!
источник
Аксиома, 351 байт
ungolfed прокомментировал результаты
источник