Un sac , également appelé multiset, est une collection non ordonnée. Vous pouvez l'appeler un ensemble qui autorise les doublons, ou une liste (ou un tableau) qui n'est pas ordonnée / indexée. Dans ce défi, il vous est demandé de mettre en œuvre des opérations de sacs: addition, différence, multiplication, division, comptage et test d'égalité.
Les opérations
Les opérations spécifiées peuvent ne pas être conventionnelles.
- addition combine deux sacs en un, conservant le nombre total de chaque valeur
[1,2,2,3] + [1,2,4] = [1,1,2,2,2,3,4]
- la différence supprime d'un sac chaque élément d'un autre sac, ou ne fait rien si aucun de ces éléments
[1,2,2,4] - [1,2] = [2,4]
[1,2,3] - [2,4] = [1,3]
- la multiplication multiplie chaque élément du sac.
[1,2,3,3,4] * 3 = [1,1,1,2,2,2,3,3,3,3,3,3,4,4,4]
2 * [1,3] = [1,1,3,3]
- la division est rare: chaque élément n égal est placé dans n nouveaux sacs égaux, les éléments qui ne peuvent pas former un groupe n restent dans le sac. Retournez l'un des n nouveaux sacs.
[1,1,2,2,2] / 2 = [1,2]
[1,2,2,3,3,3] / 3 = [3]
- compter compter combien de sacs diviseurs peuvent être produits à partir du sac de dividendes
[1,1,2,2,2,2,3,3,3] c [1,2,3] = 2
- test d'égalité vérifie si deux sacs ont le même numéro de chaque élément
[1,2,2,3] == [3,2,1,2] = truthy
[1,2,3] == [1,2,2,3] = falsy
(peut également être utilisé=
pour cela)
Si vous utilisez vos propres symboles pour les opérateurs, veuillez préciser.
Les formats
Les sacs seront affichés sous forme de listes du formulaire [1,1,2,3,4]
. Vous pouvez utiliser n'importe quel autre support que les carrés, ou même utiliser des guillemets, ou rien du tout. Les éléments seront des entiers (mathématiquement, pas nécessairement int
) aux fins de cette question. Les sacs n'ont pas besoin d'être triés.
Le format d'entrée sera deux sacs ou un sac et un entier, avec un opérateur. Vous pouvez spécifier votre propre format tant qu'il contient ces trois formats.
Le format de sortie doit être un seul sac du même format.
Règles
- vous ne pouvez pas utiliser de fonctions, d'opérations ou de bibliothèques intégrées (y compris la bibliothèque standard) qui les mettent déjà en œuvre; il est cependant correct d'utiliser la concaténation et la multiplication de listes, car ce sont par définition des opérations de liste, et non des opérations de sac (qui font essentiellement la même chose)
- les échappatoires standard s'appliquent
- réponse la plus courte gagne
Cas de test
[1,2,2,3] + [1,2,4]
[1,1,2,2,2,3,4]
[1,2,2,4] - [1,2]
[2,4]
[1,2,3] - [2,4]
[1,3]
[1,2,3,3,4] * 3
[1,1,1,2,2,2,3,3,3,3,3,3,4,4,4]
2 * [1,3]
[1,1,3,3]
[1,1,2,2,2] / 2
[1,2]
[1,2,2,3,3,3] / 3
[3]
[1,1,2,2,2,2,3,3,3] c [1,2,3]
2
[3,2,1,2] == [1,2,2,3]
truthy
[1,2,3] == [1,2,2,3]
falsy
la source
Réponses:
05AB1E,
9287838277 octetsDivision par opération
Explication
Une addition
Mettez un sac dans un autre et aplatissez-les dans un sac.
Multiplication
Assurez-vous que le numéro est en haut de la pile. Appelez cela X.
Dupliquez le sac X fois et joignez-le à un sac.
Compter
Pour chaque élément du sac diviseur, comptez le nombre d'occurrences dans le sac de dividendes.
Le nombre minimum sera le nombre de sacs que nous pouvons faire.
Égalité
Triez les deux sacs et vérifiez s'ils sont égaux.
Division
Comptez le nombre de fois que chaque élément unique se produit dans le sac.
Si cela se produit au moins autant de fois que le diviseur. Gardez (nr_of_copies_total // divisor) des copies dans le sac.
Différence
Pour chaque élément du subtrahend, triez-le à l'avant du minuend.
Si le subtrahend actuel est égal au premier élément du minuend, supprimez-le du minuend.
la source
APL (155)
Ceci définit un
∆
«sac» d' opérateur , qui définit les opérations de sac pour des fonctions données. C'est à dire+∆
serait l'addition. Il lit ensuite une ligne du clavier et l'évalue comme une expression APL.Les fonctions sont:
+∆
, une addition-∆
, soustraction×∆
, multiplication÷∆
, division⊂∆
, en comptant≡∆
, équivalence (bien qu'en raison du golf, toute fonction non reconnue fera l'équivalence)Explication:
∆←{
...}
: définir un opérateur∆
:O←⍺⍺
: stocke la fonction donnée dansO
(⎕CR
ne fonctionnera pas⍺⍺
directement avec )O←⎕CR'O'
: obtenir la représentation sous forme de chaîne de cette fonction'+'=O
...:
: pour addition,⍺,⍵
: joindre les deux listes ensembleR[⍋R←
...]
: et trier le résultat'-'=O:
: pour la soustraction,⍺{
...}⍵
: exécutez la fonction récursive suivante:⍵≡⍬:⍺
: si le subtrahend est vide, retourne le minuend⍺/⍨(⍳⍴⍺)≢⍺⍳⊃⍵∇1↓⍵
: sinon, supprimez le premier élément du subtrahend du subtrahend et du minuend et réessayez(⍬=⍴⍵)∧K←'×'=O:
pour la multiplication, et si le bon argument n'est pas un sac:⍵/⍺
: réplique chaque élément de l'argument de gauche par l'argument de droiteK:
: ... et si le bon argument est un sac:⍺/⍵
: réplique chaque élément de l'argument de droite par l'argument de gauche (c'est pour que la multiplication soit commutative)'÷'=O:
: pour la division,⍵≤⍺∘.+⍺
: voir quels éléments dans ⍺ se produisent au moins ⍵ fois,⍺/⍨
: sélectionnez ceux parmi ⍺,∪
: et supprimez tous les doublons de cette liste'⊂'=O:
: pour compter,⍵{
...}⍺
: exécutez la fonction récursive suivante:(∪⍺)≢∪⍵:0
: si une liste contient des éléments que l'autre ne contient pas, le résultat est 01+⍺∇⍵-∆⍺
: sinon, soustrayez le dividende du diviseur, réessayez et incrémentez le résultat.⋄
: si rien de ce qui précède, faites le test d'équivalence:⍺[⍋⍺]≡⍵[⍋⍵]
: trier les deux listes et voir si elles sont égales⎕
: lire une expression à partir du clavier, l'évaluer et afficher le résultat.Cas de test:
la source
[2,2,2,2,2,2]/3
devrait donner[2,2]
, mais la vôtre semble donner[2]
.∆
, l'utilisateur sera vidé dans le REPL natif d'APL, où il∆
est maintenant valide. Je pense que vous pouvez économiser quelques octets en déplaçant la soustraction à la fin car c'est la seule qui nécessite deux lignes. Au lieu de⎕CR
, utilisez*
pour symboliser count, et faireO←⍺⍺2
, puis2=O:
pour plus,1=O
pour mult,0=O:
pour equiv,7<O:
pour count et0<O:
pour div (avec implicite0>O:
pour subtr).JavaScript (ES6), 260 octets
Prend 3 paramètres. Le premier paramètre est un tableau, le second est un opérateur, le troisième dépend de l'opérateur. Les sacs doivent contenir des entiers non négatifs.
Non golfé:
la source
Octave,
253244226 octetsCette fonction doit être dans un fichier. Pour écrire la fonction dans la fenêtre de commande, vous devez utiliser
endfunction
ouend
.Merci à Luis Mendo d' avoir économisé 18 octets.
Les opérations sont:
Exemple d'utilisation:
Non golfé:
la source
Mathematica,
387347300284 octetsLégèrement dégouliné (aka ancienne version), n'a pas eu un support complet pour les tests d'égalité (a retourné des valeurs véridiques, mais n'a pas été évalué pour les sacs non correspondants).
Implémente le type de données requis avec head
b
.Le premier
b
est défini comme étantOrderless
. Tout objet passé au noyau avec headb
triera automatiquement ses arguments. Donc, même s'ilb[3,2,1]
est tapé, l'évaluateur ne verra jamais rien d'autre queb[1,2,3]
.L'addition est trivialement définie comme joignant les éléments.
Une règle spéciale pour la différence de deux sacs est définie (expliquée ci-dessous). La version précédente avait un symbole auxiliaire pour les expressions de forme
-bag
.Ensuite, la multiplication (tant qu'il
n
s'agit d'un entier positif) est définie récursivement commen*b[...] = b[...] + (n-1)*b[...]
ce qui finira par se réduire à une simple somme.La règle spéciale pour
b[...] - b[...]
compter le nombre d'éléments distincts dans la somme des sacs et soustraire le sac à soustraire deux fois de ce résultat. Plus facile à expliquer:Ci-dessus est une liste de
Keys->Values
.KeyValueMap
avecTable
crée des listes de chaqueKey
Value
fois. (il y a aussiMax[...,0]
là pour ne pas tenter de créer des tables de longueur négatives). Cela se présente comme:qui est aplati et la tête
List
est remplacée parb
.La division par des nombres entiers est quelque peu similaire dans les fonctions utilisées, c'est simplement la division au sol des nombres d'éléments par le nombre entier.
Division par ensembles ou comptage, j'ai changé depuis l'implémentation d'origine. Il est maintenant récursivement effectué comme suit. Disons, nous divisons le sac
b1
parb2
(qui dans le code golfé sontc
eta
respectivement. Si(b1-b2) + b2 == b1
, alors ajoutez 1 et ajoutez à cela le résultat de la division(b1-b2)/b2
. Sinon, retournez 0 et quittez la récursivité.Si les sacs correspondent, la fonction intégrée
==
donneTrue
. La dernière ligne force unFalse
si ce n'est pas le cas.Cas de test:
la source
Q - 219 caractères
a
pour addition,s
pour différence (soustraction),m
pour multiplication,d
pour division,c
pour le comptage,e
pour l'égalité.L'algorithme d'addition est évident, il suffit de joindre les sacs.
La fonction de soustraction indexe dans le sac d'entrée (représenté sous forme de tableau) avec la plage d'index entière, à l'exception des premiers
n
indices de chaque classe d'équivalence formés par égalité à chaque élément dansy
, oùn
est le nombre de copies de ce représentant dansy
. La gestion des doublons possibles eny
fait un véritable monstre de fonction.La fonction de multiplication prend des
x
valeurs de chacuny
, dans le cas où ily
s'agit d'une valeur unique, au lieu d'un tableau, elle les réplique simplement.La fonction de division produit les valeurs dont le nombre dans le tableau est supérieur à
y
, puis supprime les doublons.La fonction de comptage calcule le nombre de chaque élément dans
y
, puis renvoie le minimum.Deux sacs sont égaux si leurs représentations matricielles triées sont égales.
la source
Ruby, réponse de définition de classe,
323291 octetsJe voulais surtout faire
Bag
une classe réelle en raison de la flexibilité de Ruby avec les classes. Dans ce cas, il hérite deArray
parce qu'il est plus court que d'avoir à initialiser un tableau interne et à traiter les autres choses.Je ferai probablement une réponse plus sérieuse au golf qui utilise une fonction pour gérer les opérations de demain. Je suis très fatigué et je me suis trop amusé avec ça
même si j'ai dû me débattre avec la définition de la classe numérique pour bienLOUANGEZ LA FONCTION COERCE POUR LA FAIRE.Number * Bag
travaillerEssayez-le en ligne! (L'espace blanc n'a pas d'importance dans Ruby, donc le code n'y est pas légèrement dissipé.)
la source
Rubis, 201 octets
Comme promis dans mon autre réponse, en voici une qui utilise des fonctions au lieu de construire une nouvelle classe. Je suis si près de franchir la barre des 200 octets ... Essayez-le en ligne
Celui-ci utilise les mêmes opcodes que @Neil dans sa réponse JavaScript, et le même ordre d'arguments (lhs, opcode, rhs)
Le code:
la source
C ++,
555551 octets(sauts de ligne ajoutés pour plus de lisibilité - seule la première nouvelle ligne est requise et comptée)
Explication
Nous implémentons notre sac comme une carte de (valeur, nombre). Les opérations de base peuvent être implémentées en manipulant les comptages; la soustraction et la division entière doivent également supprimer tous les éléments dont le nombre atteint zéro, de sorte que
std::map::operator==
cela fonctionne comme le test d'égalité.Le code développé suivant est une version générique de ce qui précède, beaucoup moins golfé: nous utilisons un séparé
s()
pour extraire toutes les valeurs de comptage nul, et nous implémentons desconst
opérations en termes d'opérateurs d'affectation de la manière idiomatique C ++. Nous utilisons égalements()
pour effectuer la multiplication en0
retournant un sac vraiment vide (testé en ajoutant(B{1}*0 != B{})
àmain()
); l'original échoue à ce test, et il n'est pas clair si c'est une exigence.Les tests
la source
Python 2.7 - 447B (taille de fichier)
Ceci est mon premier essai chez Codegolf, j'espère qu'il vous satisfera. J'avais besoin de 2h. (Mais je suis toujours un débutant à Python)
Edit: Merci à "Kevin Lau - pas Kenny" pour avoir souligné ceux-ci:
Edit: De plus, j'ai économisé de l'espace en remplaçant les fonctions par des lambdas et de nouvelles lignes et indentations par plus de points-virgules.
Code:
contrôles:
Production:
Je pourrais l'essayer une autre fois avec comme base un certain temps. Edit: je vais peut-être même essayer avec des fonctions uniquement.
la source
self
- quelque chose commeS
ferait aussi bien. Une autre astuce est que lasorted
fonction intégrée fait exactement ce que vous voulez de votre nouvelle fonctions
, vous pouvez donc renoncer à la définition de la fonction (car vous ne l'utilisez qu'une seule fois). Vous n'en avez jamais besoin__radd__
car vous n'ajoutez jamais de non-sacs avec des sacs, bien que vous en ayez toujours besoin__rmul__
. Enfin, vous n'avez besoin que d'un espace de retrait au lieu de quatre, ce qui réduit considérablement le nombre d'octets