Generuj uporządkowane kombinacje z powtórzeniami

9

Biorąc pod uwagę ciąg różnych znaków i liczbę n, wygeneruj wszystkie uporządkowane kombinacje z powtórzeniami, o długości od 1 do n, używając tych znaków.

Innym sposobem zdefiniowania tego jest widzenie podanych znaków jako „niestandardowe” cyfry w podstawie (podstawa) liczby znaków, wówczas program powinien wygenerować wszystkie „cyfry” z 1 do n cyfr w tej bazie, jednak wiodące Uwzględniono także „zera”.

Kombinacje należy uporządkować według długości (najpierw 1 znak, potem 2 itd.), Ale poza tym mogą być w dowolnej kolejności. Możesz wybrać najwygodniejsze sposoby obsługi danych wejściowych i wyjściowych. Najkrótszy kod wygrywa.

Przykłady:

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

aditsu przestało działać, ponieważ SE jest ZŁEM
źródło
Poważnie? "Liczyć"?
Peter Taylor
@PeterTaylor co masz na myśli?
aditsu zakończyło się, ponieważ SE to EVIL
2
W problemie p rozpoznajesz, że po prostu prosisz ludzi, aby policzyli. Czy nie uważasz, że to trochę mało ambitne?
Peter Taylor
3
@PeterTaylor Cóż, liczenie nie jest proste, nawet przy użyciu 10 cyfr podstawowych. Chciałbym zobaczyć, jak to zrobić w najkrótszym kodzie. To nie jest trudne. Widziałem też bardziej trywialne pytania i nie sądzę, że powinien to stanowić problem.
Aditsu zostało zakończone, ponieważ SE to EVIL
Co więcej, jest co najmniej kilka problemów, w których mogę to zastosować :)
aditsu zrezygnowało, ponieważ SE to EVIL

Odpowiedzi:

4

APL (Dyalog Unicode) , 13 bajtów SBCS

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

Wypróbuj online!

nigdy nie przegap okazji na skorzystanie ze skanu :)

monituje o ciąg „cyfr”, a następnie o n

dzięki @ Adám za informację, jak włączyć ]boxTIO

ngn
źródło
5

Python 2, 56 bajtów

njest maksymalną długością i spowinna być listą znaków. Nie jest dla mnie jasne, czy n = 0 lub pusta lista znaków są poprawnymi danymi wejściowymi, ale ta funkcja również obsługuje je poprawnie.

f=lambda s,n:n*s and s+[x+c for x in f(s,n-1)for c in s]
feersum
źródło
4

J, 41 znaków

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

   'ab' f 3
a,b,aa,ab,ba,bb,aaa,aab,aba,abb,baa,bab,bba,bbb
randomra
źródło
3

APL (31)

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

Zastosowanie: lewy argument jest ciągiem, a prawy argument jest liczbą:

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

Dane wyjściowe są uporządkowane według długości, ale w grupach długości są one przesunięte o jedną w lewo, co było najłatwiejsze.

Wyjaśnienie:

  • ,/⍺∘{... }¨⍳⍵: dla 1..⍵ zastosuj funkcję do ⍺ i połącz wyniki razem.
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺: dla każdej liczby od 1 do (⍵ = (aktualna długość)) ^ (⍴⍺ = (ilość znaków)), przekonwertuj na bazę ⍴⍺ za pomocą ⍵ cyfr.
  • 1+: dodaj jeden, ponieważ tablice są indeksowane 1.
  • ⍺[... ]: użyj ich jako indeksów w ciągu
  • ↓⍉: obróć macierz, aby „liczby” znajdowały się w wierszach zamiast w kolumnach, a następnie podziel macierz na rzędy.
marinus
źródło
1
Czy APL ma kodowanie jednobajtowe dla swoich symboli?
Aditsu zakończyło się, ponieważ SE to EVIL
@aditsu: Dyalog APL używa Unicode, domyślam się, że wszystkie inne współczesne APL robią to samo. Jednak zanim pojawił się Unicode, należy użyć strony kodowej, aby było to możliwe.
marinus
Pytam głównie, ponieważ martwię się o nie. bajtów vs nie. postaci. Nie wiem, ile różnych symboli używa APL.
Aditsu zakończyło się, ponieważ SE to EVIL
O ile nie zapomniałem niektórych lub błędnie policzyłem, Dyalog APL ma 74 znaki funkcji i operatora, które pasowałyby do bajtu razem z 7-bitowym ASCII. Jest też pewne nakładanie się tych i normalnych postaci, takich jak ?!/\-+*~&=,.|i prawdopodobnie jeszcze więcej. Istnieją jednobajtowe kodowania APL, ale Unicode jest łatwiejszy w użyciu.
marinus
3

Haskell, 34 znaki

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

Proste użycie monady listy. Jedynym prawdziwym golfem jest użycie mapMzamiast bardziej idiomatycznych (i krótszych), replicateMktóre wymagałyby importu Control.Monad.

Stosowanie

> "ab" % 3
["a","b","aa","ab","ba","bb","aaa","aab","aba","abb","baa","bab","bba","bbb"]
hammar
źródło
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]nie można go skrócić, t+=[s]ponieważ L i t wskazywałyby na tę samą listę.

Wejście: 'ab', 3

Wynik:

