计算单词中所有可能的字母组合


12

系统会为您提供一个字符串,其中将包含普通的az字符。(您可以假设在任何测试中都是如此,并假设所有字母也都为小写)。您必须确定可以对字符串中的各个字符进行多少个唯一组合,然后打印该数字。

但是,在计算可能的组合时,可以忽略重复的字母。换句话说,如果给定的字符串为“ hello”,则仅切换两个ls 的位置不会算作唯一短语,因此无法计入总数。

最短的字节数获胜,期待看到一些非高尔夫语言的创造性解决方案!

例子:

hello -> 60
aaaaa -> 1
abcde -> 120


4
@Giuseppe我不认为这是骗人的;该问题的细节允许更短的实现时间
ArBo

4
添加一些测试用例可能会有所帮助。
tsh

1
@JonathanAllan好的建议!标题相应更改。
SimpleGeek19年

Answers:


29

Python 2中50 48个字节

f=lambda s:s==''or len(s)*f(s[1:])/s.count(s[0])

在线尝试!

没有无聊的内置功能!令我惊讶的是,这甚至比蛮力法要短得多,后者可以计算所有排列itertools并取长度。

此函数使用公式

唯一排列的数量=(元素数)!独特元素(该元素的出现次数)!

并即时进行计算。分子中的阶乘是通过len(s)在每个函数调用中相乘来计算的。分母更加微妙。在每个调用中,我们用该元素在字符串剩余部分中的出现次数除以,以确保对于每个字符c,介于1和c(包括)在内的出现次数之间的所有数字将被精确地除以一次。由于我们只在最后进行划分,因此可以保证Python 2的默认楼层划分没有任何问题。


itertools函数名称非常冗长
qwr19年



5

R69 65字节

function(s,`!`=factorial)(!nchar(s))/prod(!table(strsplit(s,"")))

在线尝试!

感谢Zahiro Mor在两个答案中节省了4个字节。

直接计算多项式系数。

R72 68字节

function(s,x=table(strsplit(s,"")))dmultinom(x,,!!x)*sum(1|x)^sum(x)

在线尝试!

使用提供的多项式分布函数dmultinom提取多项式系数。

请注意,由于未知原因,通常(高尔夫)x<-table(strsplit(s,""))dmultinom通话中无法使用。


2
function(s,=factorial)(!nchar(s))/prod(!table(strsplit(s,""))) 将工作。在EL()是reduntant -表知道如何寻找的元素....
Zahiro铁道部

1
@ZahiroMor啊,当然。我本打算进行测试,但从未尝试过。
朱塞佩

5

JavaScript(Node.js),49字节

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

2
(潜在的浮点舍入错误;t=t*如果要避免这种情况,请使用。)
Neil

@Neil是的,当输入aaadegfbbbccc完全由于浮点舍入错误而失败时
Shieru Asakoto

呵呵,您是如何找到该测试用例的?
尼尔

@Neil继续向字符串中添加字符,直到出现这种舍入错误为止
Shieru Asakoto

@ShieruAsakoto标题已更改;计数要好得多。谢谢,很好的答案!
SimpleGeek19年








2

APL(Dyalog Unicode),24字节

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



2

Perl 6的33 30个字符(34个 31字节)

相当直截了当Whatevercomb将字符串拆分为字母,permutations获取所有可能的组合。由于首先Set需要强制的方式join»适用join于列表中的每个元素)。

+*.comb.permutations».join.Set

在线尝试!

(使用了先前的答案,.uniqueSet保证了唯一性,并将其数字化,因此节省了3)。


2

K(oK),12个字节

解:

#?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 (#)

PRM是可以的特定操作员吗?我不认为香草k有吗?
亨利·亨林森

是的-根据手册
仅以

@HenryHenrinson afaik它不在k4中。在K5早期!-n在k5和k6后期变成了prm。k7(shakti)也有prm
ngn

2

爪哇8,103个 102字节

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);}

在线尝试。



@OlivierGrégoire谢谢!顺便说一句,您是否看到使第二种方法(在集合中生成所有唯一排列)更短的方法?我感觉可以保存一些字节,但是尝试了一些操作,大多数字节都稍长而不是短。
凯文·克鲁伊森

我一直在努力,尝试像这样使用流和计数: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;}但是到目前为止没有成功...
奥利维尔·格雷戈雷(OlivierGrégoire),


1

八度 / MATLAB,35字节

@(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

1
我以为unique已经返回了唯一的行?还是仅用于tables?
朱塞佩

@Giuseppe对于数字/字符2D数组unique将首先线性化。对于桌子,我认为您是对的;我不知道!
Luis Mendo

1
啊,我知道我的主意了- unique在MATLAB中,确实需要一行tables;R unique取矩阵或数据帧的唯一行。具有相同命令的数组语言执行的功能略有不同……
Giuseppe19年

1

视网膜0.8.2,73字节

(.)(?=(.*?\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

K,27个字节

*/[1+!#:x]%*/{*/1+!x}'#:'x:

K,16个字节-不是真正的答案

#?(999999#0N)?\:

对输入字符串进行999999个随机排列,选择它们的唯一集合并计算长度。大多数情况下,对于字符串不足的问题,它会给出正确的答案。

由于@Sriotchilism O'Zaic,@ Selcuk而有所改善


2
欢迎光临本站!没关系,因为它无效,但是您可以使用999999代替来使无效答案更准确100000吗?
Ad Hoc Garf Hunter

是的,好主意,谢谢。
亨利·亨林森

1
也许还可以编辑说明以反映该更改?
塞尔柱克

1

Wolfram语言(Mathematica),32字节

Characters/*Permutations/*Length

在线尝试!

说明:右组成与从左到右/*将这三个运算符一个接一个地应用于函数参数:

  • Characters 将输入字符串转换为字符列表。

  • Permutations 列出此字符列表的所有唯一排列。

  • Length 返回此唯一排列列表的长度。

此方法对于长字符串非常浪费:实际上会列出并计数唯一的排列,而不是使用a Multinomial来计算其编号而不列出。



1

Pyth5 4字节

l{.p

在线尝试!

假设输入是python字符串文字。如果输入必须是原始文本,则此5字节版本将起作用:

l{.pz

无论哪种方式,它都只是将输入的所有排列计算为一个列表,然后对它进行重复数据删除并获取其中的元素数量,然后隐式打印该数量。

-1字节感谢@ hakr14


{对列表进行重复数据删除的字节数小于.{
hakr14

1

J14  13字节

#(%*/)&:!#/.~

在线尝试!

1英里归功于英里

#                  length
         #/.~      counts of each unique character
 (%*/)             divide left by the product of right
      &:!          after applying ! to both

1
#(%*/)&:!#/.~ 应该保存另一个字节
英里



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.