系统会为您提供一个字符串,其中将包含普通的az字符。(您可以假设在任何测试中都是如此,并假设所有字母也都为小写)。您必须确定可以对字符串中的各个字符进行多少个唯一组合,然后打印该数字。
但是,在计算可能的组合时,可以忽略重复的字母。换句话说,如果给定的字符串为“ hello”,则仅切换两个l
s 的位置不会算作唯一短语,因此无法计入总数。
最短的字节数获胜,期待看到一些非高尔夫语言的创造性解决方案!
例子:
hello -> 60
aaaaa -> 1
abcde -> 120
系统会为您提供一个字符串,其中将包含普通的az字符。(您可以假设在任何测试中都是如此,并假设所有字母也都为小写)。您必须确定可以对字符串中的各个字符进行多少个唯一组合,然后打印该数字。
但是,在计算可能的组合时,可以忽略重复的字母。换句话说,如果给定的字符串为“ hello”,则仅切换两个l
s 的位置不会算作唯一短语,因此无法计入总数。
最短的字节数获胜,期待看到一些非高尔夫语言的创造性解决方案!
例子:
hello -> 60
aaaaa -> 1
abcde -> 120
Answers:
f=lambda s:s==''or len(s)*f(s[1:])/s.count(s[0])
没有无聊的内置功能!令我惊讶的是,这甚至比蛮力法要短得多,后者可以计算所有排列itertools
并取长度。
此函数使用公式
并即时进行计算。分子中的阶乘是通过len(s)
在每个函数调用中相乘来计算的。分母更加微妙。在每个调用中,我们用该元素在字符串剩余部分中的出现次数除以,以确保对于每个字符c
,介于1和c
(包括)在内的出现次数之间的所有数字将被精确地除以一次。由于我们只在最后进行划分,因此可以保证Python 2的默认楼层划分没有任何问题。
function(s,`!`=factorial)(!nchar(s))/prod(!table(strsplit(s,"")))
感谢Zahiro Mor在两个答案中节省了4个字节。
直接计算多项式系数。
function(s,x=table(strsplit(s,"")))dmultinom(x,,!!x)*sum(1|x)^sum(x)
使用提供的多项式分布函数dmultinom
提取多项式系数。
请注意,由于未知原因,通常(高尔夫)x<-table(strsplit(s,""))
在dmultinom
通话中无法使用。
function(s,
!=factorial)(!nchar(s))/prod(!table(strsplit(s,"")))
将工作。在EL()是reduntant -表知道如何寻找的元素....
t=t*
用来t*=
避免舍入错误(舍入|t
数字)是为了t=t*
确保所有中间(运算符)结果都是整数。
a=>[...a].map(g=x=>t=t*y++/(g[x]=-~g[x]),t=y=1)|t
a=>
[...a].map( // Loop over the characters
g=x=>
t=t* // using t*= instead may result in rounding error
y++ // (Length of string)!
/(g[x]=-~g[x]) // divided by product of (Count of character)!
,t=y=1 // Initialization
)
|t
t=t*
如果要避免这种情况,请使用。)
aaadegfbbbccc
完全由于浮点舍入错误而失败时
f=s=>s==""?1:s.Length*f(s.Substring(1))/s.Count(c=>c==s[0])
⎕CY'dfns'
{≢∪↓⍵[pmat≢⍵]}
简单的Dfn,将字符串作为参数。
⎕CY'dfns' ⍝ Copies the 'dfns' namespace.
{≢∪↓⍵[pmat≢⍵]} ⍝ Main function
≢⍵ ⍝ Number of elements in the argument (⍵)
pmat ⍝ Permutation Matrix of the range [1..≢⍵]
⍵[ ] ⍝ Index the argument with that matrix, which generates all permutations of ⍵
↓ ⍝ Convert the matrix into a vector of strings
∪ ⍝ Keep only the unique elements
≢ ⍝ Tally the number of elements
相当直截了当Whatever
。 comb
将字符串拆分为字母,permutations
获取所有可能的组合。由于首先Set
需要强制的方式join
(»
适用join
于列表中的每个元素)。
+*.comb.permutations».join.Set
(使用了先前的答案,.unique
但Set
保证了唯一性,并将其数字化,因此节省了3)。
解:
#?x@prm@!#x:
说明:
使用内置的oK prm
:
{[x]{[x]$[x;,/x ,''o'x ^/:x;,x]}@$[-8>@x;!x;x]}
...,由于x^/:x
基本上会生成"helo"
not 的排列"hello"
,因此我们需要生成of的排列0 1 2 3 4
,使用它们索引到"hello"
唯一值中,然后进行唯一性计数。
#?x@prm@!#x: / the solution
x: / store input as x
# / count (#) length
! / range (!) 0..n
prm@ / apply (@) to function prm
x@ / apply permutations to input x
? / take the distinct (?)
# / count (#)
s->{int r=1,i=s.length();for(;i>0;)r=r*i/~-s.substring(--i).split(s.charAt(i)+"",-1).length;return r;}
@ArBo的Python 2答案端口。
-1字节感谢@OlivierGrégoire,使其成为迭代而不是递归。
实际上,在Set中生成所有唯一排列并获取其大小将为221个字节:
import java.util.*;s->{Set S=new HashSet();p(s,S,0,s.length()-1);return S.size();}void p(String s,Set S,int l,int r){for(int i=l;i<=r;p(s.replaceAll("(.{"+l+"})(.)(.{"+(i++-l)+"})(.)(.*)","$1$4$3$2$5"),S,l+1,r))S.add(s);}
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;}
但是到目前为止没有成功...
jY@XuZy1)
说明:
j input as string
Y@ get permutations
Xu unique members
Zy size matrix
1) first member of size matrix
@(s)size(unique(perms(s),'rows'),1)
带有字符向量并产生数字的匿名函数。
在MATLAB中,可以将其缩短为size(unique(perms(s),'ro'),1)
(33个字节)。
@(s) % Anonymous function with input s
perms(s) % Permutations. Gives a char matrix
unique( ,'rows') % Deduplicate rows
size( ,1) % Number of rows
unique
已经返回了唯一的行?还是仅用于table
s?
unique
将首先线性化。对于桌子,我认为您是对的;我不知道!
unique
在MATLAB中,确实需要一行tables
;R unique
取矩阵或数据帧的唯一行。具有相同命令的数组语言执行的功能略有不同……
(.)(?=(.*?\1)*)
/1$#2$*1x1$.'$*
^
1
+`1(?=1*/(1+)x(\1)+$)|/1+x1+$
$#2$*
1
在线尝试!使用@ArBo的公式,但是从右到左求值,因为这可以用整数算术完成,同时仍使所涉及的一元值的大小最小。说明:
(.)(?=(.*?\1)*)
/1$#2$*1x1$.'$*
对于每个字符,计算剩余的重复数以及还有多少个其他字符,将每个重复数相加以考虑当前字符,并分离出值,以便我们知道哪些将被分割,哪些将被相乘。
^
1
前缀1以产生一个完整的表达式。
+`1(?=1*/(1+)x(\1)+$)|/1+x1+$
$#2$*
重复乘以倒数第二个数字,最后乘以倒数第二个数字。这将替换最后三个数字。
1
转换为十进制。
*/[1+!#:x]%*/{*/1+!x}'#:'x:
#?(999999#0N)?\:
对输入字符串进行999999个随机排列,选择它们的唯一集合并计算长度。大多数情况下,对于字符串不足的问题,它会给出正确的答案。
由于@Sriotchilism O'Zaic,@ Selcuk而有所改善
999999
代替来使无效答案更准确100000
吗?
Characters/*Permutations/*Length
说明:右组成与从左到右/*
将这三个运算符一个接一个地应用于函数参数:
Characters
将输入字符串转换为字符列表。
Permutations
列出此字符列表的所有唯一排列。
Length
返回此唯一排列列表的长度。
此方法对于长字符串非常浪费:实际上会列出并计数唯一的排列,而不是使用a Multinomial
来计算其编号而不列出。
function f($s){return!$s?:strlen($s)*f(substr($s,1))/substr_count($s,$s[0]);}
这基本上只是一个PHP端口 @ArBo获奖的Python答案这比我最初的递归答案要聪明得多。太棒了!