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


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:



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]

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

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.

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"]

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']

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


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.


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

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


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


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

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.

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




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


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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.