Руководящие указания
сценарий
У Джона есть важный номер, и он не хочет, чтобы другие видели это.
Он решил зашифровать номер, используя следующие шаги:
Его число всегда является неубывающей последовательностью (т. Е. "1123"
)
Он перевел каждую цифру в английские слова. (т.е. "123" -> "ONETWOTHREE"
)
А затем переставить буквы случайным образом. (т.е. "ONETWOTHREE" -> "ENOWTOHEETR"
)
Джон чувствовал, что его номер был в безопасности при этом. На самом деле, такое шифрование может быть легко расшифровано :(
задача
Учитывая зашифрованную строку 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
"ENOWOT" -> 12
"EONOTWHTERE" -> 123
"SNVEEGHEITNEIN" -> 789
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN" -> 123456789
"NOEWOTTOWHEERT" -> 1223
источник
Ответы:
Желе ,
3837 байтМонадическая ссылка, содержащая список символов (строку) и возвращающая целое число.
Попробуйте онлайн!
Использует очень отличается метод в желе ответ Pietu1998 в ,
но имеет тот же счетчик байтов(я действительно думал , что это , возможно ,она в конечном итоге , как меньше)!Не полагается на монотонность исходного числа (таким образом, ввод
HTREEWTONOE
будет работать, например).Как?
Во-первых, обратите внимание, что все слова (и, следовательно, любые их анаграммы) можно изменить на слова длиной 4, удалив любые буквы R, G и S и заменив любые буквы Os двумя символами (скажем, «12»), а любые буквы X - тремя символами ( скажем "345").
Затем мы можем отобразить произведение порядковых чисел этих символов на числа от 1 до 9, используя арифметику по модулю, в зависимости от нашего выбора («12345»), а затем посмотреть их в переупорядоченном списке цифр. Код на самом деле сначала преобразуется в символы, а затем заменяет порядковые номера, но это также возможно в 37 байтах с символами, например, «DIAAE» ( попробуйте ).
источник
NINEONENIENOENNNIENOENNEINEONEINEONNENIENOINNEINENINNEINENIENNIENNNNIENNEININENIENNENINEINENINENNIEINNEINNENNIENIN
.Python 2,
121117115 байт-4 байта: после всего этого игры в гольф я забыл встроить переменную одноразового использования. Мозг пердеть.
-2 байта: отступ с двойным интервалом → отступ с одной вкладкой (спасибо Coty Johnathan Saxman); обратите внимание, что это не отображается правильно в ответе.
Ungolfed (совместимо с python 3):
Поиск магического числа:
Объяснение:
У меня было чувство, что я могу разбить биты ASCII вместе и как-то суммировать, чтобы определить, когда у меня было полное слово. Первоначально я пытался возиться
3**ord(letter)
и сравнивать с ожидаемыми результатами, но это привело к очень большим числам. Хотя было бы уместно немного перебрать некоторые параметры, а именно модуль (чтобы гарантировать, что числа малы) и множитель, чтобы по-разному распределить числа по диапазону модуля.Я закончил тем, что изменил множитель переменной на переменную, влияющую на саму мощность, потому что (методом проб и ошибок), которая каким-то образом смогла дать мне немного более короткий ответ в гольфе.
И выше вы видите результаты этого грубого и небольшого ручного игры в гольф.
Причина выбора
3**x
изначально в том, что я знал, что вы можете представить каждое число там. Самые повторяющиеся цифры, которые были у любого числа, равны двум (thrEE, sEvEn, NiNe и т. Д.), Поэтому я решил рассматривать каждый вход как число с номером 3. Таким образом, я мог (мысленно) представить их как что-то вроде10100000000010020000
(три; 1 вt
слоте, 1 вr
слоте, 1 вh
слоте и 2 вe
слоте). Таким образом, каждое число получает уникальное представление, которое может быть легко объединено путем итерации строки и суммирования некоторых чисел, и оно заканчивается независимо от фактического порядка букв. Конечно, это не оказалось идеальным решением, но текущее решение все еще написано с учетом этой идеи.источник
\x83
,\x8e
и\x92
в строке.SyntaxError: Non-ASCII character '\xc2' in file <stdin> on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
. Это работает, если я помещуcoding
комментарий там, но это получает 15 дополнительных байтов.Python 2 ,
131127 байтПопробуйте онлайн!
На основе исправленной версии решения JavaScript Draco18s .
источник
vars
!PHP , 164 байта
Попробуйте онлайн!
PHP , 179 байт
на основе предыдущего подхода сначала проверьте четные числа, а затем нечетные числа в порядке возрастания
Попробуйте онлайн!
PHP , 201 байт
Попробуйте онлайн!
источник
ENOOWTWTOWOT
$i++<9
и$i
вместо$i<10
и++$i
(-1 байт);_405162738[$i]
вместо$i%2?$i/2+4:$i/2-1
(-4 байта) ($i/2+~($i%2*-5)
тоже будет работать, но это на один байт длиннее.)Javascript (ES6),
288150144 байтаДольше, чем
дведругие записи из JS, но я подумал, что я бы отказался от интересного подхода, который мог бы работать для кого-то на другом языке.По сути, мы можем определить следующее:
Любое вхождение этих букв подразумевает, что эта цифра существует в исходном номере. Отсюда мы можем вывести остальные цифры:
Включая два сложных случая:
Как
1
и9
область Хард сравнительно. Для ОДНОГО,E
появляется несколько раз в некоторых словах (SEVEN
имеет два), как делаетN
(NINE
), поэтому мы застряли с проверкой,O
которая происходит в двух других местах, к счастью, оба просты.Для NINE девять сложно, независимо от того, как вы нарезаете.
Таким образом, мы получаем эту карту:
9 может ссылаться на siX, eiGht и Five (с 5 обратными ссылками) с присвоением переменных, сохраняя байты. Спасибо Нилу за это, он использует несколько функций JS, с которыми я очень незнаком (
('
например, отметки для раздевания пополам) и на самом деле гораздо ближе к идее, которую я набросал на бумаге, прежде чем пытаться ее кодировать. (Я оставил 9 как «то, что осталось», думая об этом как «если я увижу,X
я могу удалить его, а такжеS
иI
из строки, то ...», так что после четырех простых случаев следующие 3 станут просто).Причина, по которой эта запись интересна, заключается в том, что она может обрабатывать любую перетасованную строку как ввод. т. е. вместо того, чтобы перетасовывать отдельные слова, мы можем перетасовать всю строку, что, как я думал, первоначально делал Джон:
источник
s.split(t).length-1
2 байтаs.repeat(n>0&&n)
(почему в любом случае n меньше нуля? Экономит 7 байтов). Сохраните кучу байтов, объявив ихg
в области видимости,s
чтобы вам не приходилось постоянно передавать его, и, что еще лучше, вы можете сделать его теговым шаблоном, который в целом экономит 55 байтов (до 9 исправлений). Сохранить более байт, сохраняя повторяющиеся значения в временных, и я брился несколько больше от использованияmap
:s=>[,(l=t=>s.split(t).length-1)`O`-l`W`-l`U`,w=l`W`,l`R`-w,u=l`U`,l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g].map((n,i)=>`${i}`.repeat(n)).join``
.Mathematica, 133 байта
вход
выход
источник
c@#[[i]]
вместоc[#[[i]]]
? Вы можете сохранить другой байт, используя синтаксис инфикса~
вTable
.C #, 218 байт
Укороченная версия:
Расширенная версия:
Попробуйте онлайн!
Будучи моей первой записью, я не уверен в правилах ... Я рассчитываю только размер класса, используемого для дешифрования, а не код, который его тестирует, верно?
редактировать
И для забавы - вот что я начал делать, не читая полных правил: S - Посмотрите это на IdeOne . Он дешифрует, даже когда символы из одной цифры могут быть скремблированы в любом месте строки.
Редактировать 2
Укорочен в соответствии с советами TheLethalCoder. Благодарность!
Редактировать 3
А теперь Тит побрился еще на несколько байтов. Благодарность!
источник
public static
из него. Вы можете преобразовать в анонимный метод, какs=>{<do stuff>return"";}
. Вы можете использоватьvar
несколько раз, объявляя переменные вместе сохраняет байт т.е.int i=1,j;
. Создание массива из строки и расщепления на нем, как правило , короче (хотя я не проверял , в данном случае) , то есть"ONE|TWO".Split('|')
. Вы можете использовать<0
вместо==-1
s=>{var n="ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE".Split('|');for(int i=0,j;++i<= 9;)for(j=0;n[i-1].IndexOf(s[j])<0;){if(++j==n[i-1].Length){var r=i+"";while(j<s.Length){j+=n[i].Length;r+=++i;}return r;}}return "";}
JavaScript (ES6),
142139 байтСохранено 3 байта благодаря Нейлу .
В настоящее время не использует номера всегда расположены в порядке возрастания
источник
"axbxc".split`x`.join``
, Как это называется? Не могу найти что-нибудь на Google.split
иjoin
x=`foo${5+5}bar`
), they're tagged when you call a function using them without parens:foo`foo${5+5}bar`
which is the same asfoo(['foo','bar'], 10)
f(s.slice(y))
is always a string so you don't need the''+
before it.Jelly, 38 bytes
Try it online!
Explanation
источник
"EIGHTNINE"
into it :)3
with2.2
to use a smaller upper bound, which allows you to easily calculate 789 without changing the working principle.2
would be nice, but it would barely fail for certain inputs with lots of sixes.Javascript (ES6), 221 bytes
Example code snippet:
источник
Retina, 160 bytes
Try it online! Loosely based on @TessellatingHeckler's PowerShell answer.
источник
Retina, 88 bytes
Try it online!
Explanation
источник
PowerShell, 182 bytes
Try it online!
Ungolfed but not working code:
e.g.
(?<3>[THRE]{5})
matches the character classTHRE
, so it can match them out of order, and has to match any of these characters five times next to each other, and the capture group is named '3' to map names with numbers.Rudimentary compression by swapping the repeating text
})|(?<
for az
.источник
C++,
296, 288 bytesShort Version:
Full Version:
Try ONLINE!
Edit:
1) 200->296 bytes, for including namespace and definition of N in the count, as suggested by orlp 2) 296->288, for using macro, thanks to Zacharý
источник
N
andusing namespace std;
into your byte count.Q
right after it without any other additions.Ruby,
138114110 bytesByte count includes 1 byte for the
-p
option.What?
This:
is a regex literal which, through string interpolation, evaluates to:
If we assign that to
regex
, the rest of the code is somewhat easy to grasp: Each match in the input is substituted with the number of the capturing group, extracted from the magical variable$~
which contains the current match data:Try it online!
источник
Java 8,
198256 bytes+58 bytes.. due to regex of the previous version not working properly (it was also matching "EEE";"EEN";etc.)
Explanation:
Try it here.
источник
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN"
:([ONE]{3}
is that it also matchesEEN
at the end of that test case with parts of EIGHT and NINE.. And I doubt there is a regex to match all these:ENO|EON|NEO|NOE|OEN|ONE
without also matchingEEE;EEN;EEO;...
for all numbers that is shorter than 40 bytes.. Maybe I can do something usingsubstring
and reverse checking the numbers, but I don't really have the time to figure it out now..Java (OpenJDK 8), 181 bytes
Try it online!
I took the liberty to reuse Kevin Cruyssen's TIO template. Hope you don't mind ;)
источник
s.substring
. The worst part is, is that I am usings.substring
in my current answer, lol.. Ah well, +1 from me. Glad it's almost weekend..05AB1E,
3631 bytesTry it online!
View it ran with debug: TIO With Debug
источник
FURONESEV
returnsFUR1SEV
:(Perl 5, 102 + 1 (-n) = 103 bytes
Try it online!
источник
map{...}
can often be replaced withmap...,
,length
andy///c
are usually interchangeable too (not always smaller when not working on$_
though!), instead of thewhile
,++$,x s/^$i//
is shorter, and if you change-n
to-p
you can append to ` $\ ` instead of callingprint
! Try it online!Python 3,
238236 bytesTry it online!
Brute-force solution, doesn't take advantage non-decreasingness of digits.
Thanks to @Mr. Xcoder for saving 2 bytes!
источник
def f(s):
in your byte count, this is not an anonymouos functionwhile len(s)>0
withwhile len(s)
e
into the function header for -1 byte. Also,exec
and list comprehensions might save bytes on indentation.PHP, 141 bytes
older version, 151 bytes:
loops through the digits from 1 to 9, counting unique characters in the word and subtracting non-unique characters´ counts, printing the digit on the go.
Although it is printing on the go, the digit counts must be stored for the
9
case to work.Run as pipe with
-nR
or try it online.It would save 4 more bytes to store the digit counts in
$a[$i]
instead of$a[$i+48]
and use ASCII1
and7
(in quotes) instead of the digit characters themselves.breakdown
ONE
is not the only word with anO
, so it needs to subtract the counts forW
(only appearing inTWO
) andU
(only appearing inFOUR
) and so on.NINE
is special, because there is no way to just subtract if I used the letters (that would requireI-X-G-F+U
orN-O-S+W+U+X
), so I use the digit counts instead.PHP, 160 bytes
assumes all upper case input; characters may be scrambled all over.
Run as pipe with
-nR
or try it online.explanation
loops through the digit words, counting their unique characters´ occurences in the input and in the process reducing the count of other characters. "Other characters" could mean all other characters in the word; but only considering those that will be needed later saved 19 bytes.
Transforming the
str_repeat
loop to a combined loop saved 5 bytes.And using variable variables for the digit count saved another 8.
breakdown
источник