Если вы сортируете строку, вы обычно получаете что-то вроде:
':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy
Да, это было первое отсортированное предложение.
Как вы можете видеть, есть много повторяющихся символов, aa
, eee
, ttttt
, 9 пространства и так далее.
Если мы добавим 128
ASCII-значение первого дубликата, 256
ко второму, 384
третьему и т. Д., Снова отсортируем его и выведем новую строку (модуль 128 для возврата тех же символов), мы получим строку:
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
(Обратите внимание на один пробел и 4 пробела).
Строка "последовательно сортируются" <space>':I....uy
, <space>aeg....uy
, <space>egi....ty
, <space>iloty
, <space>lt
, <space>
, <space>
, <space>
, <space>
.
Это может быть проще визуализировать, если мы используем строку с цифрами в ней. Строка 111222334
будет , когда «отсортированный» быть: 123412312
.
Вызов:
Неудивительно, что задача состоит в том, чтобы написать код, который сортирует строку в соответствии с описанием выше.
Можно предположить, что входная строка будет содержать только печатаемые символы ASCII в диапазоне 32-126 (от пробела до тильды).
Тестовые случаи:
**Test cases:**
*:Tacest*es*s*
If you sort a string you'll typically get something like:
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
Hello, World!
!,HWdelorlol
#MATLAB, 114 bytes
#,14ABLMTbesty 1A
f=@(s)[mod(sort(cell2mat(cellfun(@(c)c+128*(0:nnz(c)-1),mat2cell(sort(s),1,histc(s,unique(s))),'un',0))),128),''];
'()*+,-0128:;=@[]acdefhilmnoqrstuz'(),0128@acefilmnorstu'(),12celmnostu'(),12celnstu(),clnst(),cls(),cs(),()()()()
Это код-гольф , поэтому самый короткий код на каждом языке, подсчитанный в байтах, выиграет реф .
{'S', 'g', 'i', 'n', 'r', 't'}
в Python, так как «нормальный» способ сделать это"String"
.{'a','b'}
не принимается в Matlab , так как вы можете добавить символ к каждому из персонажей , как это:{'aa','b'}
. Ваш ввод и вывод должны быть в одном формате.Ответы:
Pyth, 5 байт
Тестирование
Очень просто: группировать и сортировать, транспонировать, объединять.
источник
Желе , 3 байта
Попробуйте онлайн!
Как это работает
О, мальчик, этот вызов был почти готов для Желе.
Группа атом (
Ġ
) принимает массив 1 в качестве входных и групп индексов , которые соответствуют идентичным элементам массива. Массив групп индексов сортируется с соответствующими элементами в качестве ключей, что является именно тем порядком, который нам необходим для этой задачи.Далее атом молнии (
Z
) транспонирует строки и столбцы сгенерированной (рваной) матрицы индексов. Это просто состоит из чтения столбцов матрицы, пропуская элементы, которых нет в этом столбце. В результате мы получаем первый индекс символа с наименьшей кодовой точкой, за которым следует первый индекс символа с второй наименьшей кодовой точкой,… за которым следует второй индекс символа с наименьшей кодовой точкой и т. Д.Наконец, unindex atom (
ị
) извлекает элементы входного массива по всем его индексам в сгенерированном порядке. В результате получается двумерный массив символов, который Jelly выравнивает перед печатью.1 Желе не имеет строкового типа, только массивы символов.
источник
Python 3,
10910510410399939088817969 байт2 байта сохранены благодаря FlipTack
7 байтов сохранено, потому что flornquake поймал мою глупую ошибку
2 байта сохранены благодаря xnor
10 байтов сохранено благодаря Денису
объяснение
Мы начнем с преобразования нашей строки в список с использованием знака сплат и сохранения этого списка в переменной
a
. Затем, пока нашa
список не является пустым, мы просматриваем каждый уникальный элементa
в отсортированном порядке, распечатываем его и удаляем копию этого символа из списка.Таким образом, каждая итерация печатает одну копию каждого символа, присутствующего в
a
.источник
set
- несортированный набор.f
строку вместо списка, чтобы сохранить несколько байтов.a=list(input())
, вы можете сделатьa.remove(c)
, что является чистой экономией.Haskell, 44 байта
Пример использования:
Сортируйте, группируйте одинаковые символы в список строк (например,
"aabbc"
->["aa","bb","c"]
), транспонируйте и снова объединяйте в одну строку.источник
Python 2 , 75 байт
Попробуйте онлайн!
источник
lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]
работает для строк с максимальной длиной9e9
.[]
и изменить18
к ,17
чтобы сохранить два байта.lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
zip
, но я не думаю, что добавление1e9
когда-либо происходило бы со мной ... Спасибо!Dyalog APL , 21 символ = 39 байт
t[
...]
индекс t (будет определен в ближайшее время) с ...0~⍨
нули удалены из∊
зачисленный (уплощенный)⍉
транспонировать(⊢⌸t)[
... с;]
ключом * t , индексированный по строке ...⍋
индексы, которые будут сортировать∪
уникальные буквыt←
т , который имеет значение⍞
подсказка ввода текстаПопробуй APL онлайн!
*
⊢⌸t
создает таблицу, в которой строки (дополненные нулями для прямоугольной таблицы) перечисляют уникальные индексы каждой буквы в т .источник
⌸
заставляет все это быть UTF-8 вместо одного байта на символ.С,
10910610510410210097989691 байтРезервное копирование до 98 байт, необходимых для инициализации j, чтобы сделать f (n) повторно используемымДо 96 байт, используя вместо strlen B-)Странно, что мне пришлось вернуться к strlen, но я избавился от цикла for (; i ++;), так что теперь он сократился до 91 байта. По-видимому, справочная страница по путам читает;
... мне повезло, это работало в первую очередь
тестовый код ...
Вот несколько тестовых случаев, теперь пришло время сыграть в гольф
источник
Mathematica,
686059 байтПринимает строку. Выводит строку.
Если список символов был разрешен (46 байт):
Использование версии
Sort
(40 байт):Эта версия не может быть моим ответом, потому что
Sort
не может быть использована здесь;Sort
сортирует по каноническому порядку, а не по коду символа.источник
Characters
команда технически выводит список строк длины 1.Python 2,
7776 байтПринимает строку в кавычках в качестве ввода от стандартного ввода.
Попробуйте онлайн!
источник
JavaScript (ES6), 79 байт
Работает, извлекая набор уникальных символов, сортируя его, удаляя их из исходной строки и рекурсивно вычисляя вид остальной части строки. 81-байтовое решение, которое мне показалось интересным:
источник
J ,
1615 байтЭто глагол, который принимает и возвращает одну строку. Попробуйте онлайн!
Майлз сохранил байт, спасибо!
объяснение
Ничего особенного: сортируйте в основном по порядку появления, а затем по значению символа.
источник
Mathematica, 55 байтов, неконкурентный
Edit: К сожалению, системы Mathematica
sort
является не кодами символов, а в алфавитном порядке, в котором верхний регистр следует немедленно строчными буквами (например ,Hi There
сортируется в{ , e, e, h, H, i, r, T}
).Это работает с использованием шаблонов:
источник
Rule (->)
должно бытьRuleDelayed (:>)
(без изменений в количестве байтов), потому что обе стороныRule
имеют переменные.Rule
может вызвать конфликты с ранее существовавшими определениями. Например:a=3;5/.{a_->a}
возвращает3
, а не5
. (a_->a
оцениваетa_->3
- если вы используетеa_:>a
, он остается таким же иa=3;5/.{a_:>a}
возвращается5
).Brainf * ck ,
458226 байтПопробуйте онлайн! - BF
Numberwang ,
262226 байтПопробуйте онлайн! - СЗ
Я поместил оба из них здесь, потому что они идентичны код.
источник
PHP, 83 байта
К сожалению, вы не можете иметь
unset
в троице, поэтому мне нужно использовать раздражающе долгоarray_filter
.Используйте как:
источник
Python 2, 70 байт
Попробуйте онлайн
Это очень неэффективно. Ссылка теста изменяет
i>>7
кi>>5
и устанавливает предел рекурсии 10000. Предполагает входы имеет значение только ASCII до 126.Использует трюк div-mod для итерации двух циклов: минимальное число
i/128
во внешнем цикле и значения ASCIIi%128
во внутреннем цикле. Включает символc
с заданным значением ASCII, если число раз, которое он появляется в строке, по крайней мере, его минимальное число.Код использует трюк для имитации назначения,
c=chr(i%128)
чтобы на него можно было ссылаться в выражении(s.count(c)>i>>7)*c
. Pythonlambda
не позволяет присваивать, потому что они принимают только выражения. Преобразование вdef
или полную программу все еще является чистым убытком.Вместо этого функция передает значение
chr(i%128)
для следующего рекурсивного вызова в качестве необязательного ввода. Это отключено на единицу, потомуi
что было увеличено, но это не имеет значения, пока строка не содержит специального символа'\x7f'
(мы также можем увеличить 128 до 256). Начальнаяc=''
безвредна.источник
V ,
3736 байтСпасибо @DJMcMayhem за байт!
Попробуйте онлайн!
Не уверен, что мне нравится регулярное выражение в конце, но мне нужно было сделать
ò
перерыв.объяснять
источник
Íî
(или:%s/\n//g
) корочеVGgJ
Perl 6 , 68 байт
Я был немного удивлен, обнаружив, что нет встроенного способа группировки похожих элементов в списке. Вот что делает бит сквош-карты.
источник
a
в@a
(+2 байта). Такжеgrep *eq$_,
может быть записаноgrep $_,
(-3 байта), поскольку строка является допустимым интеллектуальным сопоставителем.{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}
- Эта вариация составляет всего 54 байта.classify
решение на основе в качестве отдельного ответа сейчас.JavaScript (ES6),
7775 байтСтабильная сортировка лексикографически отсортированной строки по n- му случаю
источник
1+~~
так же, как-~
.Perl 6 , 54 байта
Объяснение:
{ }
: Лямбда, которая принимает один аргумент - например,21211
..comb
: Разделить входной аргумент на список символов - например,(2,1,2,1,1)
..classify(~*)
: Группировать символы, используя сравнение строк в качестве условия группировки, возвращая неупорядоченный хэш - например,{ 2=>[2,2], 1=>[1,1,1] }
.{*}
: Возвращает список всех значений хеша - например,[2,2], [1,1,1]
..sort
Сортировать - например[1,1,1], [2,2]
.»[*]
: Удалите контейнеры с элементами, в которые были упакованы массивы из-за того, что они находятся в хэше, чтобы они не рассматривались как один элемент на следующем шаге - например,(1,1,1), (2,2)
.roundrobin |
: Заархивируйте подсписки, пока все не будут исчерпаны - например,(1,2), (1,2), (1)
.flat
: Сгладить результат - например1, 2, 1, 2, 1
.[~]
: Объединить его, чтобы получить строку снова - например,12121
.(Кредит за
roundrobin
подход идет к ответу Шона .)источник
05AB1E , 15 байтов
Попробуйте онлайн! или как тестовый набор
объяснение
10 из 15 байтов предназначены для того, чтобы обойти метод 05AB1E обработки цепочек с разной длиной.
источник
FSharp,
194190170140133 байтаИспользование Seq вместо Array экономит пару байтов
Определение более короткого имени и использование других карт, чтобы избежать
(fun ->)
блокаОказывается, F # может сопоставить символ с входом, поэтому удаление сокращенного имени System.Text.Encoding.ASCII и добавление в другую карту экономит мне 20 байтов!
Возвращая массив символов вместо строки, я экономлю 30 байтов!
Мне больше не нужно, чтобы убедиться, что это строка, спасает меня 7 байтов
источник
JavaScript (ES6), 114 байт
Для ясности отделен символом новой строки, а не частью количества байтов:
демонстрация
источник
Clojure, 79 байт
Анонимная функция, возвращает последовательность символов. Поддерживает до 10 ^ 9 повторений любых символов, которых должно быть много.
источник
Сетчатка , 24 байта
Попробуйте онлайн!
источник
Рубин, 59 + 1 = 60 байт
Добавляет один байт для
-n
флага. Порт словарного решения @PatrickRoberts.источник