['a', 'b', 'aa', 'ab', 'ba', 'bb', 'aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bb
a', 'bbb']
trzęsienie ziemi
źródło
2

Mathematica 29 19 28

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

Stosowanie

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

DavidC
źródło
Czy można to uruchomić bez kupowania Mathematica? Czy możesz również „spłaszczyć” dane wyjściowe, aby nie były pogrupowane według długości?
Aditsu zakończyło się, ponieważ SE to EVIL
Musisz kupić Mathematica. (Zasadniczo kod można przetestować na WolframAlpha.com, ale z jakiegoś powodu linkowanie nie działa poprawnie.)
DavidC
Kup Mathematica? Przykro mi, ale się nie zdarzy: p Kod nie działa bez zmian na wolframalpha, ale mogłem zobaczyć dane wyjściowe z jednego z twoich wcześniejszych linków, więc i tak wstępnie akceptuję to jako najkrótszą odpowiedź.
Aditsu zostało zakończone, ponieważ SE to EVIL
2

MATL, 9 8 bajtów

x:"1G@Z^

Wypróbuj na MATL Online!

(MATL został stworzony po opublikowaniu tego wyzwania, ale sądzę, że w dzisiejszych czasach meta konsensus jest w porządku).

(-1 bajtów dzięki @Luis Mendo.)

x - usuń ciąg znaków ze stosu (automatycznie kopiuje go do schowka G)

:" - niejawne wprowadzenie liczby n, pętla od 1 do n

1G - wklej ciąg wejściowy ze schowka G na stosie

@ - przesuń aktualny wskaźnik iteracji pętli

Z^- moc kartezjański: iloczyn kartezjański wejścia ze sobą @kilka razy

Kartezjańskie wyniki mocy ( @„cyfry” w danej bazie) są gromadzone na stosie i domyślnie wyświetlane na końcu.

sundar - Przywróć Monikę
źródło
1
Możesz zapisać 1 bajt za pomocąx:"1G@Z^
Luis Mendo
@LuisMendo Zaktualizowano (w końcu!). Dzięki.
Sundar - Przywróć Monikę
1

Python - 106

Proste, nietwórcze rozwiązanie. Jeśli znajdziesz znaczące ulepszenia, prześlij jako osobną odpowiedź.

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

Wejście: "ab",3
Wyjście:

a
b
aa
ba
ab
bb
aaa
baa
aba
bba
aab
bab
abb
bbb
aditsu przestało działać, ponieważ SE jest ZŁEM
źródło
1

Python, 100

Pochodzi z rozwiązania @ 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

Wejście: 'ab', 3

Wynik:

b
a
ba
ab
bb
aa
baa
aba
bba
aab
bab
abb
bbb
aaa
2 obroty
źródło
1

Perl 5 + -nlF -M5.010 -MList::Util+(uniq), 41 bajtów

$,=$"=",";say grep/./,uniq glob"{,@F}"x<>

Wypróbuj online!

-1 bajt dzięki @Xcali !

Dom Hastings
źródło
1
Możesz zapisać bajt, używając przecinków między elementami wyjściowymi: Wypróbuj online!
Xcali,
@Xcali Ah dobre miejsce, dziękuję!
Dom Hastings
1

Pyth, 6 bajtów

s^LQSE

Oczekuje zestawu znaków jako pierwszego wejścia, a liczby cyfr jako drugiego. Bajt mógłby zostać zapisany, gdyby istniała metoda jednobajtowa pozwalająca na wielokrotny dostęp do 2. wejścia, ale niestety ...

Wypróbuj online tutaj .

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
Sok
źródło
1

Perl 6 , 33 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera ciąg i liczbę i zwraca listę ciągów.

Jo King
źródło
0

PHP 180

Nie mam pojęcia ... Czuję się leniwy.

<?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 ";}
jdstankosky
źródło
0

Erlang 110

Wersja kombinatora Y (dla powłoki):

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.
Hynek-Pichi- Vychodil
źródło
0

Erlang 89 (118)

Wersja modułu:

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

Znaki zliczane bez obowiązkowej księgowości (moduł i eksport).

Hynek-Pichi- Vychodil
źródło
0

Japt , 9 bajtów

Objaśnienia do naśladowania.

õ!àUçV)mâ

Spróbuj

õ_çV àZ â

Spróbuj

Kudłaty
źródło
0

Galaretka , 6 bajtów

WẋŒpƤẎ

Wypróbuj online!

Podanie funkcji, przyjmowanie listy cyfr jako pierwszego argumentu i liczby cyfr jako drugiego. Same cyfry mogą być dowolnymi typami danych Jelly, ale użyłem liczb całkowitych w powyższym linku TIO, ponieważ daje to najlepiej wyglądające wyjście w automatycznym opakowaniu Jelly „funkcja → pełny program”.

Wyjaśnienie

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

Produkt kartezjański skutecznie daje nam wszystkie liczby z określoną liczbą cyfr (zgodnie z jakim prefiksem pracujemy). Więc skończyć z listy wykazów połączeń (pogrupowane według długości) i można spłaszczyć, że jeden poziom w celu uzyskania listy, która nie jest zgrupowany (ale który wciąż klasyfikowane pod względem długości, jak wymaga kwestia, jak robi nie zmieniaj względnej kolejności elementów i Ƥnajpierw spróbuje użyć krótszych prefiksów).

ais523
źródło
0

05AB1E , 6 bajtów

「˜Ùé

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

ã         # 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-bajtowa alternatywa:

UWAGA: Elastyczne wyjście: Wyświetla nową listę dla każdej długości, wszystkie na tej samej linii wydruku.
Konwersja do pojedynczej listy byłaby 2 bajty dłuższa: Lv²yã`})( Wypróbuj online ).

Lv²yã?

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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)
Kevin Cruijssen
źródło