Hasilkan kombinasi yang dipesan dengan pengulangan


9

Dengan serangkaian karakter yang berbeda, dan angka n, buat semua kombinasi berurut dengan pengulangan, dengan panjang 1 hingga n, menggunakan karakter tersebut.

Cara lain untuk mendefinisikannya adalah dengan melihat karakter yang diberikan sebagai digit "kustom" di pangkalan (radix) dari jumlah karakter, maka program harus menghasilkan semua "angka" dengan 1 hingga n digit di pangkalan itu, namun, memimpin "Nol" juga disertakan.

Kombinasi harus dipesan berdasarkan panjangnya (1 karakter pertama, kemudian 2, dll), tetapi selain itu mereka dapat dalam urutan apa pun. Anda dapat memilih cara yang paling mudah untuk menangani input dan output. Kode terpendek menang.

Contoh:

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


Serius? "Menghitung"?
Peter Taylor

@ PeterTaylor apa maksudmu?
Aditsu berhenti karena SE adalah EVIL

2
Anda mengenali dalam masalah ini bahwa Anda hanya meminta orang untuk menghitung. Apakah Anda tidak berpikir itu agak tidak ambisius?
Peter Taylor

3
@PeterTaylor Yah itu bukan penghitungan langsung, bahkan ketika menggunakan basis 10 digit. Saya ingin melihat bagaimana melakukannya dalam kode terpendek. Itu tidak dimaksudkan untuk menjadi sulit. Saya telah melihat lebih banyak pertanyaan sepele dan tidak berpikir itu seharusnya menjadi masalah.
Aditsu berhenti karena SE adalah EVIL

Selain itu, setidaknya ada beberapa masalah di mana saya dapat menerapkan ini :)
aditsu berhenti karena SE adalah EVIL

Jawaban:


4

APL (Dyalog Unicode) , 13 byte SBCS

⊃,/,¨∘.,\⎕⍴⊂⍞

Cobalah online!

jangan pernah melewatkan kesempatan untuk menggunakan pemindaian :)

meminta string "digit" dan kemudian untuk n

terima kasih @ Adám karena memberi tahu saya cara mengaktifkan ]boxdi TIO


5

Python 2, 56 byte

nadalah panjang maksimum dan sdiharapkan menjadi daftar karakter. Tidak jelas bagi saya apakah n = 0 atau daftar karakter kosong adalah input yang valid, tetapi fungsi ini juga menanganinya dengan benar.

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

Penggunaan: argumen kiri adalah string dan argumen kanan adalah angka, seperti:

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

Outputnya dipesan berdasarkan panjang, tetapi dalam grup panjang mereka digeser satu ke kiri, ini paling mudah.

Penjelasan:

  • ,/⍺∘{... }¨⍳⍵: for 1..⍵, terapkan fungsi untuk ⍺ dan gabungkan hasilnya bersama-sama.
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺: untuk setiap angka dari 1 hingga (⍵ = (panjang saat ini)) ^ (⍴⍺ = (jumlah karakter)), konversikan ke basis ⍴⍺ menggunakan ⍵ digit.
  • 1+: tambahkan satu karena array 1-diindeks.
  • ⍺[... ]: gunakan ini sebagai indeks ke dalam string
  • ↓⍉: putar matriks, jadi 'angka' ada di baris, bukan di kolom, lalu pisahkan matriks dengan baris.

1
Apakah APL memiliki pengodean byte tunggal untuk simbolnya?
Aditsu berhenti karena SE adalah JAHAT

@aditsu: Dyalog APL menggunakan Unicode, saya kira semua APL modern lainnya melakukan hal yang sama. Namun, sebelum ada Unicode Anda akan menggunakan codepage sehingga dimungkinkan.
marinus

Saya terutama bertanya karena saya khawatir tidak. dari byte vs no. karakter. Saya tidak tahu berapa banyak simbol yang berbeda yang digunakan APL.
Aditsu berhenti karena SE adalah EVIL

Kecuali saya lupa beberapa atau salah hitung, Dyalog APL memiliki 74 fungsi dan karakter operator, yang akan masuk ke dalam byte bersama dengan 7-bit ASCII. Dan ada juga beberapa tumpang tindih antara mereka dan karakter normal suka ?!/\-+*~&=,.|dan mungkin lebih. Ada pengkodean APL byte tunggal tetapi Unicode lebih mudah digunakan.
marinus

3

Haskell, 34 karakter

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

