Tạo kết hợp theo thứ tự với sự lặp lại


9

Cho một chuỗi các ký tự khác nhau và một số n, tạo ra tất cả các kết hợp có thứ tự với sự lặp lại, có độ dài từ 1 đến n, sử dụng các ký tự đó.

Một cách khác để định nghĩa nó là xem các ký tự đã cho là các chữ số "tùy chỉnh" trong cơ sở (cơ số) của số lượng ký tự, sau đó chương trình sẽ tạo ra tất cả các "số" có từ 1 đến n chữ số trong cơ sở đó, tuy nhiên, dẫn đầu "số không" được bao gồm quá.

Các kết hợp nên được sắp xếp theo độ dài của chúng (1 ký tự trước, sau đó 2, v.v.), nhưng ngoài các ký tự đó có thể theo thứ tự bất kỳ. Bạn có thể chọn những cách thuận tiện nhất để xử lý đầu vào và đầu ra. Mã ngắn nhất sẽ thắng.

Ví dụ:

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


Nghiêm túc? "Đếm"?
Peter Taylor

@PeterTaylor có nghĩa là gì?
aditsu nghỉ việc vì SE là EVIL

2
Bạn nhận ra trong vấn đề mà bạn chỉ cần yêu cầu mọi người đếm. Bạn không nghĩ rằng đó là một chút không rõ ràng?
Peter Taylor

3
@PeterTaylor Chà không đơn giản, kể cả khi sử dụng 10 chữ số cơ bản. Tôi muốn xem làm thế nào để làm điều đó trong mã ngắn nhất. Nó không có ý định khó khăn. Tôi cũng đã thấy nhiều câu hỏi tầm thường hơn và đừng nghĩ đó là một vấn đề.
aditsu bỏ cuộc vì SE là EVIL

Hơn nữa, có ít nhất một vài vấn đề mà tôi có thể áp dụng điều này :)
aditsu bỏ cuộc vì SE là EVIL

Câu trả lời:



5

Python 2, 56 byte

nlà độ dài tối đa và sdự kiến ​​sẽ là một danh sách các ký tự. Tôi không rõ liệu n = 0 hay danh sách ký tự trống là đầu vào hợp lệ, nhưng chức năng này cũng xử lý chúng một cách chính xác.

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

4

J, 41 char

   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+(⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺]}¨⍳⍵}

Cách sử dụng: đối số bên trái là chuỗi và đối số bên phải là số, như vậy:

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

Đầu ra được sắp xếp theo độ dài, nhưng trong các nhóm độ dài, chúng được dịch chuyển sang trái, điều này là dễ nhất.

Giải trình:

  • ,/⍺∘{... }¨⍳⍵: cho 1..⍵, áp dụng hàm cho và nối các kết quả lại với nhau.
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺: cho mỗi số từ 1 đến (⍵ = (độ dài hiện tại)) ^ (= (số lượng ký tự)), chuyển đổi sang cơ sở ⍴⍺ bằng cách sử dụng ⍵ chữ số.
  • 1+: thêm một vì các mảng được lập chỉ mục 1.
  • ⍺[... ]: sử dụng chúng làm chỉ mục cho chuỗi
  • ↓⍉: xoay ma trận, do đó, 'số' nằm trên các hàng thay vì trong các cột, sau đó chia ma trận theo hàng.

1
APL có mã hóa một byte cho các ký hiệu của nó không?
aditsu bỏ cuộc vì SE là EVIL

@aditsu: APL Dyalog sử dụng Unicode, tôi đoán tất cả các APL hiện đại khác đều làm như vậy. Tuy nhiên, trước khi có Unicode, bạn sử dụng một bảng mã để có thể.
bến tàu

Tôi chủ yếu hỏi vì tôi lo lắng về không. byte so với không. của các nhân vật. Tôi không biết APL sử dụng bao nhiêu biểu tượng khác nhau.
aditsu bỏ cuộc vì SE là EVIL

Trừ khi tôi quên một số hoặc bị nhầm lẫn, Dyalog APL có 74 ký tự hàm và toán tử, sẽ khớp với một byte cùng với ASCII 7 bit. Và cũng có một số sự chồng chéo giữa những người đó và các nhân vật bình thường như ?!/\-+*~&=,.|và có thể một số nữa. Tồn tại mã hóa APL byte đơn nhưng Unicode dễ sử dụng hơn.
bến

3

Haskell, 34 ký tự

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

Sử dụng đơn giản các danh sách đơn nguyên. Việc chơi golf thực sự duy nhất là việc sử dụng mapMthay vì thành ngữ hơn (và ngắn hơn) replicateMsẽ yêu cầu nhập khẩu Control.Monad.

Sử dụng

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

2

