Tekrarlı sipariş kombinasyonları oluşturun


9

Farklı karakterlerden oluşan bir dize ve n sayısı verildiğinde, bu karakterleri kullanarak 1 ila n uzunluğunda tekrarlanan tüm sıralı kombinasyonları oluşturun.

Bunu tanımlamanın başka bir yolu, verilen karakterleri karakter sayısının tabanındaki (özel sayı) "özel" basamaklar olarak görmektir, o zaman program bu tabandaki 1 ila n basamaklı tüm "sayıları" oluşturmalıdır. "sıfırlar" da dahildir.

Kombinasyonlar uzunluklarına göre (önce 1 karakter, sonra 2 vb.), Ancak herhangi bir sırada olabileceğinden farklı olmalıdır. Giriş ve çıkışı işlemenin en uygun yollarını seçebilirsiniz. En kısa kod kazanır.

Örnekler:

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


Ciddi anlamda? "Miktar"?
Peter Taylor

@PeterTaylor ne demek istiyorsun?
aditsu çıkmak SE çünkü EVIL

2
Thep probleminde insanlardan saymalarını istediğinizi biliyorsunuz. Bunun biraz iddiasız olduğunu düşünmüyor musunuz?
Peter Taylor

3
@PeterTaylor 10 basamaklı tabanları kullanırken bile basit sayım değil. En kısa kodda nasıl yapılacağını görmek istiyorum. Zor olması amaçlanmamıştır. Daha önemsiz sorular da gördüm ve bunun bir sorun olması gerektiğini düşünmüyorum.
aditsu bıraktı çünkü SE EVIL

Ayrıca, bunu uygulayabileceğim en az birkaç sorun var :)
aditsu çıkın çünkü SE EVIL

Yanıtlar:


4

APL (Dyalog Unicode) , 13 bayt SBCS

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

Çevrimiçi deneyin!

hiçbir zaman tarama kullanmak için bir fırsatı kaçırmayın :)

bir dizi "basamak" ister ve sonra n

nasıl etkinleştirmek için söylediğin için ADAM @ teşekkürler ]boxTIO üzerinde


5

Python 2, 56 bayt

nmaksimum uzunluktur ve skarakterlerin bir listesi olması beklenir. N = 0 veya boş bir karakter listesinin geçerli girişler olup olmadığı açık değildir , ancak bu işlev aynı zamanda bunları doğru şekilde işler.

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

4

J, 41 karakter

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

Kullanım: sol argüman dizedir ve sağ argüman sayıdır, şöyle:

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

Çıktı uzunluğa göre sıralanır, ancak uzunluk grupları içinde bir tane sola kaydırılır, bu en kolay olanıydı.

Açıklama:

  • ,/⍺∘{... }¨⍳⍵: 1..⍵ için ⍺ işlevini uygulayın ve sonuçları bir araya getirin.
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺: 1 - (⍵ = (geçerli uzunluk)) ^ (⍴⍺ = (karakter miktarı)) arasındaki her sayı için ⍵ basamaklarını kullanarak ⍴⍺ tabanına dönüştürün.
  • 1+: diziler 1 dizinli olduğu için bir tane ekleyin.
  • ⍺[... ]: bunları dizeye dizin olarak kullanın
  • ↓⍉: matrisi döndürün, böylece 'sayılar' sütunlar yerine satırlarda olur ve sonra matrisi satırlara böler.

1
APL'nin sembolleri için tek baytlık bir kodlaması var mı?
aditsu bıraktı çünkü SE EVIL

@aditsu: Dyalog APL Unicode kullanıyor, sanırım diğer tüm modern APL'ler de aynı şeyi yapıyor. Bununla birlikte, Unicode olmadan önce bir kod sayfası kullanırsınız, böylece mümkün olur.
marinus

Esas olarak soruyorum çünkü hayır konusunda endişeliyim. bayt ve no. karakter kümesi. APL'nin kaç farklı sembol kullandığını bilmiyorum.
aditsu bıraktı çünkü SE kötü

Biraz unutmadıkça veya yanlış saymadıkça, Dyalog APL'nin 7 bitlik ASCII ile birlikte bir bayta sığacak 74 işlev ve operatör karakteri vardır. Ayrıca, bu karakterler ile normal karakterler arasında bir miktar örtüşme var ?!/\-+*~&=,.|ve muhtemelen biraz daha fazla. Tek baytlı APL kodlamaları vardır, ancak Unicode'un kullanımı daha kolaydır.
marinus

3

Haskell, 34 karakter

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