Penggunaan langsung daftar monad. Satu-satunya golf nyata adalah penggunaan mapMalih-alih yang lebih idiomatis (dan lebih pendek) replicateMyang akan membutuhkan impor Control.Monad.

Pemakaian

> "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]tidak dapat disingkat menjadi t+=[s]karena L dan t akan menunjuk ke daftar yang sama.

Memasukkan: 'ab', 3

Keluaran:

['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)

Pemakaian

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


Apakah mungkin menjalankan ini tanpa membeli Mathematica? Juga, dapatkah Anda "meratakan" output sehingga tidak dikelompokkan berdasarkan panjangnya?
Aditsu berhenti karena SE adalah EVIL

Anda perlu membeli Mathematica. (Pada prinsipnya, kode dapat diuji pada WolframAlpha.com, tetapi karena alasan tertentu tautannya tidak berfungsi dengan benar.)
DavidC

Beli Mathematica? Maaf, tidak akan terjadi: p Kode tidak berfungsi tidak dimodifikasi di wolframalpha, tapi saya bisa melihat beberapa output dari salah satu tautan Anda sebelumnya, jadi bagaimanapun saya menerimanya sebagai jawaban terpendek.
Aditsu berhenti karena SE adalah EVIL

2

MATL, 9 8 byte

x:"1G@Z^

Cobalah di MATL Online!

(MATL dibuat setelah tantangan ini diposting, tetapi saya percaya itu tidak masalah dengan meta konsensus hari ini.)

(-1 byte, terima kasih kepada @Luis Mendo.)

x - hapus input string dari stack (secara otomatis menyalinnya ke clipboard G)

:" - input implisit dari angka n, loop dari 1 ke n

1G - Tempel kembali string input dari clipboard G pada stack

@ - dorong indeks iterasi loop saat ini

Z^- cartesian power: produk cartesian input dengan sendirinya @beberapa kali

Hasil daya kartesian ( @-digit "angka" di dasar yang diberikan) diakumulasikan pada stack dan secara implisit ditampilkan di akhir.


1
Anda dapat menghemat 1 byte denganx:"1G@Z^
Luis Mendo

@LuisMendo Diperbarui (akhirnya!). Terima kasih.
sundar - Reinstate Monica

1

Python - 106

Solusi langsung dan tidak kreatif. Jika Anda menemukan peningkatan yang signifikan, silakan kirim sebagai jawaban terpisah.

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

Input: "ab",3
Keluaran:

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

1

Python, 100

Berasal dari solusi @ 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

Memasukkan: 'ab', 3

Keluaran:

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


1

Pyth, 6 byte

s^LQSE

Mengharapkan set karakter sebagai input 1, jumlah digit sebagai 2. Byte dapat disimpan jika ada metode byte tunggal untuk berulang kali mengakses input ke-2, tetapi sayangnya ...

Cobalah online di sini .

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

Saya tidak tahu ... Saya merasa malas.

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

Versi kombinator Y (untuk shell):

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)

Versi modul:

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

Karakter dihitung tanpa pembukuan wajib (modul dan ekspor).




0

Jelly , 6 byte

WẋŒpƤẎ

Cobalah online!

Pengajuan fungsi, mengambil daftar digit sebagai argumen pertama dan jumlah digit sebagai argumen kedua. Digit itu sendiri dapat berupa tipe data Jelly apa pun, tetapi saya menggunakan bilangan bulat di tautan TIO di atas karena menghasilkan output yang paling baik dalam pembungkus otomatis “function → full program” Jelly.

Penjelasan

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

Produk Cartesian secara efektif memberi kita semua angka dengan jumlah digit tertentu (sesuai dengan awalan yang sedang kita kerjakan). Jadi kita berakhir dengan daftar daftar kombinasi (dikelompokkan berdasarkan panjang), dan dapat meratakan yang satu tingkat untuk mendapatkan daftar yang tidak dikelompokkan (tapi yang masih diurutkan oleh panjang, sebagai pertanyaan memerlukan, sebagai doesn dapat mengubah urutan relatif elemen dan Ƥmencoba awalan yang lebih pendek terlebih dahulu).


0

05AB1E , 6 byte

「˜Ùé

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

Alternatif 6-byte:

CATATAN: Keluaran fleksibel: Menampilkan daftar baru untuk setiap panjang, semua pada jalur cetak yang sama.
Mengubahnya ke daftar tunggal akan menjadi 2 byte lebih lama: Lv²yã`})( Coba online ).

Lv²yã?

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.