Dans ce défi, vous allez utiliser la distribution d' un produit sur des sommes et des différences de nombres, comme expliqué ici .
Exemples
Input | Output
-------------|-------------
23(12+42) | (23*12)+(23*42)
9(62-5) | (9*62)-(9*5)
4(17+8-14) | (4*17)+(4*8)-(4*14)
15(-5) | -(15*5)
2(3) | (2*3)
8(+18) | +(8*18)
8(-40+18) | -(8*40)+(8*18)
spécification
L'entrée sera une chaîne du formulaire n(_)
, avec un seul entier positif non signé n
suivi d'une expression entre parenthèses _
. Cette expression _
consistera en des sommes et en la différence d'un ou plusieurs termes entiers positifs séparés par des signes +
et -
. Le premier terme peut être précédé d'un +
signe, d'un -
signe ou d'aucun signe.
Dans la sortie, le nombre initial n
doit être distribué pour multiplier chacun des termes. Chaque terme de a
doit être multiplié n
à gauche par pour produire l'expression entre parenthèses (n*a)
, et ces nouveaux termes doivent être combinés avec +
et -
signe exactement de la même manière que les termes d'origine.
Entrées invalides
Ce sont des exemples d'entrées que vous n'avez pas à gérer.
3(5 plus 3)
6(5 13)
(5+8)(6+6)
(5+3)8
Gagnant
C'est le code-golf , donc le code le plus court en octets l'emporte.
la source
8(-40+18)
Réponses:
Pip, 28 octets
Explication:
Les objets Pattern de Pip suivent principalement la syntaxe des expressions rationnelles Python, mais le
&
modèle de remplacement est emprunté à sed.En savoir plus sur Pip dans le référentiel Github
la source
JavaScript 65 octets
Cela prendra l'entrée. Obtenez le + ou le -, puis les chiffres, puis remplacez-le dans le bon ordre.
Explication
Usage
Cela ne fonctionne que dans Firefox et Safari Nightly, peut-être Edge? car il utilise les fonctionnalités ES6. Vous pouvez l'exécuter par:
la source
(.?)(\d+)
est cassé. Cela échoue23(12+42)
, produisant1(23*2)+(23*42)
.\D?
pourrait être utilisé à la place de[+-]?
Python 2.7,
110108 octetsLe programme prend l'entrée de stdin, recherche les correspondances avec -
([+-]?)(\d+)
regex et crée la chaîne de sortie.Le tester -
la source
Rétine , 40 octets
Chaque ligne doit aller dans son propre fichier mais vous pouvez exécuter le code comme un seul fichier avec l'
-s
indicateur. Par exemple:Les deux premières lignes poussent le multiplicateur à côté de chaque nombre sous la forme attendue:
Les deux dernières lignes suppriment la partie arrière inutile:
la source
sed, 105 octets
Je voulais juste voir si cela pouvait être fait avec sed.
Peut-être un peu vieille école, mais ça marche.
la source
rs , 77 octets
Démo en direct et tous les cas de test.
C'est la première fois que les macros de rs sont réellement utilisées!
la source
REGXY , 45 octets
Utilise REGXY, un langage basé sur la substitution d'expression régulière.
la source
//
marche? Je suppose qu'il boucle en haut jusqu'à ce que la chaîne change, mais je ne trouve pas pourquoi dans la page esolang.//
crée pas une boucle infinie, carnothing
cela correspondra toujours, donc nous revenons toujours à la première ligne.Perl, 36 octets
Code de 35 octets + ligne de commande de 1 octet
Usage:
la source
Pyth,
3938 octetsUne terrible solution regex:
la source
Rubis, 94 octets
la source
CJam, 50 octets
Essayez-le en ligne
CJam ne prend pas en charge l'expression régulière, ni rien au-delà de la recherche et du fractionnement de chaînes, ce qui est très pratique pour l'analyse des expressions. Il y a donc du travail ici.
Explication:
la source
gawk -
6058Ouf ... n'a pas travaillé avec regexp depuis longtemps.
la source
Perl 5,
70605544 octets + 1 pénalitéUne solution Perl qui n'utilise que split et 1 expression régulière.
Calcule également les entrées les plus longues.
Tester
Une version qui prend un paramètre
Une version qui utilise uniquement des expressions régulières.
Celui-ci fonctionne via un groupe de capture dans un lookahead positif et une correspondance paresseuse. Aurait probablement utilisé un lookbehind positif si Perl 5 le soutenait, mais hélas. Cela m'a pris un certain temps pour comprendre que ce genre de chose est possible avec regex.
la source
-p
option de ligne de commande (je pense que c'est +1 caractère contre 9 pour,<>
et;print
) commesplit
cela fonctionnera$_
par défaut (qui sera tout ce qui est dedans<>
) et l'impression est également incluse dans la boucle ! J'espère que ça t'as aidé!Rétine ,
505143 octetsJe pense que c'est peut- être mon premier programme Retina. Sinon, c'est mon premier programme Retina qui est aussi complexe (pas si complexe, vraiment.) Chaque ligne va dans son propre fichier.
Je n'ai pas réellement testé cela avec Retina, je l'ai testé plusieurs fois à l'aide d'un testeur de remplacement de regex, mais cela devrait fonctionner.
Description du premier exemple:
Puisqu'il existe un nombre pair de fichiers, Retina utilise le mode de remplacement. Le premier remplacement (deux premiers fichiers) supprime un nombre à distribuer et ajoute cette paire de distribution
(23*12)
à la fin, en donnant23(+42)(23*12)
.+`
au début, dit à Retina de remplacer à plusieurs reprises jusqu'à ce que le motif ne corresponde pas, et puisque cela est à nouveau mis en correspondance, le motif le remplace par23()(23*12)+(23*42)
. Cela ne correspond plus, donc les 2 fichiers suivants sont utilisés pour le prochain remplacement. Cette fois, il supprime simplement le23()
. Cela fonctionne bien: comme les produits sont ajoutés à la fin, je n'ai rien à faire de bizarre si un numéro n'a pas de signe, car le seul qui peut être sans signe est le premier numéro.EDIT:
$'
en remplacement représente le reste de la chaîne après la correspondance, donc je peux supprimer les(.*)
s de fin .la source
k, 98 octets
Pas très golfé.
Séparer sur non numérique, supprimer les parenthèses, supprimer les chaînes vides, puis maintenir
x
constant comme première chaîne, combiner*
avec chaque chaîne restantey
, mettre entre parenthèses et déplacer le signe au début s'il est présent; aplatir la sortie en une seule chaîne.la source