繰り返しのある順序付けられた組み合わせを生成する


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


マジ?"カウント"?
Peter Taylor

@PeterTaylorどういう意味ですか?
SEが悪魔であるためaditsuが辞任

2
あなたはあなたが単純に人々に数えるように頼んでいるという問題で認識します。少し曖昧ではないと思いませんか?
Peter Taylor

3
@PeterTaylor 10進数を使用する場合でも、簡単にカウントすることはできません。最短のコードでそれを行う方法を確認したいと思います。難しいことを意図したものではありません。私はもっ​​と些細な質問も見てきましたが、それが問題になるとは思いません。
aditsuは、SEは悪であるため、終了

さらに、私はこの:)を適用することができます問題の少なくともいくつかあります
SEは悪であるため、aditsuは終了

回答:



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..⍵の場合、関数をtoに適用し、結果を結合します。
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺:1から(⍵=(現在の長さ))^(⍴⍺=(文字数))までの各数値について、base桁を使用してベース⍴⍺に変換します。
  • 1+:配列のインデックスは1であるため、1を追加します。
  • ⍺[... ]:これらを文字列のインデックスとして使用します
  • ↓⍉:マトリックスを回転して、「数値」が列ではなく行にあるようにし、マトリックスを行で分割します。

1
APLのシンボルにはシングルバイトエンコーディングがありますか?
SEは悪であるためaditsuは終了

@aditsu:Dyalog APLはUnicodeを使用します。他のすべての最新のAPLも同じように動作します。ただし、Unicodeが登場する前は、コードページを使用していたので、それが可能でした。
マリナス

私は「いいえ」が気になるので、主に尋ねています。バイト対ノー 文字の。APLが使用するさまざまなシンボルの数がわかりません。
SEは悪であるためaditsuは終了

いくつか忘れたり、数え直したりしない限り、Dyalog APLには74の関数文字と演算子文字があり、7ビットASCIIと一緒に1バイトにうまく収まります。そして、それらと通常のキャラクターとの間には?!/\-+*~&=,.|、おそらくさらにいくつかのオーバーラップがあります。シングルバイトのAPLエンコーディングは存在しますが、Unicodeの方が使いやすいです。
マリナス2013年

3

Haskell、34文字

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

リストモナドの簡単な使用。唯一の本当のゴルフは、インポートを必要mapMとするより慣用的な(そしてより短い)代わりにを使用するreplicateMことですControl.Monad

使用法

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

2

Python、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を購入せずにこれを実行することは可能ですか?また、出力を「フラット化」して、長さでグループ化しないようにできますか?
SEが悪魔であるためaditsuが辞任

Mathematicaを購入する必要があります。(原則として、コードはWolframAlpha.comでテストできますが、何らかの理由でリンクが正しく機能しません。)
DavidC

Mathematicaを購入しますか?申し訳ありませんが、発生しません:pコードは変更されずにwolframalphaでは機能しませんが、以前のリンクの1つからの出力が表示される可能性があるため、とにかく、それを暫定的に最短の回答として受け入れます。
aditsuは、SEは悪であるため、終了

2

MATL、9 8バイト

x:"1G@Z^

MATL Onlineでお試しください!

(MATLはこのチャレンジが投稿された後に作成されましたが、最近のメタコンセンサスで問題ないと思います。)

(@Luis Mendoのおかげで-1バイト。)

x -文字列入力をスタックから削除します(自動的にクリップボードGにコピーします)

:" -数値nの暗黙の入力、1からnにループ

1G -クリップボードGからの入力文字列をスタックに貼り付けます

@ -現在のループ反復インデックスをプッシュします

Z^-デカルトパワー:入力自体のデカルト積@と回数

デカルトパワーの結果(@指定されたベースの-digit "数値")はスタックに蓄積され、暗黙的に最後に表示されます。


1
1バイトを節約できますx:"1G@Z^
Luis Mendo 2018

@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

文字のセットを最初の入力、桁数を2番目の入力と想定します。1バイトの方法で2番目の入力に繰り返しアクセスする場合、バイトを保存できますが、残念ながら...

こちらからオンラインでお試しください。

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


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

アーラン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

アーラン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ƤẎ

オンラインでお試しください!

最初の引数として数字のリストを取り、2番目の引数として数字の数を取る関数の送信。数字自体はJellyの任意のデータ型にすることができますが、Jellyの自動「関数→完全なプログラム」ラッパーで見栄えの良い出力を生成するため、上記のTIOリンクでは整数を使用しました。

説明

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

デカルト積は、指定された桁数のすべての数値を効果的に提供します(使用している接頭辞に従って)。我々は(長さによってグループ化された)の組み合わせのリストのリストで終わる、およびグループ化されていないリストを取得するために、1つのレベルを平らにすることができます(ただし、これはまだされてソートされた質問が必要とするように、長さのdoesn要素の相対的な順序を変更せず、Ƥ最初に短い接頭辞を試します)。


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)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.