重复生成有序组合


9

给定一串不同的字符和一个数字n,使用这些字符生成长度为1到n的所有重复的有序组合。

定义它的另一种方法是将给定字符视为字符数基数(基数)中的“自定义”数字,然后程序应在该基数中生成具有1到n位数字的所有“数字”。也包括“零”。

组合应按其长度排序(首先为1个字符,然后为2个字符,依此类推),但除此之外,它们可以按任何顺序排列。您可以选择最方便的方式来处理输入和输出。最短的代码胜出。

例子:

ab, 3-> a,b,aa,ab,ba,bb,aaa,aab,aba,baa,abb,bab,bba,bbb
0123456789, 2->0,1,2,3,4,5,6,7,8,9,00,01,...,09,10,11,...,99


认真吗 “计数”?
彼得·泰勒

@PeterTaylor是什么意思?
aidtsu退出是因为SE为EVIL,2013年

2
您意识到在这个问题中,您只是在要求人们数数。您不觉得这有点野心吗?
彼得·泰勒

3
@PeterTaylor好吧,即使使用基数为10的数字也不是那么简单。我想看看如何用最短的代码做到这一点。这并不难。我也看到了更多琐碎的问题,因此认为这不是问题。
aidtsu退出是因为SE为EVIL,2013年

此外,至少有几个问题可以应用:)
aditsu退出是因为SE是EVIL,2013年

Answers:



5

Python 2,56个字节

n是最大长度,s应该是一个字符列表。我不清楚n = 0还是空字符列表是有效输入,但是此函数也可以正确处理它们。

f=lambda s,n:n*s and s+[x+c for x in f(s,n-1)for c in s]

4

