Generieren Sie geordnete Kombinationen mit Wiederholung


9

Generieren Sie mit einer Zeichenfolge aus verschiedenen Zeichen und einer Zahl n alle geordneten Kombinationen mit Wiederholung der Länge 1 bis n unter Verwendung dieser Zeichen.

Eine andere Möglichkeit, dies zu definieren, besteht darin, die angegebenen Zeichen als "benutzerdefinierte" Ziffern in der Basis (Radix) der Anzahl der Zeichen zu sehen. Das Programm sollte dann alle "Zahlen" mit 1 bis n Ziffern in dieser Basis generieren, jedoch führend "Nullen" sind ebenfalls enthalten.

Die Kombinationen sollten nach ihrer Länge geordnet sein (zuerst 1 Zeichen, dann 2 usw.), aber ansonsten können sie in beliebiger Reihenfolge sein. Sie können die bequemsten Methoden für die Verarbeitung von Ein- und Ausgaben auswählen. Der kürzeste Code gewinnt.

Beispiele:

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


Ernsthaft? "Anzahl"?
Peter Taylor

@ PeterTaylor was meinst du?
Aditsu beendet, weil SE am

2
Sie erkennen in dem Problem, dass Sie einfach die Leute zum Zählen auffordern. Findest du das nicht ein bisschen ehrgeizig?
Peter Taylor

3
@PeterTaylor Nun, es ist nicht einfach zu zählen, selbst wenn Basis-10-Ziffern verwendet werden. Ich würde gerne sehen, wie es im kürzesten Code geht. Es soll nicht schwierig sein. Ich habe auch trivialere Fragen gesehen und denke nicht, dass das ein Problem sein sollte.
Aditsu beendet, weil SE am

Darüber hinaus gibt es mindestens ein paar Probleme, bei denen ich dies anwenden kann :)
Aditsu beendet, weil SE am

Antworten:



5

Python 2, 56 Bytes

nist die maximale Länge und swird voraussichtlich eine Liste von Zeichen sein. Mir ist nicht klar, ob n = 0 oder eine leere Zeichenliste gültige Eingaben sind, aber diese Funktion behandelt sie auch korrekt.

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

4

J, 41 char

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

Verwendung: Das linke Argument ist die Zeichenfolge und das rechte Argument ist die Zahl wie folgt:

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

Die Ausgabe ist nach Länge geordnet, aber innerhalb der Längengruppen sind sie um eins nach links verschoben. Dies war am einfachsten.

Erläuterung:

  • ,/⍺∘{... }¨⍳⍵: Wenden Sie für 1..⍵ die Funktion auf ⍺ an und verbinden Sie die Ergebnisse.
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺: Konvertieren Sie für jede Zahl von 1 bis (⍵ = (aktuelle Länge)) ^ (⍴⍺ = (Anzahl der Zeichen)) mit ⍵ Ziffern in die Basis ⍴⍺.
  • 1+: füge eins hinzu, da Arrays 1-indiziert sind.
  • ⍺[... ]: Verwenden Sie diese als Indizes für die Zeichenfolge
  • ↓⍉: Drehen Sie die Matrix so, dass sich die 'Zahlen' in den Zeilen anstatt in den Spalten befinden, und teilen Sie die Matrix dann nach Zeilen auf.

1
Hat APL eine Einzelbyte-Codierung für seine Symbole?
Aditsu beendet, weil SE am

@aditsu: Dyalog APL verwendet Unicode, ich würde vermuten, dass alle anderen modernen APLs dasselbe tun. Bevor es jedoch Unicode gab, haben Sie eine Codepage verwendet, damit dies möglich ist.
Marinus

Ich frage hauptsächlich, weil ich mir Sorgen um nein mache. von Bytes vs Nr. von Zeichen. Ich weiß nicht, wie viele verschiedene Symbole APL verwendet.
Aditsu beendet, weil SE am

Wenn ich einige nicht vergessen oder falsch gezählt habe, verfügt Dyalog APL über 74 Funktions- und Operatorzeichen, die zusammen mit 7-Bit-ASCII in ein Byte passen würden. Und es gibt auch einige Überschneidungen zwischen diesen und normalen Charakteren wie ?!/\-+*~&=,.|und wahrscheinlich noch mehr. Es gibt Einzelbyte-APL-Codierungen, aber Unicode ist einfacher zu verwenden.
Marinus

3

Haskell, 34 Zeichen

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

Unkomplizierte Verwendung der Listenmonade. Das einzig wahre Golfen ist die Verwendung von mapManstelle der idiomatischeren (und kürzeren) replicateM, die importiert werden müssten Control.Monad.

Verwendungszweck

