Когда дело доходит до еды конфет, я придерживаюсь более высоких стандартов, чем типичный непрофессионал. Существует тонкий баланс между «смешиванием» и «сохранением лучшего для последнего».
В этом задании вам дадут ряд символов, в которых каждый персонаж представляет собой конфету. Различные символы (с учетом регистра) представляют разные типы конфет. Ваша программа должна затем определить правильный порядок потребления конфет, основываясь на приведенной ниже процедуре. Вы можете написать либо полную программу (STDIN / STDOUT), либо именованную функцию для выполнения этой задачи.
Допустим, моя конфетка есть oroybgrbbyrorypoprr
. Во-первых, я сортирую конфету на кучи того же типа, с большим количеством сверху, используя более низкие значения символов ASCII в качестве прерывателя связей.
rrrrrr
oooo
bbb
yyy
pp
g
Затем я беру каждый ряд конфет и равномерно распределяю их вдоль интервала. Например, если есть 3 конфеты, одна помещается на 1/3 пути, на 2/3 пути и в конце.
.r.r.r.r.r.r
..o..o..o..o
...b...b...b
...y...y...y
.....p.....p
...........g
Затем я спускаюсь по каждому столбцу, чтобы создать мой окончательный заказ на конфеты rorbyroprbyorrobypg
.
вход
Строка, которая содержит конфетный тайник. Входные данные для приведенного выше примера могли бы быть:
oroybgrbbyrorypoprr
Выход
Строка с конфетой реорганизована в правильном порядке потребления.
rorbyroprbyorrobypg
счет
Это код гольф. Самый короткий ответ в байтах побеждает. Применяются стандартные правила игры в гольф.
Ответы:
CJam,
78 68 61 45 42 39 3130 байтПринимает входную строку через STDIN
Вдохновленный подходом рекурсива, но немного другой. Нет необходимости транспонировать или прямоугольник на всех!
Как это работает:
(Печально, что CJam больше не может дополнять Pyth из-за необходимости раздувать как синтаксис)
Попробуй здесь
источник
{_@_@{_@\%}h;/*}
на:
.Пиф , 25
Использует совершенно новый алгоритм, вдохновленный этим ответом .
Шаг за шагом:
Сначала мы отсортировали персонажей по их общности, связи разорваны по алфавиту. Это
o_/zZSz
.o
то же самое, что и Pythonsorted(<stuff>,key=<stuff>)
, с лямбда-выражением для ключа, за исключением того, что оно хранится в виде строки.Затем мы генерируем список префиксов этой строки, от длины
len(z)
до длины 1.>
Это эквивалентно Python<stuff>[<int>:]
.Затем мы упорядочиваем этот список строк префикса по дробному расположению, 0 - левый край, а 1 - правый, первого символа префикса в прямоугольной раскладке, видимой в вопросе.
/NhN
подсчитывает, сколько раз первый символ в префиксе встречается в префиксе, а/zhN
количество вхождений первого символа в префиксе в строке в виде дыры. Это присваивает каждому префиксу, возглавляемому каждым символом в группе, разные доли от1/k
наиболее правого вхождения этого символа доk/k
самого левого. Изменение порядка номеров префиксов по этому номеру дает соответствующую позицию в макете. Связи разрываются с использованием предыдущего порядка, который сначала был по счету, а затем по алфавиту, по желанию.Наконец, нам нужно извлечь первый символ из каждой строки префикса, объединить их в одну строку и распечатать. Извлечение первых символов есть
hC
.C
выполняет транспонирование матрицы в списке, фактическиzip(*x)
в Python 3.h
извлекает первую строку результирующей матрицы. На самом деле это единственная строка, потому что наличие префикса из 1 символа предотвращает формирование любых других полных строк.s
суммирует символы в этом кортеже в одну строку. Печать неявная.Тест:
Инкрементные программы
oroybgrbbyrorypoprr
:Старый ответ:
Пиф , 34
Эта программа работает, вычисляя, сколько раз реплицировать определенный подсписок. Подсписок выглядит так
['', '', '', '', ... , 'r']
. Общая длина этого подсписка является произведением количества вхождений всех других конфет, которое естьu*G/zHS{-zd1
. Полный подсписок создается путем]k
многократного воспроизведения списка пустой строки, затем удаления,t
добавления элемента и добавления имени конфеты в конце+d
.Затем этот подсписок реплицируется столько раз, сколько конфет находится во входных данных
/zd
, обеспечивая одинаковую длину списка каждой конфетки.Теперь, когда эта функция сопоставлена со всеми уникальными конфетами в правильном отсортированном порядке (
o_/zNS{z
), у нас есть прямоугольник, похожий на прямоугольник в вопросе, но с пустыми строками вместо точек. Выполнение матрицы transpose (C
) с последующими двумя суммами (ss
) дает окончательную строку.Проверка:
источник
Perl 5 - 62
61 код + 1 флаг.
Сначала разделите ввод на массив символов -
/./g
.Добавить индекс вхождения к каждой букве, оставляя счетчики в переменных
$a
..$z
сmap++$$_.$_
. Теперь массив:Затем преобразуйте его в конкатенацию ключей сортировки: коэффициент
$_/$$1
, счетчик связей~$_
и счетчик значений ASCII$_
. Это приведет к (здесь с добавленными пробелами для ясности).Это можно отсортировать в лексикографическом (по умолчанию) порядке. В конце извлеките последний символ и напечатайте:
print map/(.$)/
источник
Python 3.x - 124 байта
источник
Mathematica,
123119118 байтОпределяет именованную функцию
f
. Ungolfed:Использование встроенных рациональных типов казалось хорошей идеей для этого. Конечно, это далеко не CJam. По сути, я представляю сетку, показанную в конкурсе, в виде списка пар. Первым в паре является код символа, а во-вторых, его позиция в виде дроби, меньшей или равной 1 (последний столбец равен 1). Убедившись, что отдельные символы уже находятся в правильном порядке, мне просто нужно отсортировать их по дробной части, чтобы получить желаемый результат.
источник
Pyth 45
47 48 51Это также может быть почти наверняка дальше в гольф;)
Работает путем построения списка списков, где каждый внутренний список представляет собой ряд пустых строк и название конфеты. Этот список транспонируется, а затем соединяются внутренние списки, за которыми следуют эти списки.
Спасибо @isaacg за напоминание о сумме!
источник
s
в списке строк работает какj""
.APL: 38
Объяснение:
Может быть проверено на tryapl.org
источник
R - 166 символов
негольфированная версия
Объяснение:
order
стабильна при сортировке, поэтому будет поддерживать наиболее частый / лексический порядок именования, когда в индексе есть связь, особенно важно с последними конфетами)Матричный характер проблемы заставил меня подумать, что R мог бы попытаться это сделать, но лучшая буквальная интерпретация алгоритма, который я мог сделать, была 211 символов:
ungolfed:
источник
Pyth, 29 байт
Это прямой перевод моего CJam answe г в Pyth
Попробуйте онлайн здесь
За этим решением стоит довольно длинная история, и @isaacg очень помог мне в понимании этого нового языка.
В идеале это точный межсловесный перевод моего кода CJam ( 17 байт ):
что значит:
Но, к сожалению, Python ничего не возвращает в
+=
вызове, так что это не был действительный код Python, следовательно, недопустимый код Pyth, как и в Pyth, лямбда может быть только оператором возврата.Затем я изучил различные методы и, наконец, обнаружил, что Python
list.append
возвращаетNone
значение, которое я могу использовать. Создание кода ( 19 байт ):что значит:
Но, к сожалению, поддержка
a
(append) была удалена из Pyth, а версия, у которой есть поддержка, не имеет поддержкиo
.Обновление:
a
поддержка была добавлена еще в Pyth, поэтому вышеуказанный 19-байтовый код будет работать в онлайн-компиляторе. Но так как это новая функция, которая была добавлена после ОП, я не ставлю ее в качестве оценки и не допускаю использование 29-байтового кода в качестве решения.Поэтому в этом случае мне пришлось положиться на сырой Python, чтобы код был
источник