J,41个字符

   f=.}:@;@({@(,&(<',')@(]#<@[))"1 0>:@i.@])

   'ab' f 3
a,b,aa,ab,ba,bb,aaa,aab,aba,abb,baa,bab,bba,bbb

3

APL(31)

{,/⍺∘{↓⍉⍺[1+(⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺]}¨⍳⍵}

用法:左参数是字符串,右参数是数字,如下所示:

    'ab'{,/⍺∘{↓⍉⍺[1+(⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺]}¨⍳⍵}3
b  a  ab  ba  bb  aa  aab  aba  abb  baa  bab  bba  bbb  aaa  

输出按长度排序,但是在长度组内将它们向左移动一个,这是最简单的。

说明:

  • ,/⍺∘{... }¨⍳⍵:对于1..⍵,将函数应用于⍺并将结果合并在一起。
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺:对于从1到(⍵=(当前长度))^(⍴⍺=(字符数))的每个数字,请使用⍵位将其转换为以base为底的数字。
  • 1+:添加1,因为数组是1索引的。
  • ⍺[... ]:将它们用作字符串的索引
  • ↓⍉:旋转矩阵,使“数字”位于行而不是列中,然后按行将矩阵拆分。

1
APL的符号是否有单字节编码?
aidtsu退出是因为SE为EVIL,2013年

@aditsu:Dyalog APL使用Unicode,我想所有其他现代APL都一样。但是,在使用Unicode之前,您将使用一个代码页,以便有可能。
marinus

我主要是问,因为我担心没有。字节数与否 字符。我不知道APL使用多少种不同的符号。
aidtsu退出是因为SE为EVIL,2013年

除非我忘记了一些或误算了,否则Dyalog APL具有74个函数和运算符,它们可以与7位ASCII一起适合一个字节。这些字符与普通字符(例如?!/\-+*~&=,.|,可能还有更多)之间也存在一些重叠。存在单字节APL编码,但Unicode更易于使用。
marinus 2013年

3

Haskell,34个字符

x%n=do k<-[1..n];mapM(\_->x)[1..k]

直接使用列表monad。唯一真正的高尔夫运动是使用mapM代替习惯用法(和更短的用法),而replicateM这将需要导入Control.Monad

用法

> "ab" % 3
["a","b","aa","ab","ba","bb","aaa","aab","aba","abb","baa","bab","bba","bbb"]

2

蟒蛇,97 94

from itertools import*
s,n=input()
L=t=[]
exec"t=t+[s];L+=map(''.join,product(*t));"*n
print L

t=t+[s]不能简化为t+=[s]L和t指向同一列表。

输入: 'ab', 3

输出:

['a', 'b', 'aa', 'ab', 'ba', 'bb', 'aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bb
a', 'bbb']

2

Mathematica 29 19 28

Join@@(i~Tuples~#&/@Range@n)

用法

i={a, 4, 3.2};n=3;

Join@@(i~Tuples~#&/@Range@n)

{{a},{4},{3.2},{a,a},{a,4},{a,3.2},{4,a},{4、4},{4、3.2},{ 3.2,a},{3.2、4},{3.2、3.2},{a,a,a},{a,a,4},{a,a,3.2},{a,4,a},{ a,4,4},{a,4,3.2},{a,3.2,a},{a,3.2,4},{a,3.2,3.2},{4,a,a},{4, a,4},{4,a,3.2},{4,4,a},{4,4,4},{4,4,3.2},{4,3.2,a},{4,3.2, 4},{4、3.2、3.2},{3.2,a,a},{3.2,a,4},{3.2,a,3.2},{3.2、4,a},{3.2、4、4} ,{3.2、4、3.2},{3.2、3.2,a},{3.2、3.2、4},{3.2、3.2、3.2}}


是否可以在不购买Mathematica的情况下运行它?另外,您可以“展平”输出,以便不按长度分组吗?
aidtsu退出是因为SE为EVIL,2013年

您需要购买Mathematica。(原则上,可以在WolframAlpha.com上测试代码,但是由于某些原因,链接无法正常工作。)
DavidC

购买Mathematica?抱歉,不会发生:p该代码无法在Wolframalpha上未经修改地工作,但是我可以从您较早的链接之一看到一些输出,因此无论如何我还是暂时接受它作为最短的答案。
aidtsu退出是因为SE为EVIL,2013年

2

MATL,9 8字节

x:"1G@Z^

在MATL在线上尝试一下!

(MATL是在发布此挑战后创建的,但我相信这些天通过元共识是可以的。)

(由于@Luis Mendo,-1个字节。)

x -从堆栈中删除输入的字符串(自动将其复制到剪贴板G)

:" -数字n的隐式输入,从1到n循环

1G -将输入字符串从剪贴板G粘贴回堆栈

@ -推送当前循环迭代索引

Z^-笛卡尔幂:输入@次数的笛卡尔乘积本身

笛卡尔幂结果(@给定底数的-位“数字”)累积在堆栈上,并在末尾隐式显示。


1
您可以使用x:"1G@Z^
路易斯·门多

@LuisMendo更新(最终!)。谢谢。
sundar-恢复莫妮卡

1

蟒蛇-106

直接,无创的解决方案。如果发现重大改进,请作为单独的答案发布。

s,n=input()
l=len(s)
for i in range(1,n+1):
 for j in range(l**i):t='';x=j;exec't+=s[x%l];x/=l;'*i;print t

输入:"ab",3
输出:

a
b
aa
ba
ab
bb
aaa
baa
aba
bba
aab
bab
abb
bbb

1

Python,100

源自@aditsu的解决方案

s,n=input()
L=len(s)
i=0
while i<n:i+=1;j=0;exec"x=j=j+1;t='';exec't+=s[x%L];x/=L;'*i;print t;"*L**i

输入: 'ab', 3

输出:

b
a
ba
ab
bb
aa
baa
aba
bba
aab
bab
abb
bbb
aaa


1

Pyth,6个字节

s^LQSE

预期字符集为第一输入,位数为第二。如果有一个单字节方法可以重复访问第二个输入,则可以保存一个字节,但是a ...

在这里在线尝试。

s^LQSE   Implicit: Q=input 1, E=evaluate next input
    SE   Range [1,2,...,E]
 ^LQ     Perform repeated cartesian product of Q for each element of the above
s        Flatten

1

Perl 6、33字节

{flat [\X~] '',|[$^a.comb xx$^b]}

在线尝试!

匿名代码块,它包含一个字符串和一个数字,并返回一个字符串列表。


0

PHP 180

我不知道...我很懒。

<?php $f=fgetcsv(STDIN);$l=strlen($f[1]);$s=str_split($f[1]);for($i=1;$i<=$f[0];$i++)for($j=0;$j<pow($l,$i);$j++){$o="";$x=$j;for($q=0;$q<$i;$q++){$o.=$s[$x%$l];$x/=$l;}echo"$o ";}

0

Erlang 110

Y组合器版本(用于外壳):

fun(X, N)->F=fun(_,_,0)->[[]];(G, X, Y)->[[A|B]||A<-X,B<-G(G,X,Y-1)]end,[V||Y<-lists:seq(1,N),V<-F(F,X,Y)]end.

0

Erlang 89(118)

模块版本:

-module(g).
-export([g/2]).
h(_,0)->[[]];h(X,N)->[[A|B]||A<-X,B<-h(X,N-1)].
g(X,N)->[V||Y<-lists:seq(1,N),V<-h(X,Y)].

没有强制记账(模块和导出)的字符数。




0

果冻,6个字节

WẋŒpƤẎ

在线尝试!

函数提交,以数字列表作为第一个参数,数字位数作为第二个参数。数字本身可以是Jelly的任何数据类型,但是我在上面的TIO链接中使用了整数,因为它在Jelly的自动“功能→完整程序”包装器中产生了外观最好的输出。

说明

WẋŒpƤẎ                      (called with arguments, e.g. [1,2,5], 3)
Wẋ       Make {argument 2} copies of {argument 1}  (e.g. [[1,2,5],[1,2,5],[1,2,5])
    Ƥ    For each prefix:                          (e.g. 1-3 copies of [1,2,5])
  Œp       take Cartesian product of its elements
     Ẏ   Flatten one level

笛卡尔积有效地为我们提供了具有给定数字位数的所有数字(根据我们使用的前缀)。因此,我们最终与组合(按长度分组)的列表的列表,并且可以拼合为了使一个水平得到未分组名单(但仍是排序按长度,因为这个问题要求,如没有按请勿更改元素的相对顺序,并先Ƥ尝试使用较短的前缀)。


0

05AB1E,6 个字节

「˜Ùé

在线尝试验证所有测试用例

说明:

ã         # Cartesian product of the second input repeated the first input amount of times
          #  i.e. 3 and 'ab' → ['aaa','aab','aba','abb','baa','bab','bba','bbb']
 €Œ       # Take all the substrings for each of those results
          #  i.e. 'aba' → ['a','ab','aba','b','ba','a']
   ˜      # Flatten the list of lists
    Ù     # Remove all duplicated values
     é    # Sort the list by length

6字节替代:

注意:灵活的输出:在相同的打印行上为每种长度输出一个新列表。
将其转换为一个单独的列表是2个字节:Lv²yã`})在线试用)。

Lv²yã?

在线尝试验证所有测试用例

说明:

Lv        # Loop `y` in the range [1, integer_input]
  ²yã     #  Take the second input and create an `y` times repeated cartesian product of it
          #   i.e. y=2 and 'ab' → ['aa','ab','ba','bb']
     ?    #  Print this list (without new-line)

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.