> "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]kann nicht verkürzt werden, t+=[s]da L und t auf dieselbe Liste zeigen würden.

Eingang: 'ab', 3

Ausgabe:

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

Verwendungszweck

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


Ist es möglich, dies auszuführen, ohne Mathematica zu kaufen? Könnten Sie die Ausgabe auch "reduzieren", damit sie nicht nach Länge gruppiert wird?
Aditsu beendet, weil SE am

Sie müssen Mathematica kaufen. (Im Prinzip kann der Code auf WolframAlpha.com getestet werden, aber aus irgendeinem Grund funktioniert die Verknüpfung nicht richtig.)
DavidC

Mathematica kaufen? Entschuldigung, das wird nicht passieren: p Der Code funktioniert auf wolframalpha nicht unverändert, aber ich konnte einige Ausgaben von einem Ihrer früheren Links sehen, daher akzeptiere ich ihn trotzdem vorläufig als die kürzeste Antwort.
Aditsu beendet, weil SE am

2

MATL, 9 8 Bytes

x:"1G@Z^

Probieren Sie es auf MATL Online aus!

(MATL wurde erstellt, nachdem diese Herausforderung veröffentlicht wurde, aber ich glaube, dass dies heutzutage durch Meta-Konsens in Ordnung ist.)

(-1 Bytes dank @Luis Mendo.)

x - Zeichenfolgeneingabe vom Stapel löschen (automatisch in die Zwischenablage G kopieren)

:" - implizite Eingabe der Nummer n, Schleife von 1 nach n

1G - Fügen Sie die Eingabezeichenfolge aus der Zwischenablage G in den Stapel ein

@ - Drücken Sie den aktuellen Schleifeniterationsindex

Z^- kartesische Macht: kartesisches Produkt der Eingabe mit sich selbst @mehrmals

Die kartesischen @Potenzergebnisse ( -stellige "Zahlen" in der angegebenen Basis) werden auf dem Stapel akkumuliert und am Ende implizit angezeigt.


1
Sie können 1 Byte mitx:"1G@Z^
Luis Mendo

@LuisMendo Aktualisiert (endlich!). Vielen Dank.
Sundar - Reinstate Monica

1

Python - 106

Die unkomplizierte, unkreative Lösung. Wenn Sie signifikante Verbesserungen feststellen, geben Sie diese bitte als separate Antwort an.

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

Eingabe: "ab",3
Ausgabe:

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

1

Python, 100

Abgeleitet von der Lösung von @ 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

Eingang: 'ab', 3

Ausgabe:

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


1

Pyth, 6 Bytes

s^LQSE

Erwartet den Zeichensatz als 1. Eingabe, die Anzahl der Ziffern als 2 .. Ein Byte könnte gespeichert werden, wenn es eine Einzelbyte-Methode gäbe, um wiederholt auf die zweite Eingabe zuzugreifen, aber leider ...

Probieren Sie es hier online aus .

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

Ich habe keine Ahnung ... Ich fühle mich faul.

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

Die Y-Kombinator-Version (für 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.

0

Erlang 89 (118)

Modulversion:

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

Gebühren ohne obligatorische Buchhaltung (Modul und Export) gezählt.




0

Gelee , 6 Bytes

WẋŒpƤẎ

Probieren Sie es online aus!

Funktionsübermittlung, wobei die Liste der Ziffern als erstes Argument und die Anzahl der Ziffern als zweites Argument verwendet werden. Die Ziffern selbst können beliebige Datentypen von Jelly sein, aber ich habe im obigen TIO-Link Ganzzahlen verwendet, da dies die bestaussehende Ausgabe in Jellys automatischem Wrapper "Funktion → Vollprogramm" erzeugt.

Erläuterung

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

Das kartesische Produkt gibt uns effektiv alle Zahlen mit einer bestimmten Anzahl von Ziffern (je nachdem, mit welchem ​​Präfix wir arbeiten). Wir erhalten also eine Liste von Kombinationslisten (nach Länge gruppiert) und können diese eine Ebene reduzieren , um eine Liste zu erhalten, die nicht gruppiert ist (die jedoch nach Länge sortiert ist , wie es die Frage erfordert, wie dies nicht der Fall ist) 'ändere nicht die relative Reihenfolge der Elemente und Ƥversuche zuerst kürzere Präfixe).


0

05AB1E , 6 Bytes

「˜Ùé

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

ã         # 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-Byte-Alternative:

HINWEIS: Flexible Ausgabe: Gibt für jede Länge eine neue Liste in derselben Druckzeile aus.
Das Konvertieren in eine einzelne Liste würde 2 Bytes länger dauern: Lv²yã`})( Online ausprobieren ).

Lv²yã?

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.