Toán học trong manhattan


12

Tôi xác định các toán tử sau:

Bổ sung Manhattan a + M b, đối với các số có một chữ số, là kết quả của việc ghép b vào a. Vậy, a + M b = 10a + b. Do đó, toán tử chung + M được định nghĩa như sau:

a + M b = 10a + b

Phép trừ Manhattan a - M b, đối với các số có một chữ số, là kết quả của việc loại bỏ b cuối cùng khỏi a. Do đó, toán tử - M được định nghĩa như vậy trong mã giả:

a - M b = a loại bỏ b cuối cùng

Phép nhân Manhattan a × M b là kết quả của việc thay thế tất cả các thể hiện của b trong a bằng b thể hiện của b. Ergo, × M được định nghĩa trong mã giả là:

a × M b = a -> s / b / <b bản sao của b> / g

Phân khu Manhattan a M b được định nghĩa theo × M :

1 M b = ký tự đầu tiên của b
a ÷ M b = a × M (1 M b)

Với tất cả điều này, hãy tạo một trình thông dịch sẽ đánh giá các biểu thức infix sử dụng các toán tử sau (nghĩa là a + b, không a b +hoặc + a b)

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

Mỗi nhà khai thác Manhattan có quyền ưu tiên thứ tự cao hơn so với đối tác bình thường của họ.

Các trường hợp thử nghiệm:

> 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

Đây là một , vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng.

Bảng xếp hạng

Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:

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

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


13
Tại sao bạn sử dụng các ký hiệu Unicode ×÷thay vì ASCII */?
ASCIIThenANSI

1
Tại sao không 232 ×M 23bằng 23232? Không nên bằng 23 bản sao 23theo sau 2?
Senshin

1
@ASCIIThenANSI Tôi có thể thấy lý do tại sao bạn hỏi điều đó. Sự lựa chọn là tùy ý. Trừ khi có một số vấn đề cấp bách với lựa chọn của tôi, tôi không nghĩ rằng tôi sẽ thay đổi nó.
Conor O'Brien

4
Điều này khiến cho các ngôn ngữ khó có thể tham gia hỗ trợ Unicode tốt hơn, điều này không thú vị lắm, nếu thách thức không phải là về Unicode.
Lynn

2
Câu hỏi này đã không nhận được đủ sự quan tâm vì không được chỉ định rõ. Bạn xác định phép cộng cho số sngle chữ số, sau đó ví dụ đầu tiên của bạn có 2 chữ số. Tôi từ bỏ ...
edc65

Câu trả lời:


5

Thuốc nhuộm APL , 104 81 79 93 75 byte

Chỉnh sửa: Bây giờ xử lý 4342343 -M 3443423chính xác.

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

Lý lịch

Điều này mở rộng APL để bao gồm nhà điều hành Manhattan. Một toán tử trong thuật ngữ APL là một công cụ sửa đổi các chức năng (ví dụ ÷). Một ví dụ về toán tử là sửa đổi các hàm để hoán đổi các đối số của chúng 3 = 2 ÷⍨ 6. Cũng vậy, Msửa đổi các hàm số học cơ bản thành họ hàng Manhattan của họ. Lưu ý rằng vì ngôn ngữ kết quả là phần mở rộng của APL, quyền ưu tiên từ phải sang trái nghiêm ngặt của APL vẫn còn.

Giải trình

Cấu trúc tổng thể là M←{⍎(5|⌊⍺⍺2)⊃... }mà áp dụng các chức năng ( +hay -hay ×hay ÷) 2 và sử dụng kết quả để chọn mà chuỗi để đánh giá. Các chuỗi là:

3 cho -M: (('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
 regex loại bỏ sự xuất hiện cuối cùng của b (chuỗi đại diện của đối số phải.) Trong một (chuỗi đại diện của đối số bên trái.)

2 for + M: '10⊥⍺⍵'
 đánh giá các đối số dưới dạng 10 chữ số cơ bản

1 cho × M: (b⎕R(⍵⍴'&')⊢a)
 thay thế lần xuất hiện của b bằng b ampe (tức là regex cho

0 cho M: '⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃b chữ số đầu tiên của b
⍺×M⍣(⍺≠1) áp dụng ⍺ × M nếu ⍺ 1

trong số bốn chuỗi trên, chọn số:

(5|⌊⍺⍺2)mod-5 của sàn hàm áp dụng cho 2, cụ thể là:
 3 = 5 | ⌊-2
 2 = 5 | ⌊+2
 1 = 5 | ⌊×2vì × 2 sgn (2) 1
 0 = 5 | ⌊÷2vì ÷ 2 ⇔ 1 2 ⇔ 0,5

Rất cám ơn người bạn thân của tôi ngn cho những mảnh vụn tuyệt vời.


1
Điều này là tốt Nó phù hợp với những gì tôi đã mong muốn.
Conor O'Brien

Tuyệt, tôi sẽ chỉnh sửa bài viết.
Adám

@ CᴏɴᴏʀO'Bʀɪᴇɴ Tôi có thể đã mất tiền thưởng, nhưng chắc chắn là ngắn nhất bây giờ.
Adám

Rất tiếc, quên cái này
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Quên? Tôi chỉ chỉnh sửa ngày hôm nay, làm cho nó ngắn hơn so với chấp nhận.
Adám

12

Perl, 100 99 98 byte

Mã 97 byte + dòng lệnh 1 byte

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

Ví dụ sử dụng:

echo "123 *M 2 * 3 + 150 /M 53" | perl -p entry.pl

Nếu nó làm cho mã của bạn ngắn hơn, bạn chỉ phải sử dụng *Mcho xM/Mcho <div>M.
Conor O'Brien

Chúc mừng tiền thưởng!
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())

Chấp nhận đầu vào trên STDIN (được gói trong dấu ngoặc kép). Sử dụng regex để khớp và phân tích các hoạt động. Tất cả các công việc được thực hiện trên các chuỗi và việc truyền đến và từ int chỉ được sử dụng khi thực hiện các phép toán thông thường.

Tôi khá chắc chắn rằng điều này có thể được chơi gôn hơn nữa, vì vậy tôi sẽ làm việc với nó trong vài ngày tới.


Tôi không thấy một choặc f.
RK.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.