Math à Manhattan

12

Je définis les opérateurs suivants:

Manhattan Addition a + M b, pour les nombres à un chiffre, est le résultat de la concaténation de b sur a. Donc, a + M b = 10a + b. Par conséquent, l'opérateur général + M est défini comme suit:

a + M b = 10a + b

Manhattan La soustraction a - M b, pour les nombres à un chiffre, est le résultat de la suppression du dernier b de a. Par conséquent, l'opérateur - M est défini comme ainsi dans le pseudocode:

a - M b = a supprimer le dernier b

Manhattan Multiplication a × M b est le résultat du remplacement de toutes les instances de b dans a par b instances de b. Ergo, × M est défini dans le pseudocode comme:

a × M b = a -> s / b / <b copies de b> / g

La division Manhattan a ÷ M b est définie en termes de × M :

1 ÷ M b = le premier caractère de b
a ÷ M b = a × M (1 ÷ M b)

Avec tout cela à l'esprit, créez un interpréteur qui évaluera les expressions infixes qui utilisent les opérateurs suivants (c'est-à-dire a + b, pas a b +ou + a b)

+    Addition
-    Subtraction
/    Division
*    Multiplication
*M   Manhattan Multiplication
/M   Manhattan Division
+M   Manhattan Addition
-M   Manhattan Subtraction

Chaque opérateur de Manhattan a une priorité d'ordre supérieur à son homologue normal.

Cas de test:

> 5 +M 10 + 3
63      // 5*10 + 10 + 3 => 60 + 3
> 10 *M 2
10      // no 2s in 10
> 10 *M 1
10      // one 1 in 10 replaced once
> 23 *M 3
2333    // 23 has one 3, which is replaced with three 3s
> 23 *M 2
223     // 23 has one 2, which is replaced with two 2s
> 232 *M 2
22322   // 232 has two 2s, which are replaced with two 2s
> 232 *M 23
23...(23 times)...232   // ...
> 123 *M 2 * 3
3669    // 1223 * 3 => 3669
> 5 + 3 +M 2
37      // 5 + (3 +M 2) => 5 + 32 => 37
> 150 /M 3
150     // 150 ÷M 3 => 150 ×M 3 => 150
> 150 /M 53
1555550 // 150 ÷M 53 => 150 ×M 5 => 1555550
> 50 -M 0
5
> 500 -M 0
50
> 5234 -M 5
234
> 12 +M 633 *M 3
6333453 // = 12 +M 6333333 = 120 + 6333333 = 6333453

Il s'agit d'un , donc le programme le plus court en octets l'emporte.

Classements

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle de démarque suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

# Perl, 43 + 2 (-p flag) = 45 bytes

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Conor O'Brien
la source
13
Pourquoi utilisez-vous les symboles Unicode ×et ÷au lieu de ASCII *et /?
ASCIIThenANSI
1
Pourquoi est-ce 232 ×M 23égal 23232? Cela ne devrait-il pas être égal à 23 exemplaires 23suivis d'un 2?
senshin
1
@ASCIIThenANSI Je peux voir pourquoi vous avez demandé cela. Le choix est arbitraire. Sauf s'il y a un problème urgent avec mon choix, je ne pense pas que je vais le changer.
Conor O'Brien
4
Il est arbitrairement plus difficile pour les langues sans un bon support Unicode de participer, ce qui n'est pas très amusant, si le défi ne concerne pas Unicode.
Lynn du
2
Cette question n'a pas reçu suffisamment d'attention car elle n'est pas bien spécifiée. Vous définissez l'addition pour les nombres de chiffres sngle, puis votre premier exemple a 2 nombres de chiffres.
J'abandonne

Réponses:

5

Dyalog APL , 104 81 79 93 75 octets

Modifier: gère désormais 4342343 -M 3443423correctement.

