Вам дана строка, которая будет содержать обычные символы z. (Вы можете предположить, что это всегда будет иметь место в любом тесте, и предположить, что все буквы также будут строчными). Вы должны определить, сколько уникальных комбинаций можно сделать из отдельных символов в строке, и распечатать это число.
Однако дублирующие буквы можно игнорировать при подсчете возможных комбинаций. Другими словами, если заданная строка является «привет», то просто переключение позиций двух l
s не считается уникальной фразой и, следовательно, не может быть засчитано в общую сумму.
Побеждает самое короткое число байтов, с нетерпением ждем новых креативных решений на неигровых языках!
Примеры:
hello -> 60
aaaaa -> 1
abcde -> 120
Ответы:
Python 2 ,
5048 байтовПопробуйте онлайн!
Нет скучных встроенных модулей! К моему удивлению, это даже короче, чем метод грубой силы, вычисляющий все перестановки с
itertools
учетом длины.Эта функция использует формулу
и вычисляет это на лету. Факториал в числителе рассчитывается путем умножения на
len(s)
в каждом вызове функции. Знаменатель немного более тонкий; в каждом вызове мы делим на число вхождений этого элемента в том, что осталось от строки, обеспечивая, чтобы для каждого символаc
все числа между 1 и количеством вхожденийc
(включительно) были разделены ровно один раз. Поскольку мы делим только в самом конце, у нас гарантированно не возникнет никаких проблем с делением по умолчанию в Python 2.источник
05AB1E , 3 байта
Попробуйте онлайн!
объяснение
источник
CJam , 4 байта
Попробуйте онлайн!
объяснение
Чтение строки в виде строки (
l
), уникальные перестановки в виде массива строк (e!
), длина (,
), неявное отображение.источник
R ,
6965 байтПопробуйте онлайн!
4 байта сохранены благодаря Захиро Мор в обоих ответах.
Вычисляет коэффициент многочлена напрямую.
R ,
7268 байтПопробуйте онлайн!
Использует полиномиальную функцию распределения, предоставленную
dmultinom
для извлечения полиномиального коэффициента.Обратите внимание, что обычный (игрок в гольф)
x<-table(strsplit(s,""))
не работает внутриdmultinom
звонка по неизвестной причине.источник
function(s,
!=factorial)(!nchar(s))/prod(!table(strsplit(s,"")))
буду работать. el () является избыточным - таблица знает, как искать элементы ....JavaScript (Node.js) , 49 байт
t=t*
используется вместо того,t*=
чтобы избежать ошибки округления (округления|t
до числа), посколькуt=t*
гарантирует, что все промежуточные (операторные) результаты являются целыми числами.Попробуйте онлайн!
источник
t=t*
если хотите избежать этого.)aaadegfbbbccc
именно из-за ошибки округления с плавающей точкойAPL (Dyalog Unicode) , 14 байтов
Попробуйте онлайн!
Возвращает результат в виде синглтона.
источник
⍴
->≢
чтобы вернуть простые скаляры,÷⍨/g⌸,g←!⊢∘≢
для -2Japt ,
53 байта-2 байта благодаря @Shaggy
Попробуйте онлайн!
источник
â
.J ,
15, 14 байтовПопробуйте онлайн!
-1 байт благодаря FrownyFrog
источник
~.
может быть=
Желе , 4 байта
Попробуйте онлайн!
Просто делает то, что было задано: найти перестановки ввода, uniquify и распечатать длину.
источник
C # (интерактивный компилятор Visual C #) , 59 байт
Порт ответа @ArBo 's Python 2 .
Попробуйте онлайн.
источник
Брахилог , 3 байта
Попробуйте онлайн!
pᵘl
делает в точности то же самое.источник
Python 2 , 57 байт
Попробуйте онлайн!
Самодокументирование: возвращает длину набора уникальных перестановок входной строки.
Python 3 , 55 байт
Кредит идет на ArBo на этом:
Попробуйте онлайн!
источник
APL (Dyalog Unicode) , 24 байта
Попробуйте онлайн!
Простой Dfn, принимает строку в качестве аргумента.
Как:
источник
Рубин , 41 байт
Попробуйте онлайн!
источник
to_a
f=
часть. (В TIO переместите его в заголовок, чтобы его не засчитали.)Perl 5 , 43 байта
Использует метод в ответе Python @ ArBo.
Попробуйте онлайн!
источник
Perl 6 ,
3330 символов (3431 байт)Довольно прямолинейный
Whatever
блок.comb
разбивает строку на буквы,permutations
получает все возможные комбинации. Из-за способа принужденияSet
нужноjoin
сначала»
редактировать ( применяетсяjoin
к каждому элементу в списке).Попробуйте онлайн!
(использовался предыдущий ответ,
.unique
ноSet
s гарантирует уникальность и нумерует то же самое, поэтому сохраняет 3).источник
K (ок) , 12 байт
Решение:
Попробуйте онлайн!
Объяснение:
Использует встроенный ОК
prm
:... который, в
x^/:x
основном, генерирует перестановки"helo"
not"hello"
, следовательно, нам нужно генерировать перестановки0 1 2 3 4
, использовать их для индексации,"hello"
а затем считать количество уникальных.источник
!-n
. в конце к5 и к6 сталоprm
. К7 (Шакти)prm
тоже.Java 8,
103102 байтаПорт ответа @ArBo 's Python 2 .
-1 байт благодаря @ OlivierGrégoire , сделав его итеративным, а не рекурсивным.
Попробуйте онлайн.
Фактически генерация всех уникальных перестановок в наборе и получение его размера будет 221 байт :
Попробуйте онлайн.
источник
s->{int r=1,i=s.length();for(;i>0;)r=r*i/~-s.substring(--i).split(s.charAt(i)+"",-1).length;return r;}
.s->{long r=1,i=s.length();for(;i>0;)r=r*i/(s.chars().skip(--i).filter(c -> c==s.charAt(i)).count()+1);return r;}
но пока безуспешно ...MATL , 9 байт
Попробуйте онлайн!
Объяснение:
источник
j
становитсяi
, который можно оставить неявным. Кроме того,&nx
сохраняет байт в течениеZy1)
tio.run/##y00syfn/P9IholQtr@L/f/WM1JycfHUAОктава / MATLAB, 35 байт
Анонимная функция, которая принимает символьный вектор и создает число.
В MATLAB это можно сократить до
size(unique(perms(s),'ro'),1)
(33 байта).Попробуйте онлайн!
объяснение
источник
unique
вернулся уникальные строки уже? Или это только дляtable
с?unique
будут линеаризованы первыми. Для таблиц я думаю, что вы правы; Я этого не знал!unique
в MATLAB для этого нужны строкиtables
; Runique
принимает уникальные строки матриц или фреймы данных. Слишком много языков массивов с одними и теми же командами, которые делают немного разные вещи ...Сетчатка 0.8.2 , 73 байта
Попробуйте онлайн! Использует формулу @ ArBo, но оценивает справа налево, поскольку это можно сделать в целочисленной арифметике, при этом минимизируя размер участвующих унарных значений. Объяснение:
Для каждого символа подсчитайте, сколько осталось дубликатов и сколько еще символов, добавьте по одному каждому для учета текущего символа и разделите значения, чтобы мы знали, какие из них следует разделить, а какие - умножить. ,
Префикс 1 для создания полного выражения.
Повторно умножайте последние и третьи последние числа, делясь на второе последнее число. Это заменяет последние три числа.
Преобразовать в десятичную.
источник
К, 27 байт
К, 16 байт - не реальный ответ
Возьмите 999999 случайных перестановок входной строки, возьмите их уникальный набор и посчитайте длину. В большинстве случаев это даст правильный ответ для коротких строк.
Улучшено благодаря @Sriotchilism O'Zaic, @Selcuk
источник
999999
вместо100000
?Wolfram Language (Mathematica) , 32 байта
Попробуйте онлайн!
Объяснение: Композиция справа с
/*
применяет эти три оператора один за другим к аргументу функции слева направо:Characters
преобразует входную строку в список символов.Permutations
делает список всех уникальных перестановок этого списка символов.Length
возвращает длину этого списка уникальных перестановок.Этот метод очень расточителен для длинных строк: уникальные перестановки фактически перечислены и подсчитаны, вместо того, чтобы использовать их
Multinomial
для вычисления их числа без перечисления.источник
F # (моно) , 105 байт
Попробуйте онлайн!
источник
Pyth ,
54 байтаПопробуйте онлайн!
Это предполагает, что ввод является строковым литералом Python. Если ввод должен быть необработанным текстом, эта 5-байтовая версия будет работать:
В любом случае, он просто вычисляет все перестановки входных данных в виде списка, дедуплицирует его, получает количество элементов в нем и неявно печатает это число.
-1 байт благодаря @ hakr14
источник
{
дедуплицирует список для байта меньше, чем.{
.J ,
1413 байтПопробуйте онлайн!
1 байт благодаря милям
источник
#(%*/)&:!#/.~
должен сохранить другие байтыPHP , 77 байт
Попробуйте онлайн!
По сути, это всего лишь порт PHP с победившим Python-ответом @ ArBo, который до смешного умнее, чем рекурсивный ответ, который у меня был изначально. Браво!
источник
Ом v2 , 4 байта
Попробуйте онлайн!
объяснение
источник
Stax , 3 байта
Запустите и отладьте его
источник