Mathe in Manhattan

12

Ich definiere folgende Operatoren:

Der Manhattan-Zusatz a + M b für einstellige Zahlen ist das Ergebnis der Verkettung von b mit a. Also ist a + M b = 10a + b. Daher ist der allgemeine Operator + M wie folgt definiert:

a + M b = 10a + b

Die Manhattan-Subtraktion a - M b für einstellige Zahlen ist das Ergebnis des Entfernens des letzten b von a. Daher ist der Operator - M wie folgt im Pseudocode definiert:

a - M b = a entferne letztes b

Manhattan-Multiplikation a × M b ist das Ergebnis des Ersetzens aller Instanzen von b in a durch b Instanzen von b. Ergo ist × M im Pseudocode definiert als:

a × M b = a -> s / b / <b Kopien von b> / g

Manhattan Division a ÷ M b ist definiert als × M :

1 ÷ M b = das erste Zeichen von b
a ≤ M b = a × M (1 ≤ M b)

Erstellen Sie vor diesem Hintergrund einen Interpreter, der Infix-Ausdrücke auswertet, die die folgenden Operatoren verwenden (dh a + bnicht a b +oder + a b).

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

Jeder Betreiber in Manhattan hat eine höhere Priorität als sein normales Gegenstück.

Testfälle:

> 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

Dies ist ein , also gewinnt das kürzeste Programm in Bytes.

Bestenlisten

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu erstellen.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

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

Conor O'Brien
quelle
13
Warum verwenden Sie die Unicode-Symbole ×und ÷anstelle von ASCII *und /?
ASCIIThenANSI
1
Warum macht 232 ×M 23gleich 23232? Sollte es nicht 23 Kopien von 23gefolgt von einem entsprechen 2?
Senshin
1
@ASCIIThenANSI Ich kann sehen, warum Sie das gefragt haben. Die Wahl ist beliebig. Ich glaube nicht, dass ich das ändern werde, es sei denn, es gibt ein dringendes Problem mit meiner Wahl.
Conor O'Brien
4
Dadurch wird es für Sprachen ohne gute Unicode-Unterstützung beliebig schwieriger, daran teilzunehmen. Dies macht keinen großen Spaß, wenn sich die Herausforderung nicht mit Unicode befasst.
Lynn
2
Diese Frage hat nicht genügend Beachtung gefunden, da sie nicht genau spezifiziert ist. Sie definieren einen Zusatz für Sngle-Ziffern, dann besteht Ihr erstes Beispiel aus 2 Ziffern. Ich gebe auf ...
edc65

Antworten:

5

Dyalog APL , 104 81 79 93 75 Bytes

Bearbeiten: Behandelt jetzt 4342343 -M 3443423richtig.

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

Hintergrund

Dies erweitert APL um den Manhattan-Betreiber. Ein Operator in der APL-Terminologie ist ein Modifikator für Funktionen (z ÷. B. ). Ein Beispiel für einen Operator ist das Ändern von Funktionen, um ihre Argumente so auszutauschen 3 = 2 ÷⍨ 6. So ist es auch, Mändert die grundlegenden arithmetischen Funktionen ihre Manhattan Verwandten zu sein. Da es sich bei der resultierenden Sprache um eine Erweiterung von APL handelt, bleibt die strikte Priorität von APL von rechts nach links erhalten.

Erläuterung

Die übergeordnete Struktur ist M←{⍎(5|⌊⍺⍺2)⊃…, }die die Funktion ( +oder -oder ×oder ÷) auf 2 anwendet und anhand des Ergebnisses auswählt, welcher String ausgewertet werden soll. Die Saiten sind:

3 für -M: (('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
 regex entferne das letzte Vorkommen von b (String-Repräsentation des rechten Arg.) In a (String-Repräsentation des linken Arg.)

2 für + M: '10⊥⍺⍵'
 Die Argumente werden als 10er-Basisziffern ausgewertet

1 für × M: (b⎕R(⍵⍴'&')⊢a)
 Ersetzen Sie Vorkommen von b durch b- kaufmännisches Und (dh Regex für die

0 für ÷ M: '⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃b erste Ziffer von b
⍺×M⍣(⍺≠1) gilt ⍺ × M, wenn ⍺ ⍺ 1

Wählen Sie aus den oben genannten vier Zeichenfolgen die Nummer aus:

(5|⌊⍺⍺2)mod-5 des Fußbodens der auf 2 angewendeten Funktion, nämlich:
 3 = 5 | ⌊-2
 2 = 5 | ⌊+2
 1 = 5 | ⌊×2weil × 2 ≤ sgn (2) ≤ 1
 0 = 5 | ⌊÷2weil ≤ 2 ≤ 1 ≤ 2 ≤ 0,5

Vielen Dank an meine liebe Freundin Ngn für die tollen Späne.

Adam
quelle
1
Das ist okay. Es passt zu dem, was ich mir gewünscht hatte.
Conor O'Brien
Toll, dann bearbeite ich den Beitrag.
Adám
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ich hätte den Bonus vielleicht verloren, aber er ist jetzt mit Sicherheit der kürzeste.
Adám
Hoppla, ich habe das vergessen.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Vergessen? Ich habe es heute gerade bearbeitet, wodurch es kürzer als das akzeptierte ist.
Adám
12

Perl, 100 99 98 Bytes

97 Byte Code + 1 Byte Befehlszeile

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

Anwendungsbeispiel:

echo "123 *M 2 * 3 + 150 /M 53" | perl -p entry.pl
Jarmex
quelle
Wenn es Ihren Code kürzer macht, müssen Sie nur *Mfür xMund /Mfür verwenden <div>M.
Conor O'Brien
Herzlichen Glückwunsch zu der Prämie!
Conor O'Brien
7

Python, 644 Bytes

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())

Akzeptiert Eingaben in STDIN (in Anführungszeichen eingeschlossen). Verwendet Regex, um Operationen abzugleichen und zu analysieren. Alle Arbeiten werden an Strings ausgeführt, und das Casting von und zu Ints wird nur bei normalen mathematischen Operationen verwendet.

Ich bin mir ziemlich sicher, dass dies weiter verbessert werden könnte, also werde ich in den nächsten Tagen daran arbeiten.

Mego
quelle
Ich sehe kein coder f.
RK.