Входные данные: последовательность заглавных букв (ASCII [65; 90]), которая является N- й * лексикографической перестановкой мультимножества его символов
* перестановки пронумерованы от 0 или 1 и выше
Вывод: основание-10, целое число N
Rulez
- Там могут быть дубликаты (вот как этот вызов отличается от этого )
- Символы упорядочены по значению ASCII
- В случае ввода длины, меньшей или равной 1, вводом является первая перестановка, а результатом является
0
или1
соответственно - Первая перестановка - это та, в которой крайний левый символ имеет самое низкое значение, самый правый символ имеет наибольшее значение, а последовательность символов между первым и последним символом является первой перестановкой мультимножества его символов (рекурсивное определение!)
- Кратчайшие выигрыши
пример
- Ввод
AAB
производит вывод0
- Ввод
ABA
производит вывод1
- Ввод
BAA
производит вывод2
- Ввод
ZZZ
производит вывод0
- Ввод
DCBA
производит вывод23
РЕДАКТИРОВАТЬ
Дополнительная благодарность тому, кто может придумать решение, которое не производит все перестановки, а затем искать вход. Это какая-то проблема.
code-golf
permutations
Кирилл
источник
источник
zzz
аdcba
не в верхнем регистре.Ответы:
Желе , 5 байт
Попробуйте онлайн!
1-индексированный выход.
источник
Python 2, 69 байт
Попробуйте онлайн
источник
Python,
302287 байтМертвый Опоссум уже опубликовал краткое Pythonic решение, поэтому я решил пойти на дополнительные похвалы. Это решение не генерирует все перестановки. Он может быстро вычислить индекс перестановки довольно большой строки; он также правильно обрабатывает пустую строку.
Тестовый код:
выход
Версия без гольфа:
Около
lexico_permute_string
Этот алгоритм, из-за Нараяна Пандита, из https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
Произвести следующую перестановку в лексикографическом порядке последовательности
a
FWIW, вы можете увидеть аннотированную версию этой функции здесь .
FWIW, вот обратная функция.
выход
А вот функция, которую я написал при разработке,
perm_unrank
которая показывает разбивку субсчетов.выход
источник
z=0
и заменить вt[0]
иt[1:]
где они используются ( в настоящее времяh
иt
) для сохранения 8 байт.True
значения 1 или ниже, но я думаю, что с вашим кодом все должно быть в порядке?f=lambda n:n<2or n*f(n-1)
05AB1E , 5 байтов
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
05AB1E , 5 байтов
Попробуйте онлайн!
Независимо от ответа Аднана.
источник
PHP, 124 байта
PHP, 136 байт
Онлайн версия
Бежать с
Рассчитать с факториалом
Расширенная версия
Вывод для строки PPCG
Онлайн версия
источник
print+$n´ with ´die("$n")´ and the loop will stop after the permutation is found. And I must add
$ n = 0` в цикле, тогда приведение к целому не работает в этом измененииЮлия,
121125 байтНеконкурентоспособен, так как неправильно обрабатывает дубликаты букв. Я перенес это из другого языка, из части решения проблемы Project Euler, которую я сделал несколько лет назад, и первая 121-байтовая версия имела ошибку, потому что я транспонировал использование переставленной строки и отсортированной канонической ссылки. строка.
Для больших входов эта версия использует bignums стоимостью 8 дополнительных байтов:
Ungolfed:
Использует факторную систему счисления , qv. Таким образом, она не производит все перестановки и для больших входов будет работать намного быстрее, чем те, которые делают.
Например, алфавит можно перевести в довольно надуманное предложение «Кварцевый глиф задание vex'd cwm finks». Это предложение представляет собой 259 985 607 122 (42 410 643 097 474 123) лексикографической перестановки букв алфавита. (Приблизительно 260 перестановок септиллионов.) Эта программа обнаруживает, что примерно за 65 мкс на моей машине.
Обратите внимание, что число заканчивается на ... 122, а не ... 123, потому что OP запросил, чтобы перестановки были пронумерованы от 0, а не от 1.
Юлия, 375 байт
Я оставил отступ для удобства чтения, но счетчик байтов без него.
Это просто порт Джулии от великолепного решения Python от PM 2Ring. Я проголодался и решил, что мне все-таки нужно печенье. Интересно увидеть сходства и различия между двумя языками. Я реализовал
itertools.groupby
(в ограниченной форме) какg(w)
.Но логика не моя, так что иди и проголосуй за PM 2Ring ответ .
Замените
f=factorial
на,f(x)=factorial(BigInt(x))
если вы хотите иметь возможность обрабатывать большие вводы, такие как p ("QUARTZGLYPHJOBVEXDCWMFINKS").источник
BAA
- ожидаемого2
, фактического3
.МАТЛ ,
131211 байт1 байт сохранен благодаря ГБ !
Выход основан на 1.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
q
право?Mathematica,
3331 байтИзменение спецификации проблемы позволило сэкономить 2 байта.
Чистая функция, принимающая список в качестве входных данных и возвращающая неотрицательное целое число
N
в форме{{N}}
.источник
-1
.JavaScript (ES6), 130 байт
Меньше гольфа
Тестовое задание
источник
CJam , 7 байтов
Попробуйте онлайн!
источник
Pyth, 5 байт
Онлайн переводчик
Принимает цитируемые данные.
источник
'BAA'
должны возвращаться,2
поскольку они проиндексированы нулями, но4
вместо этого они возвращаются .Скала, 40 байт
Чтобы использовать его, назначьте эту функцию переменной:
Попробуйте онлайн в Ideone
К сожалению,
permutations
возвращает итератор, у которого нетsorted
метода, поэтому он должен быть преобразован вSeq
источник
C ++, 96 байт
Мы можем в полной мере использовать стандартную библиотеку здесь. Список писем передается как начальный / конечный итераторы в стандартном стиле C ++.
Нам не нужно генерировать все перестановки - поскольку у нас есть преобразование из одной перестановки в ее предшественницу, мы просто считаем, сколько итераций требуется для достижения нулевого значения.
Тестовая программа:
Результаты теста:
источник
Japt, 6 байт
0 индексированные
Попытайся
источник
Рубин, 50 байтов
Я ожидал, что это будет короче. Я бы не добавил,
sort
если бы в документах не говорилось, что «реализация не дает никаких гарантий относительно порядка, в котором получаются перестановки».источник