Définition du problème
Imprimez le jeu de puissance d'un ensemble donné. Par exemple:
[1, 2, 3] => [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
Chaque élément doit être imprimé sur une ligne distincte, donc l'exemple ci-dessus serait imprimé comme suit:
[]
[1]
[2]
...
[1, 2, 3]
Exemple de code (en D, exemple python ici ):
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);
}
Contribution
Les éléments seront passés comme arguments. Par exemple, l'exemple fourni ci-dessus serait passé à un programme appelé powerset
comme:
powerset 1 2 3
Les arguments seront alphanumériques.
Règles
- Pas de bibliothèques à part io
- La sortie n'a pas besoin d'être commandée
- Le PowerSet ne doit pas être stocké, seulement imprimé
- Les éléments de l'ensemble doivent être délimités (par exemple
1,2,3
,[1,2,3]
et['1','2','3']
sont acceptables, mais123
ne sont pas- Les délimiteurs de fin sont corrects (par exemple
1,2,3, == 1,2,3
)
- Les délimiteurs de fin sont corrects (par exemple
- Le meilleur est déterminé en fonction du nombre d'octets
La meilleure solution sera décidée au moins 10 jours après la première soumission.
code-golf
array-manipulation
combinatorics
beatgammit
la source
la source
lambda L:reduce(lambda r,x:r+[s+[x]for s in r],L,[[]])
.Réponses:
Mathematica 16
Code
Subsets
est originaire de Mathematica.Le code (sans colonne) peut être vérifié sur WolframAlpha . (J'ai dû utiliser des crochets au lieu de
@
; ils signifient la même chose.Usage
Cette méthode (55 caractères) utilise l'approche suggérée par @ w0lf.
Panne
Générer les tuples, composés de
0
et1
de longueurLength[s]
Multipliez la liste d'origine (vecteur) par chaque tuple:
Supprimez les
0
.%
est un raccourci pour "la sortie précédente".% /. {0:> séquence []}
Afficher dans la colonne:
la source
s
et mettre l'entrée à la fin de la ligne?Subsets/*Column
crée une fonction anonyme qui prend une liste et renvoie l'affichage en colonnes.C,
118115Bien que vous puissiez enregistrer environ 20 caractères avec un formatage plus simple, vous ne gagnerez toujours pas en termes de golf.
Essai:
la source
main(a,s)char**s;{...}
),f|=x&1<<i&&printf
est plus court que?:
.x+=2
(et où ests[0]
allé). Truc vraiment sympa.GolfScript,
2218 caractèresUne autre tentative dans GolfScript avec un algorithme complètement différent. Le format d'entrée est le même qu'avec la réponse de w0lf. ( test en ligne )
la source
GolfScript (43 caractères)
Cela peut sembler assez long, mais c'est la première solution à suivre la spécification: l'entrée provient d'arguments de ligne de commande et la sortie est délimitée par des sauts de ligne.
Par exemple
la source
awk (82)
supposons enregistré dans le fichier powerset.awk, utilisation
ps si votre awk n'a pas la fonction and (), remplacez-la par
int(i/(2^j))%2
mais ajoutez deux au nombre.la source
(2^j)
->2^j
vous enregistre 2 octets; le.awk
fichier fonctionne également sans fin\n
, vous pouvez donc raser un autre octet.JavaScript, 98
Malheureusement, une bonne partie est dépensée pour le formatage de sortie.
Contribution
Prend un tableau JavaScript. (par exemple [1,2,3])
Sortie
la source
Python (
7470 caractères)pour l'entrée en tant que
1,2,3
ou[1,2,3]
, la sortie est:la source
[a[0]]
=a[:1]
1,2,3
a[:1]
ne fonctionne pas. tuple + liste non autorisé. Existe une meilleure solutioni,*a=a
i,*a=a
Python 3? Cela ne fonctionne pas sur mon 2.7.1.Python
7067 octetsL'entrée est prise de la même manière que pour la solution d' Ugoren . Exemple d'E / S:
la source
def p(a,*v)
puisp(a[i:],n,*v)
. La sortie devient un peu plus laide, mais reste OK.J, 19 caractères
La boxe ascii dans la sortie est appelée
boxing
et fournit une collection hétérogène (pour différentes longueurs de tableaux ici).la source
Golfscript 48
Ce programme utilise les représentations binaires de nombres de 0 à la longueur (entrée) pour générer des éléments d'ensemble de puissance.
Contribution
Le format d'entrée est le format de tableau Golfscript (exemple:
[1 2 3]
)Sortie
La sortie est une collection de tableaux séparés par des retours à la ligne, représentant l'ensemble de puissance. Exemple:
Test en ligne
Le programme peut être testé en ligne ici .
la source
Haskell (96)
Si l'importation
Control.Monad
n'est pas autorisée, cela devient 100 caractères:la source
Mathematica 53
la source
APL (26)
Lit l'entrée du clavier car il n'y a pas d'
argv
équivalent.Usage:
Explication:
T←⎕
: lire l'entrée, stocker dansT
M←⍴T
: Longueur du magasin deT
dansM
(M/2)⊤⍳2*M
: générer les modèles de bits pour1
jusqu'à2^M
utiliser desM
bits.↓⍉
: divise la matrice de sorte que chaque motif binaire soit séparé(/∘T)¨
: pour chaque motif binaire, sélectionnez ces sous-éléments dansT
.↑⍕¨
: pour la sortie, obtenez la représentation sous forme de chaîne de chaque élément (pour qu'il se remplisse en utilisant des blancs et non des zéros), et formatez-le comme une matrice (pour que chaque élément soit sur sa propre ligne).la source
Scala, 81
la source
JavaScript ( ES6 ) 76
Copié partiellement à partir de celui-ci: /codegolf//a/51502/21348
En utilisant un bitmap, il est donc limité à pas plus de 32 éléments.
Exécutez l'extrait dans Firefox pour tester.
la source
C # 164
Mec c'est dur en C #!
la source
Python 2, 64 octets
Utilisation d'une entrée séparée par des virgules:
Pyth, 4 octets (en utilisant la fonction intégrée) ou 14 octets (sans)
Comme indiqué par @Jakube dans les commentaires, Pyth est trop récent pour cette question. Voici encore une solution utilisant l'opérateur de jeu de puissance intégré de Pyth:
Et en voici un sans ça:
Vous pouvez essayer les deux solutions ici et ici . Voici une explication de la deuxième solution:
la source
brainfuck, 94 octets
Formaté:
Attend l'entrée du formulaire
9,10,11
sans retour à la ligne de fin et affiche des sous-ensembles dans le même format, parfois avec une virgule de fin. La première ligne imprimée sera toujours vide, signifiant l'ensemble vide.Essayez-le en ligne.
L'idée de base est de placer un peu à côté de chaque élément, puis d'incrémenter à plusieurs reprises le nombre binaire tout en imprimant le sous-ensemble correspondant avant chaque incrément. (Un bit indique si un élément est dans le sous-ensemble.) Un bit sentinelle à gauche du tableau est utilisé pour terminer le programme. Cette version crée en fait un nombre exponentiel de sentinelles pour économiser quelques octets; une solution de 99 octets plus efficace qui n'utilise qu'une seule sentinelle peut être trouvée dans l'historique des révisions.
Chaque bit est codé comme un plus sa valeur; c'est-à-dire qu'il peut être soit
1
ou2
. La bande est disposée avec le bit avant chaque élément et une seule cellule zéro entre les éléments adjacents. La virgule est incluse sur la bande pour les éléments non finaux, nous pouvons donc simplement imprimer les éléments sans faire de travail supplémentaire pour gérer les délimiteurs.la source
APL (Dyalog Classic) , 13 octets
Essayez-le en ligne!
Sortie:
Il y a une ligne vierge à la fin pour représenter l'ensemble vide.
Explication:
⎕
entrée évaluée⎕,¨⊂⊂⍬
ajouter une liste numérique vide après chaque élément∘.,
produit cartésien/
réduction (foldr)⊃
divulguer (nécessaire après réduction de l'APL)À ce stade, le résultat est un tableau n-dimensionnel 2 par -...- par-2, où n est la longueur de l'entrée.
,
aplatir en vecteur⍪
transformer le vecteur en une matrice verticale de 2 n -par-1, de sorte que chaque sous-ensemble se trouve sur une ligne distinctela source
Haskell ,
8078 octetsEssayez-le en ligne!
la source
Gelée , 6 octets
Essayez-le en ligne!
ŒṘ€Y
sont le formatage de chaînes.la source
Python,
9387 caractèresPython simplifie le formatage, car l'entrée / sortie requise correspond à son format natif.
Ne prend en charge que les éléments qui sont des littéraux Python (par exemple
1,2,'hello'
, pas1,2,hello
).Lit l'entrée standard, pas les paramètres.
la source
print f(input())
plus courtlist
peut en effet être supprimé (s'il est également remplacé[[]]
par[()]
.print'\n'.join(f(input()))
saves two charactersf()
contains tuples, not strings.Ruby, 39
la source
Haskell 89 chars
Getting parameters is long :/
la source
map(x:)(p y)++p y
and yet two more chars above that with[(x:),id]<*>p y
. Apparently<*>
is in the Prelude now. (filterM
isn't).R, 63
Here,
v
represents a vector.Usage:
la source
K, 14 bytes
Generate all 0/1 vectors as long as the input, gather the indices of 1s and use those to select elements from the input vector. In practice:
C'est un peu libéral avec les exigences de sortie, mais je pense que c'est légal. La partie la plus discutable est que l'ensemble vide sera représenté sous une forme dépendante du type;
!0
est la façon dont K désigne un vecteur numérique vide:Explication
Le
(#x)#2
construit un vecteur2
aussi long que l'entrée:Quand monadique
!
est appliqué à un vecteur, c'est "odomètre":Ensuite, nous utilisons "where" (
&
) sur chaque'
vecteur ( ) pour rassembler ses indices. Le côlon est nécessaire pour lever l'ambiguïté entre la forme monadique et dyadique de&
:Si nous voulions simplement des vecteurs de combinaison, nous aurions terminé, mais nous devons les utiliser comme indices dans l'ensemble d'origine. Heureusement, l'opérateur d'indexation de K
@
peut accepter une structure complexe d'indices et produira un résultat avec la même forme:Élégant, non?
la source
{x@&:'+!(#x)#2}
. Sans rapport: un équivalent plus court de(#x)#2
is2|~x
.Mathematica, 51
Plus de tricherie:
À utiliser avec
@{1,2,3}
.la source
JavaScript (ES6), 68 bytes
Demo
Show code snippet
la source
alert
?Brachylog, 4 bytes
Try it online!
la source
Ruby Array method combination (from 1.9 ) [50 chars]
la source