Con trăn, 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]không thể rút ngắn t+=[s]vì L và t sẽ được trỏ đến cùng một danh sách.

Đầu vào: 'ab', 3

Đầu ra:

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

2

Toán học 29 19 28

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

Sử dụng

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


Có thể chạy cái này mà không cần mua Mathicala? Ngoài ra, bạn có thể "làm phẳng" đầu ra để nó không được nhóm theo chiều dài không?
aditsu nghỉ việc vì SE là EVIL

Bạn cần mua Mathicala. (Về nguyên tắc, mã có thể được kiểm tra trên WolframAlpha.com, nhưng vì một số lý do, liên kết không hoạt động đúng.)
DavidC

Mua Mathicala? Xin lỗi, sẽ không xảy ra: p Mã không hoạt động không được sửa đổi trên wolframalpha, nhưng tôi có thể thấy một số kết quả từ một trong các liên kết trước đó của bạn, vì vậy dù sao tôi cũng đang chấp nhận nó là câu trả lời ngắn nhất.
aditsu bỏ cuộc vì SE là EVIL

2

MATL, 9 8 byte

x:"1G@Z^

Hãy thử nó trên MATL Online!

(MATL đã được tạo sau khi thử thách này được đăng, nhưng tôi tin rằng điều đó ổn bởi sự đồng thuận meta ngày nay.)

(-1 byte nhờ @Luis Mendo.)

x - xóa đầu vào chuỗi từ ngăn xếp (tự động sao chép nó vào clipboard G)

:" - đầu vào ngầm định của số n, vòng lặp từ 1 đến n

1G - dán lại chuỗi đầu vào từ clipboard G trên ngăn xếp

@ - đẩy chỉ số vòng lặp hiện tại

Z^- sức mạnh cartesian: sản phẩm cartesian của đầu vào với @số lần

Các kết quả sức mạnh của cartesian ( @"số" chữ số trong cơ sở đã cho) được tích lũy trên ngăn xếp và hiển thị ngầm ở cuối.


1
Bạn có thể lưu 1 byte vớix:"1G@Z^
Luis Mendo

@LuisMendo Cập nhật (cuối cùng!). Cảm ơn.
- Phục hồi Monica

1

Con trăn - 106

Các giải pháp đơn giản, không sáng tạo. Nếu bạn tìm thấy những cải tiến đáng kể, xin vui lòng gửi như một câu trả lời riêng biệt.

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

Đầu vào: "ab",3
Đầu ra:

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

1

Con trăn, 100

Bắt nguồn từ giải pháp của @ 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

Đầu vào: 'ab', 3

Đầu ra:

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


1

Bình thường, 6 byte

s^LQSE

Yêu cầu tập hợp các ký tự là đầu vào thứ 1, số chữ số là thứ 2. Một byte có thể được lưu nếu có một phương thức một byte để liên tục truy cập vào đầu vào thứ 2, nhưng than ôi ...

Hãy thử trực tuyến tại đây .

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

Tôi không biết ... Tôi cảm thấy lười biếng.

<?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

Phiên bản kết hợp Y (cho vỏ):

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)

Phiên bản mô-đun:

-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)].

Chars đếm mà không có sổ sách kế toán bắt buộc (mô-đun và xuất khẩu).




0

Thạch , 6 byte

WẋŒpƤẎ

Hãy thử trực tuyến!

Chức năng đệ trình, lấy danh sách các chữ số làm đối số thứ nhất và số chữ số làm đối số thứ hai. Bản thân các chữ số có thể là bất kỳ loại dữ liệu nào của Jelly, nhưng tôi đã sử dụng các số nguyên trong liên kết TIO ở trên vì nó tạo ra đầu ra đẹp nhất trong chức năng tự động của Jelly → trình bao bọc toàn bộ chương trình.

Giải trình

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

Sản phẩm của Cartesian cung cấp cho chúng ta tất cả các số có một số chữ số nhất định (theo tiền tố mà chúng ta đang làm việc). Vì vậy, chúng tôi kết thúc với một danh sách các danh sách kết hợp (được nhóm theo độ dài) và có thể làm phẳng một cấp độ đó để có được danh sách không được nhóm (nhưng vẫn được sắp xếp theo độ dài, như câu hỏi yêu cầu, như không 't thay đổi thứ tự tương đối của các phần tử và Ƥthử các tiền tố ngắn hơn trước).


0

05AB1E , 6 byte

「˜Ùé

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

ã         # 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

Thay thế 6 byte:

GHI CHÚ: Đầu ra linh hoạt: Xuất ra một danh sách mới cho mọi độ dài, tất cả trên cùng một dòng in.
Chuyển đổi nó thành một danh sách sẽ dài hơn 2 byte: Lv²yã`})( Thử trực tuyến ).

Lv²yã?

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.