Générer des combinaisons ordonnées avec répétition

9

Étant donné une chaîne de caractères différents et un nombre n, générez toutes les combinaisons ordonnées avec répétition, de longueur 1 à n, en utilisant ces caractères.

Une autre façon de le définir est de voir les caractères donnés comme des chiffres "personnalisés" dans la base (radix) du nombre de caractères, puis le programme devrait générer tous les "nombres" avec 1 à n chiffres dans cette base, cependant, menant "zéros" sont également inclus.

Les combinaisons doivent être classées selon leur longueur (1 caractère en premier, puis 2, etc.), mais à part cela, elles peuvent être dans n'importe quel ordre. Vous pouvez choisir les moyens les plus pratiques de gérer les entrées et les sorties. Le code le plus court gagne.

Exemples:

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 quitte parce que SE est MAL
la source
Sérieusement? "Compter"?
Peter Taylor
@PeterTaylor que voulez-vous dire?
aditsu a quitté car SE est EVIL
2
Vous reconnaissez dans le problème p que vous demandez simplement aux gens de compter. Ne pensez-vous pas que c'est un peu ambitieux?
Peter Taylor
3
@PeterTaylor Eh bien, ce n'est pas simple de compter, même lorsque vous utilisez des chiffres de base 10. Je voudrais voir comment le faire dans le code le plus court. Ce n'est pas censé être difficile. J'ai également vu des questions plus triviales et je ne pense pas que cela devrait être un problème.
aditsu a quitté car SE est EVIL
De plus, il y a au moins quelques problèmes où je peux appliquer ceci :)
aditsu quitte car SE est EVIL

Réponses:

4

APL (Dyalog Unicode) , 13 octets SBCS

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

Essayez-le en ligne!

ne manquez jamais une occasion d'utiliser un scan :)

vous invite à saisir une chaîne de "chiffres", puis à n

merci @ Adám de m'avoir expliqué comment activer ]boxsur TIO

ngn
la source
5

Python 2, 56 octets

nest la longueur maximale et sdevrait être une liste de caractères. Il n'est pas clair pour moi si n = 0 ou une liste de caractères vide sont des entrées valides, mais cette fonction les gère également correctement.

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

J, 41 car

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

   'ab' f 3
a,b,aa,ab,ba,bb,aaa,aab,aba,abb,baa,bab,bba,bbb
randomra
la source
3

APL (31)

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

Utilisation: l'argument de gauche est la chaîne et l'argument de droite est le nombre, comme ceci:

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

La sortie est ordonnée par longueur, mais dans les groupes de longueurs, ils sont décalés d'un vers la gauche, c'était plus simple.

Explication:

  • ,/⍺∘{... }¨⍳⍵: pour 1..⍵, appliquez la fonction à ⍺ et joignez les résultats ensemble.
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺: pour chaque nombre de 1 à (⍵ = (longueur actuelle)) ^ (⍴⍺ = (quantité de caractères)), convertissez en base ⍴⍺ en utilisant ⍵ chiffres.
  • 1+: ajoutez-en un car les tableaux sont indexés sur 1.
  • ⍺[... ]: utilisez-les comme index dans la chaîne
  • ↓⍉: faites pivoter la matrice, de sorte que les «nombres» se trouvent sur les lignes plutôt que dans les colonnes, puis divisez la matrice en lignes.
marinus
la source
1
APL a-t-il un codage à un octet pour ses symboles?
aditsu a quitté car SE est EVIL
@aditsu: Dyalog APL utilise Unicode, je suppose que tous les autres APL modernes font de même. Cependant, avant qu'il y ait Unicode, vous utilisiez une page de code, donc c'est possible.
marinus
Je demande principalement parce que je m'inquiète pour non. d'octets vs no. de personnages. Je ne sais pas combien de symboles différents APL utilise.
aditsu quitte car SE est EVIL
À moins que j'en oublie certains ou que je les aie mal comptés, Dyalog APL a 74 caractères de fonction et d'opérateur, qui s'intégreraient parfaitement dans un octet avec ASCII 7 bits. Et il y a aussi un certain chevauchement entre ceux-ci et les personnages normaux comme ?!/\-+*~&=,.|et probablement plus. Il existe des codages APL à un octet, mais Unicode est plus facile à utiliser.
marinus
3

Haskell, 34 caractères

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

Utilisation simple de la monade de liste. Le seul vrai golf est l'utilisation mapMau lieu du plus idiomatique (et plus court) replicateMqui nécessiterait l'importation Control.Monad.

Usage

> "ab" % 3
["a","b","aa","ab","ba","bb","aaa","aab","aba","abb","baa","bab","bba","bbb"]
hammar
la source
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]ne peut pas être raccourci t+=[s]car L et t pointeraient vers la même liste.

Contribution: 'ab', 3

Production:

