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.