Problem Definition
Drucken Sie das Powerset eines bestimmten Sets aus. Beispielsweise:
[1, 2, 3] => [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
Jedes Element muss in einer separaten Zeile gedruckt werden, sodass das obige Beispiel wie folgt gedruckt wird:
[]
[1]
[2]
...
[1, 2, 3]
Beispielcode (in D, Python-Beispiel hier ):
import std.stdio;
string[][] powerset(string[] set) {
if (set.length == 1) {
return [set, []];
}
string[][] ret;
foreach (item; powerset(set[1 .. $])) {
ret ~= set[0]~item;
ret ~= item;
}
return ret;
}
void main(string[] argv) {
foreach (set; powerset(argv[1 .. $]))
writeln(set);
}
Eingang
Elemente werden als Argumente übergeben. Das oben angegebene Beispiel wird beispielsweise an ein Programm mit dem Namen powerset
:
powerset 1 2 3
Argumente sind alphanumerisch.
Regeln
- Keine Bibliotheken außer io
- Die Ausgabe muss nicht bestellt werden
- Powerset muss nicht gespeichert, sondern nur gedruckt werden
- Elemente in der Menge begrenzt werden muss ( zum Beispiel
1,2,3
,[1,2,3]
und['1','2','3']
akzeptabel sind, aber123
sind nicht- Nachgestellte Trennzeichen sind in Ordnung (zB
1,2,3, == 1,2,3
)
- Nachgestellte Trennzeichen sind in Ordnung (zB
- Der beste Wert wird anhand der Anzahl der Bytes ermittelt
Die beste Lösung wird mindestens 10 Tage nach der ersten Einreichung entschieden.
code-golf
array-manipulation
combinatorics
Beatgammit
quelle
quelle
lambda L:reduce(lambda r,x:r+[s+[x]for s in r],L,[[]])
.Antworten:
Mathematica 16
Code
Subsets
stammt aus Mathematica.Der Code (ohne Spalte) kann auf WolframAlpha überprüft werden . (Ich musste stattdessen Klammern verwenden
@
; sie bedeuten dasselbe.Verwendung
Diese Methode (55 Zeichen) verwendet den von @ w0lf vorgeschlagenen Ansatz.
Nervenzusammenbruch
Generieren Sie die Tupel, die aus
0
und1
s der Länge bestehenLength[s]
Multiplizieren Sie die ursprüngliche Liste (Vektor) mit jedem Tupel:
Löschen Sie die
0
.%
ist die Abkürzung für "die vorhergehende Ausgabe".% /. {0:> Sequenz []}
Anzeige in Spalte:
quelle
s
und die Eingabe am Ende der Zeile einfügen?Subsets/*Column
Erstellt eine anonyme Funktion, die eine Liste aufnimmt und die Anzeige in Spalten zurückgibt.C
118,115Zwar lassen sich mit einer einfacheren Formatierung ca. 20 Zeichen einsparen, aber Code-Golf gewinnt in keiner Weise.
Testen:
quelle
main(a,s)char**s;{...}
)f|=x&1<<i&&printf
ist kürzer als?:
.x+=2
(und wohins[0]
). Wirklich schöner Trick.GolfScript,
2218 ZeichenEin weiterer Versuch in GolfScript mit einem völlig anderen Algorithmus. Das Eingabeformat ist dasselbe wie bei der Antwort von w0lf. ( Online-Test )
quelle
GolfScript (43 Zeichen)
Dies mag recht lang erscheinen, aber es ist die erste Lösung, die der Spezifikation folgt: Die Eingabe erfolgt über Befehlszeilenargumente, und die Ausgabe wird durch Zeilenumbrüche getrennt.
Z.B
quelle
awk (82)
Nehmen Sie an, dass in der Datei powerset.awk die Verwendung gespeichert ist
ps Wenn Ihre awk nicht über die Funktion und () verfügt, ersetzen Sie sie durch
int(i/(2^j))%2
, addieren aber zwei zur Zählung.quelle
(2^j)
->2^j
spart Ihnen 2 Bytes; Die.awk
Datei funktioniert auch ohne Trailing\n
, so dass Sie ein weiteres Byte abschneiden können.JavaScript, 98
Leider wird ein guter Teil für die Ausgabeformatierung ausgegeben.
Eingang
Nimmt ein JavaScript-Array auf. (zB [1,2,3])
Ausgabe
quelle
Python (
74-70Zeichen)Für die Eingabe als
1,2,3
oder[1,2,3]
ist die Ausgabe:quelle
[a[0]]
=a[:1]
1,2,3
a[:1]
funktioniert nicht. Tupel + Liste nicht erlaubt. Existieren bessere Lösungi,*a=a
i,*a=a
Python 3? Es funktioniert nicht auf meinem 2.7.1.Python
7067 BytesDie Eingabe erfolgt auf die gleiche Weise wie für die ugorensche Lösung . Beispiel I / O:
quelle
def p(a,*v)
und dann speichernp(a[i:],n,*v)
. Die Ausgabe wird etwas hässlicher, aber immer noch in Ordnung.J, 19 Zeichen
Das ASCII-Boxing in der Ausgabe wird aufgerufen
boxing
und bietet eine heterogene Sammlung (hier für unterschiedliche Länge von Arrays).quelle
Golfscript 48
Dieses Programm verwendet die binären Darstellungen von Zahlen von 0 bis Länge (Eingabe), um Powerset-Elemente zu generieren.
Eingang
Das Eingabeformat ist das Golfscript Array - Format (Beispiel
[1 2 3]
)Ausgabe
Die Ausgabe ist eine Sammlung von Arrays, die durch Zeilenumbrüche getrennt sind und die eingestellte Leistung darstellen. Beispiel:
Online-Test
Das Programm kann hier online getestet werden .
quelle
Haskell
Wenn das Importieren
Control.Monad
nicht erlaubt ist, werden dies 100 Zeichen:quelle
Mathematica 53
quelle
APL (26)
Liest Eingaben von der Tastatur, da es keine
argv
Entsprechung gibt.Verwendung:
Erläuterung:
T←⎕
: Eingabe lesen, speichern inT
M←⍴T
: Speicherlänge vonT
inM
(M/2)⊤⍳2*M
: Erzeugt die Bitmuster für1
die2^M
Verwendung vonM
Bits.↓⍉
: Teilen Sie die Matrix so, dass jedes Bitmuster getrennt ist(/∘T)¨
: Wählen Sie für jedes Bitmuster die Unterelemente ausT
.↑⍕¨
: Rufen Sie für die Ausgabe die Zeichenfolgendarstellung jedes Elements ab (damit es mit Leerzeichen und nicht mit Nullen gefüllt wird) und formatieren Sie es als Matrix (damit sich jedes Element in einer eigenen Zeile befindet).quelle
Scala, 81
quelle
JavaScript ( ES6 ) 76
Teilweise kopiert von diesem: /codegolf//a/51502/21348
Die Verwendung einer Bitmap ist daher auf maximal 32 Elemente beschränkt.
Führen Sie das Snippet zum Testen in Firefox aus.
quelle
C # 164
Mann das ist schwer in C #!
quelle
Python 2, 64 Bytes
Kommagetrennte Eingabe verwenden:
Pyth, 4 Bytes (mit eingebautem) oder 14 Bytes (ohne)
Wie @Jakube in den Kommentaren angemerkt hat, ist Pyth für diese Frage zu aktuell. Hier noch eine Lösung mit Pyths eingebautem Powerset-Operator:
Und hier ist eine ohne es:
Sie können beide Lösungen hier und hier ausprobieren . Hier ist eine Erklärung der zweiten Lösung:
quelle
Brainfuck, 94 Bytes
Formatiert:
Erwartet die Eingabe des Formulars
9,10,11
ohne abschließende Zeilenumbrüche und gibt Teilmengen im gleichen Format aus, manchmal mit einem abschließenden Komma. Die erste gedruckte Zeile ist immer leer und kennzeichnet den leeren Satz.Probieren Sie es online aus.
Die Grundidee ist, ein Bit neben jedes Element zu setzen und dann die Binärzahl wiederholt zu erhöhen, während die entsprechende Teilmenge vor jedem Inkrement gedruckt wird. (Ein Bit zeigt an, ob sich ein Element in der Untermenge befindet.) Ein Sentinel-Bit links vom Array wird zum Beenden des Programms verwendet. Diese Version erstellt tatsächlich eine exponentielle Anzahl von Sentinels, um einige Bytes zu sparen. Eine effizientere 99-Byte-Lösung, die nur einen Sentinel verwendet, finden Sie im Revisionsverlauf.
Jedes Bit wird als Eins plus seinem Wert codiert. dh es kann entweder
1
oder sein2
. Das Band wird mit dem Bit vor jedem Element und einer einzelnen Nullzelle zwischen benachbarten Elementen ausgelegt. Das Komma ist auf dem Band für nicht endgültige Elemente enthalten, sodass wir bequem nur Elemente drucken können, ohne zusätzliche Arbeit im Umgang mit Begrenzern zu leisten.quelle
APL (Dyalog Classic) , 13 Byte
Probieren Sie es online!
Ausgabe:
Am Ende befindet sich eine leere Zeile, die die leere Menge darstellt.
Erläuterung:
⎕
ausgewertete Eingabe⎕,¨⊂⊂⍬
Fügen Sie nach jedem Element eine leere numerische Liste hinzu∘.,
kartesisches Produkt/
Reduktion (Foldr)⊃
offenlegen (notwendig nach APL-Reduktion)Zu diesem Zeitpunkt ist das Ergebnis ein n-dimensionales 2 × ... × 2-Array, wobei n die Länge der Eingabe ist.
,
Abflachen in einen Vektor⍪
Verwandeln Sie den Vektor in eine aufrechte 2 n- by-1-Matrix, sodass sich jede Teilmenge in einer separaten Zeile befindetquelle
Haskell ,
8078 BytesProbieren Sie es online!
quelle
Gelee , 6 Bytes
Probieren Sie es online!
ŒṘ€Y
sind Zeichenfolgenformatierungen.quelle
Python,
9387 ZeichenPython vereinfacht die Formatierung, da die erforderliche Eingabe / Ausgabe dem nativen Format entspricht.
Unterstützt nur Elemente, die Python-Literale sind (z . B.
1,2,'hello'
nicht1,2,hello
).Liest Standardeingabe, keine Parameter.
quelle
print f(input())
kürzerlist
kann in der Tat entfernt werden (wenn auch replacinf[[]]
mit[()]
.print'\n'.join(f(input()))
speichert zwei Zeichenf()
enthält Tupel, keine Zeichenfolgen.Rubin, 39
quelle
Haskell 89 Zeichen
Parameter zu bekommen ist lang: /
quelle
map(x:)(p y)++p y
und noch zwei Zeichen mehr mit abgeschabt werden[(x:),id]<*>p y
. Anscheinend<*>
ist jetzt im Prelude . (filterM
nicht).R 63
Hier,
v
stellt einen Vektor.Verwendung :
quelle
K, 14 Bytes
Generieren Sie alle 0/1-Vektoren so lange wie die Eingabe, erfassen Sie die Indizes von 1s und verwenden Sie diese, um Elemente aus dem Eingabevektor auszuwählen. In der Praxis:
Dies ist ein bisschen liberal mit den Ausgabeanforderungen, aber ich denke, es ist legal. Der fragwürdigste Teil ist, dass die leere Menge in einer typabhängigen Form dargestellt wird.
!0
So bezeichnet K einen leeren numerischen Vektor:Erläuterung
Das erzeugt
(#x)#2
einen Vektor, der2
so lang ist wie die Eingabe:Wenn monadisch
!
auf einen Vektor angewendet wird, handelt es sich um einen "Kilometerzähler":Dann verwenden wir "where" (
&
) für jeden ('
) Vektor, um seine Indizes zu erfassen. Der Doppelpunkt ist notwendig, um zwischen der monadischen und der dyadischen Form von zu unterscheiden&
:Wenn wir nur Kombinationsvektoren wollten, wären wir fertig, aber wir müssen diese als Indizes in der ursprünglichen Menge verwenden. Glücklicherweise kann der Indexierungsoperator von K
@
eine komplexe Struktur von Indizes akzeptieren und ein Ergebnis mit der gleichen Form erzeugen:Elegant, nein?
quelle
{x@&:'+!(#x)#2}
. Unabhängig: Ein kürzeres Äquivalent von(#x)#2
ist2|~x
.Mathematica, 51
Mehr Betrug:
Verwenden Sie mit
@{1,2,3}
.quelle
JavaScript (ES6), 68 Byte
Demo
Code-Snippet anzeigen
quelle
alert
?Brachylog , 4 Bytes
Probieren Sie es online!
quelle
Ruby Array Methodenkombination (ab 1.9) [50 Zeichen]
quelle