['a', 'b', 'aa', 'ab', 'ba', 'bb', 'aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bb
a', 'bbb']
tremblement de terre
la source
2

Mathematica 29 19 28

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

Usage

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
la source
Est-il possible d'exécuter cela sans acheter Mathematica? De plus, pourriez-vous "aplatir" la sortie afin qu'elle ne soit pas groupée par longueur?
aditsu a quitté car SE est EVIL
Vous devez acheter Mathematica. (En principe, le code peut être testé sur WolframAlpha.com, mais pour une raison quelconque, la liaison ne fonctionne pas correctement.)
DavidC
Acheter Mathematica? Désolé, cela ne se produira pas: p Le code ne fonctionne pas sans modification sur wolframalpha, mais je pourrais voir une sortie de l'un de vos liens précédents, donc de toute façon je l'accepte provisoirement comme la réponse la plus courte.
aditsu quitte car SE est EVIL
2

MATL, 9 8 octets

x:"1G@Z^

Essayez-le sur MATL Online!

(MATL a été créé après la publication de ce défi, mais je pense que c'est correct par le méta-consensus de nos jours.)

(-1 octets grâce à @Luis Mendo.)

x - supprimer l'entrée de chaîne de la pile (la copie automatiquement dans le presse-papiers G)

:" - entrée implicite du nombre n, boucle de 1 à n

1G - collez la chaîne d'entrée du presse-papiers G sur la pile

@ - pousser l'index d'itération de la boucle actuelle

Z^- pouvoir cartésien: produit d'entrée cartésien avec lui-même @nombre de fois

Les résultats de puissance cartésienne ( @-digit "nombres" dans la base donnée) sont accumulés sur la pile et affichés implicitement à la fin.

Sundar - Rétablir Monica
la source
1
Vous pouvez enregistrer 1 octet avecx:"1G@Z^
Luis Mendo
@LuisMendo Mis à jour (enfin!). Merci.
sundar
1

Python - 106

La solution simple et non créative. Si vous trouvez des améliorations significatives, veuillez poster une réponse séparée.

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

Entrée: "ab",3
Sortie:

a
b
aa
ba
ab
bb
aaa
baa
aba
bba
aab
bab
abb
bbb
aditsu quitte parce que SE est MAL
la source
1

Python, 100

Dérivé de la solution de @ 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

Contribution: 'ab', 3

Production:

b
a
ba
ab
bb
aa
baa
aba
bba
aab
bab
abb
bbb
aaa
2 tours
la source
1

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

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

Essayez-le en ligne!

-1 octet grâce à @Xcali !

Dom Hastings
la source
1
Vous pouvez enregistrer un octet en utilisant des virgules entre les éléments de sortie: Essayez-le en ligne!
Xcali
@Xcali Ah bon endroit, merci!
Dom Hastings
1

Pyth, 6 octets

s^LQSE

Attend le jeu de caractères comme 1ère entrée, le nombre de chiffres comme 2ème. Un octet pourrait être enregistré s'il existait une méthode à un octet pour accéder à plusieurs reprises à la 2e entrée, mais hélas ...

Essayez-le en ligne ici .

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
la source
1

Perl 6 , 33 octets

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

Essayez-le en ligne!

Bloc de code anonyme qui prend une chaîne et un nombre et renvoie une liste de chaînes.

Jo King
la source
0

PHP 180

Je n'en ai aucune idée ... je me sens paresseux.

<?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
la source
0

Erlang 110

La version combinateur Y (pour 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.
Hynek -Pichi- Vychodil
la source
0

Erlang 89 (118)

Version du module:

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

Caractères comptés sans comptabilité obligatoire (module et exportation).

Hynek -Pichi- Vychodil
la source
0

Gelée , 6 octets

WẋŒpƤẎ

Essayez-le en ligne!

Soumission de la fonction, en prenant la liste des chiffres comme premier argument et le nombre de chiffres comme deuxième. Les chiffres eux-mêmes peuvent être l'un des types de données de Jelly, mais j'ai utilisé des entiers dans le lien TIO ci-dessus car il produit la meilleure sortie dans le wrapper automatique «fonction → programme complet» de Jelly.

Explication

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

Le produit cartésien nous donne effectivement tous les nombres avec un nombre donné de chiffres (selon le préfixe avec lequel nous travaillons). Nous nous retrouvons donc avec une liste de listes de combinaisons (regroupées par longueur), et pouvons aplatir ce niveau afin d'obtenir une liste qui n'est pas groupée (mais qui est toujours triée par longueur, comme la question l'exige, comme ne le fait pas 'change pas l'ordre relatif des éléments et Ƥessaie d'abord des préfixes plus courts).

ais523
la source
0

05AB1E , 6 octets

「˜Ùé

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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

Alternative à 6 octets:

REMARQUE: sortie flexible: génère une nouvelle liste pour chaque longueur, le tout sur la même ligne d'impression.
Le convertir en une seule liste serait plus long de 2 octets: Lv²yã`})( Essayez-le en ligne ).

Lv²yã?

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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
la source