Matematika di manhattan

12

Saya mendefinisikan operator berikut:

Manhattan Penambahan a + M b, untuk nomor satu digit, adalah hasil dari concatenating b ke a. Jadi, a + M b = 10a + b. Oleh karena itu, operator umum + M didefinisikan sebagai berikut:

a + M b = 10a + b

Manhattan Pengurangan a - M b, untuk nomor satu digit, adalah hasil dari menghapus yang terakhir b dari. Oleh karena itu, operator - M didefinisikan sebagai pseudocode:

a - M b = penghapusan terakhir b

Manhattan Perkalian × M b adalah hasil dari mengganti semua contoh b dalam dengan kasus b b. Ergo, × M didefinisikan dalam pseudocode sebagai:

a × M b = a -> s / b / <b salinan b> / g

Manhattan Divisi a ÷ M b didefinisikan dalam hal × M :

1 ÷ M b = karakter pertama dari b
a ÷ M b = a × M (1 ÷ M b)

Dengan semua ini dalam pikiran, buat juru bahasa yang akan mengevaluasi ekspresi infiks yang menggunakan operator berikut (yaitu a + b, tidak a b +atau + a b)

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

Setiap operator Manhattan memiliki prioritas lebih tinggi daripada rekan normal mereka.

Kasus uji:

> 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

Ini adalah , sehingga program terpendek dalam byte menang.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Conor O'Brien
sumber
13
Mengapa Anda menggunakan simbol Unicode ×dan ÷bukannya ASCII *dan /?
ASCIIThenANSI
1
Kenapa 232 ×M 23sama 23232? Bukankah seharusnya sama dengan 23 salinan 23diikuti oleh 2?
Senshin
1
@ ASCIIThenANSI Saya bisa melihat mengapa Anda bertanya itu. Pilihannya sewenang-wenang. Kecuali jika ada masalah mendesak dengan pilihan saya, saya tidak berpikir saya akan mengubahnya.
Conor O'Brien
4
Ini membuatnya lebih sulit untuk bahasa tanpa dukungan Unicode yang baik untuk berpartisipasi, yang tidak terlalu menyenangkan, jika tantangannya bukan tentang Unicode.
Lynn
2
Pertanyaan ini belum mendapat perhatian karena tidak ditentukan dengan baik. Anda menentukan tambahan untuk angka digit sngle, maka contoh pertama Anda memiliki 2 digit angka. Saya menyerah ...
edc65

Jawaban:

5

Dyalog APL , 104 81 79 93 75 byte

Sunting: Sekarang menangani 4342343 -M 3443423dengan benar.

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

Latar Belakang

Ini meluas APL untuk memasukkan operator Manhattan. Operator dalam terminologi APL adalah pengubah fungsi (misalnya ÷). Contoh dari operator adalah yang memodifikasi fungsi untuk bertukar argumen mereka 3 = 2 ÷⍨ 6. Demikian juga, Mmemodifikasi fungsi aritmatika dasar menjadi kerabat mereka di Manhattan. Perhatikan bahwa karena bahasa yang dihasilkan adalah perpanjangan APL, prioritas ketat ke kanan APL tetap.

Penjelasan

Struktur menyeluruh adalah M←{⍎(5|⌊⍺⍺2)⊃... }yang menerapkan fungsi ( +atau -atau ×atau ÷) ke 2 dan menggunakan hasilnya untuk memilih string mana yang akan dievaluasi. Senar adalah:

3 untuk -M: (('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
 remove regex kejadian terakhir b (.. Tali rep dari arg kanan) dalam sebuah (string rep dari arg kiri..)

2 untuk + M: '10⊥⍺⍵'
 mengevaluasi argumen sebagai basis-10 digit

1 untuk × M: (b⎕R(⍵⍴'&')⊢a)
 ganti kemunculan b dengan b ampersand (mis. Regex untuk

0 untuk ÷ M: '⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃b digit pertama dari b
⍺×M⍣(⍺≠1) berlaku ⍺ × M jika ⍺ ≠ 1

dari empat string di atas, pilih nomor:

(5|⌊⍺⍺2)mod-5 dari lantai fungsi diterapkan ke 2, yaitu:
 3 = 5 | ⌊-2
 2 = 5 | ⌊+2
 1 = 5 | ⌊×2karena × 2 ⇔ sgn (2) ⇔ 1
 0 = 5 | ⌊÷2karena ÷ 2 ⇔ 1 ÷ 2 ⇔ 0,5

Banyak terima kasih kepada teman saya ngn untuk serutan yang luar biasa.

Adm
sumber
1
Ini baik Ini sesuai dengan yang saya inginkan.
Conor O'Brien
Hebat, saya akan mengedit posting itu.
Adám
@ CᴏɴᴏʀO'Bʀɪᴇɴ Saya mungkin kehilangan bonus, tapi itu pasti yang terpendek sekarang.
Adám
oops, lupakan yang ini.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Lupa? Saya baru saja mengedit hari ini, membuatnya lebih pendek daripada yang diterima.
Adám
12

Perl, 100 99 98 byte

97 byte kode + 1 byte baris perintah

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

Contoh penggunaan:

echo "123 *M 2 * 3 + 150 /M 53" | perl -p entry.pl
Jarmex
sumber
Jika itu membuat kode Anda lebih pendek, Anda hanya perlu menggunakan *Muntuk xMdan /Muntuk <div>M.
Conor O'Brien
Selamat atas hadiahnya!
Conor O'Brien
7

Python, 644 byte

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

Menerima input pada STDIN (dibungkus dengan tanda kutip). Menggunakan regex untuk mencocokkan dan mengurai operasi. Semua pekerjaan dilakukan pada string, dan casting ke dan dari int hanya digunakan ketika melakukan operasi matematika normal.

Saya cukup yakin ini bisa golf lebih lanjut, jadi saya akan mengerjakannya selama beberapa hari ke depan.

Mego
sumber
Saya tidak melihat catau f.
RK.