Liste monadının doğrudan kullanımı. Tek gerçek golf mapMyerine replicateMithalat gerektiren daha deyimsel (ve daha kısa) yerine kullanımıdır Control.Monad.

kullanım

> "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 ve t aynı listeye işaret ettiği için kısaltılamaz .

Giriş: 'ab', 3

Çıktı:

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

kullanım

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'yı satın almadan çalıştırmak mümkün mü? Ayrıca, çıktıyı uzunluğa göre gruplandırılmaması için "düzleştirebilir" misiniz?
aditsu bırakıldı çünkü SE EVIL

Mathematica'yı satın almanız gerekiyor. (Prensip olarak, kod WolframAlpha.com'da test edilebilir, ancak bir nedenden dolayı bağlantı düzgün bir şekilde çalışmaz.)
DavidC

Mathematica satın alıyor musunuz? Üzgünüz, olmayacak: p Kod wolframalpha üzerinde değiştirilmemiş çalışmıyor, ancak önceki bağlantılarınızdan birinden bazı çıktılar görebiliyordum, bu yüzden yine de geçici olarak en kısa cevap olarak kabul ediyorum.
aditsu bıraktı çünkü SE kötü

2

MATL, 9 8 bayt

x:"1G@Z^

MATL Online'da deneyin!

(MATL, bu meydan okuma gönderildikten sonra oluşturuldu, ancak bu günlerde meta konsensüs ile tamam olduğuna inanıyorum.)

(@Luis Mendo sayesinde -1 bayt.)

x - dize girdisini yığından sil (otomatik olarak panoya G kopyalar)

:" - n sayısının örtülü girişi, 1'den n'ye döngü

1G - giriş dizesini yığındaki G panosundan geri yapıştırın

@ - geçerli döngü yineleme dizinini aktar

Z^- kartezyen güç: kendisi ile @kaç kez girdi içeren kartezyen ürün

Kartezyen güç sonuçları ( @verilen tabanda -digit "sayılar") yığın üzerinde toplanır ve sonunda dolaylı olarak görüntülenir.


1
1 byte ile tasarruf edebilirsinizx:"1G@Z^
Luis Mendo

@LuisMendo Güncellendi (sonunda!). Teşekkürler.
sundar - Monica

1

Python - 106

Basit, yaratıcı olmayan çözüm. Önemli gelişmeler görürseniz, lütfen ayrı bir yanıt olarak gönderin.

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

Giriş: "ab",3
Çıkış:

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

1

Python, 100

@ Aditsu'nun çözümünden türetilmiştir .

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

Giriş: 'ab', 3

Çıktı:

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


1

Pyth, 6 bayt

s^LQSE

Karakter kümesini 1. giriş, basamak sayısını 2. olarak bekler. İkinci girişe art arda erişmek için tek baytlık bir yöntem varsa bir bayt kaydedilebilir, ancak ...

Burada çevrimiçi deneyin .

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

Hiçbir fikrim yok ... Tembel hissediyorum.

<?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 birleştirici sürümü (kabuk için):

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)

Modül sürümü:

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

Karakterler zorunlu defter tutma olmadan sayılır (modül ve dışa aktarma).




0

Jöle , 6 bayt

WẋŒpƤẎ

Çevrimiçi deneyin!

Fonksiyon sunumu, ilk argüman olarak rakamlar listesi ve ikinci argüman olarak rakamların sayısı. Rakamların kendileri Jelly'in veri türlerinden herhangi biri olabilir, ancak yukarıdaki TIO bağlantısında tamsayılar kullandım çünkü Jelly'in otomatik “işlevi → tam ​​program” sarmalayıcısında en iyi görünen çıktıyı üretir.

açıklama

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

Kartezyen ürün, bize belirli sayıda basamak içeren tüm sayıları etkili bir şekilde verir (hangi önekle birlikte çalıştığımız). Biz (uzunluk göre gruplandırılmış) kombinasyonları listelerin bir liste ile sona ve gruplandırılmış olmayan bir listesini almak için o bir seviye dümdüz (ancak hangi hala edilir Yani sıralanmış soru gerektirdiği kadar, uzunluğu etmiyor öğelerin göreli sırasını değiştirmez ve Ƥönce daha kısa önekleri dener).


0

05AB1E , 6 bayt

「˜Ùé

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

ã         # 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 bayt alternatifi:

NOT: Esnek çıktı: Her biri aynı baskı hattında olmak üzere her uzunluk için yeni bir liste çıkarır.
Tek bir listeye dönüştürmek 2 bayt daha uzun olacaktır: Lv²yã`})( Çevrimiçi deneyin ).

Lv²yã?

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.