M←{⍎(5|⌊⍺⍺2)⊃'⍺×M⍣(⍺≠1)⍎⊃b'(b⎕R(⍵⍴'&')⊢a)'10⊥⍺⍵'(('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)}

Contexte

Cela étend APL pour inclure l'opérateur de Manhattan. Un opérateur dans la terminologie APL est un modificateur de fonctions (par exemple ÷). Un exemple d'opérateur est celui qui modifie les fonctions pour permuter ainsi leurs arguments 3 = 2 ÷⍨ 6. De même, Mmodifie les fonctions arithmétiques de base pour être leurs parents à Manhattan. Notez que puisque la langue résultante est une extension d'APL, la stricte priorité de droite à gauche d'APL demeure.

Explication

La structure globale est M←{⍎(5|⌊⍺⍺2)⊃}qui applique la fonction ( +ou -ou ×ou ÷) à 2 et utilise le résultat pour choisir la chaîne à évaluer. Les chaînes sont les suivantes:

3 pour -M: (('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
 regex supprime la dernière occurrence de b (répétition de chaîne d'argument de droite) dans a (répétition de chaîne d'argument de gauche)

2 pour + M: '10⊥⍺⍵'
 évaluer les arguments en chiffres de base 10

1 pour × M: (b⎕R(⍵⍴'&')⊢a)
 remplacer les occurrences de b par b esperluettes (c.-à-d. Regex pour

0 pour ÷ M: le '⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃b premier chiffre de b
⍺×M⍣(⍺≠1) s'applique ⍺ × M si ⍺ ≠ 1

parmi les quatre chaînes ci-dessus, choisissez le numéro:

(5|⌊⍺⍺2)mod-5 du plancher de la fonction appliquée à 2, à savoir:
 3 = 5 | ⌊-2
 2 = 5 | ⌊+2
 1 = 5 | ⌊×2parce que × 2 ⇔ sgn (2) ⇔ 1
 0 = 5 | ⌊÷2parce que ÷ 2 ⇔ 1 ÷ 2 ⇔ 0,5

Un grand merci à mon cher ami ngn pour les copeaux incroyables.

Adam
la source
1
C'est bon. Cela correspond à ce que j'avais souhaité.
Conor O'Brien
Très bien, je modifierai le message alors.
2015
@ CᴏɴᴏʀO'Bʀɪᴇɴ J'ai peut-être perdu le bonus, mais c'est certainement le plus court maintenant.
Adám
oups, j'ai oublié celui-ci.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Oublié? Je viens d'éditer aujourd'hui, ce qui le rend plus court que celui accepté.
Adám
12

Perl, 100 99 98 octets

Code 97 octets + ligne de commande 1 octet

s/ |.*\K(\d)(\d*)-M\1|\+M/\2/g+s/(\d+)\*M(.)/$1=~s@$2@$&x$&@erg/e+s#/(M.)\d+#*\1#&&redo,$\=eval}{

Exemple d'utilisation:

echo "123 *M 2 * 3 + 150 /M 53" | perl -p entry.pl
Jarmex
la source
Si cela raccourcit votre code, vous n'avez qu'à utiliser *Mpour xMet /Mpour <div>M.
Conor O'Brien
Félicitations pour la générosité!
Conor O'Brien
7

Python, 644 octets

import operator as o,re
x,q,t,r,w='*/+-M';mm,md,ma,ms='*M /M +M -M'.split()
n=lambda x:x
a=lambda a,b:str(10*int(a)+int(b))
v=lambda a,b:a[::-1].replace(b,'',1)[::-1]
m=lambda a,b:a.replace(b,b*int(b))
d=lambda a,b:m(a,b[0])if a>0 else b[0]
def p(s):s=s.group();ss=s.split();l=s.split(ss[1]);h={mm:m,md:d,ma:a,ms:v,x:o.mul,q:o.div,t:o.add,r:o.sub}.get(ss[1],n);return str(h(*map(int if h in[o.mul,o.div,o.add,o.sub]else n,map(u,map(str.strip,l)))))
def u(s):z=r'\d+ (?:\{0}{2}|\{1}{2}) \d+';return re.sub(z.format(t,r,''),p,re.sub(z.format(t,r,w),p,re.sub(z.format(x,q,''),p,re.sub(z.format(x,q,w),p,re.sub(r'\((.*)\)',u,s)))))
print u(input())

Accepte les entrées sur STDIN (entourées de guillemets). Utilise l'expression régulière pour faire correspondre et analyser les opérations. Tout le travail est effectué sur des chaînes, et la conversion vers et depuis les entiers n'est utilisée que lors des opérations mathématiques normales.

Je suis sûr que cela pourrait être approfondi, donc je vais y travailler au cours des prochains jours.

Mego
la source
Je ne vois pas de cou f.
RK.