คณิตศาสตร์ในแมนฮัตตัน


12

ฉันกำหนดผู้ประกอบการต่อไปนี้:

Manhattan Addition a + M b สำหรับตัวเลขหลักเดียวเป็นผลมาจากการต่อ b เข้ากับ a ดังนั้น + M b = 10a + b ดังนั้นตัวดำเนินการทั่วไป + Mจึงถูกกำหนดดังนี้:

a + M b = 10a + b

การลบแมนฮัตตัน a - M b สำหรับตัวเลขหลักเดียวเป็นผลมาจากการลบ b สุดท้ายออกจาก ดังนั้นโอเปอเรเตอร์ - Mถูกกำหนดไว้ใน pseudocode:

a - M b = a ลบล่าสุด

การคูณแมนฮัตตัน a × M b เป็นผลลัพธ์ของการแทนที่อินสแตนซ์ทั้งหมดของ b ใน a ด้วย b อินสแตนซ์ของ b Ergo, × Mถูกกำหนดใน pseudocode เป็น:

a × M b = a -> s / b / <b สำเนา b> / g

แผนกแมนฮัตตัน a ÷ M b ถูกกำหนดในแง่ของ× M :

1 ÷ M b = อักขระตัวแรกของ b
a ÷ M b = a × M (1 ÷ M b)

เมื่อนึกถึงทั้งหมดนี้ให้สร้างล่ามที่จะประเมินนิพจน์มัดที่ใช้ตัวดำเนินการต่อไปนี้ (เช่นa + bไม่ใช่a b +หรือ+ a b)

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

ผู้ประกอบการแมนฮัตตันแต่ละรายมีลำดับความสำคัญสูงกว่าคู่ปกติ

กรณีทดสอบ:

> 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

นี่คือดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ

ลีดเดอร์

นี่เป็นตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวได้ ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของสองไฟล์หรือคุณต้องการแสดงรายการการลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

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


13
ทำไมคุณกำลังใช้สัญลักษณ์ Unicode ×และ÷แทน ASCII *และ/?
ASCIIThenANSI

1
ทำไมไม่232 ×M 23เท่ากัน23232? ไม่ควรเท่ากับ 23 สำเนา23ตามด้วย2?
เซนชิน

1
@ ASCIIThenANSI ฉันเห็นว่าทำไมคุณถึงถามอย่างนั้น ทางเลือกคืออะไรก็ได้ หากไม่มีปัญหาเรื่องการกดที่ฉันเลือกฉันไม่คิดว่าฉันจะเปลี่ยนมัน
Conor O'Brien

4
มันทำให้ยากขึ้นโดยพลการสำหรับภาษาที่ไม่มี Unicode ที่ดีในการเข้าร่วมซึ่งไม่สนุกมากหากความท้าทายไม่ได้เกี่ยวกับ Unicode
ลินน์

2
คำถามนี้ยังไม่ได้รับความสนใจเพียงพอเนื่องจากไม่ได้ระบุไว้อย่างดี คุณกำหนดการเพิ่มสำหรับตัวเลข sngle จากนั้นตัวอย่างแรกของคุณจะมีตัวเลข 2 หลัก ฉันยอมแพ้ ...
edc65

คำตอบ:


5

Dyalog APL , 104 81 79 93 75 ไบต์

แก้ไข:ตอนนี้จัดการ4342343 -M 3443423ถูกต้อง

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

พื้นหลัง

สิ่งนี้ขยาย APL เพื่อรวมผู้ประกอบการแมนฮัตตัน โอเปอเรเตอร์ในศัพท์ APL เป็นตัวดัดแปลงของฟังก์ชั่น (เช่น÷) ตัวอย่างของโอเปอเรเตอร์คือการปรับเปลี่ยนฟังก์ชันเพื่อสลับอาร์กิวเมนต์ของ3 = 2 ÷⍨ 6มัน ดังนั้นMปรับเปลี่ยนฟังก์ชันทางคณิตศาสตร์พื้นฐานให้เป็นญาติของแมนฮัตตัน โปรดทราบว่าเนื่องจากภาษาที่เป็นผลลัพธ์เป็นส่วนขยายของ APL ความสำคัญที่เข้มงวดจากขวาไปซ้ายของ APL ยังคงอยู่

คำอธิบาย

โครงสร้างการครอบคลุมคือM←{⍎(5|⌊⍺⍺2)⊃... }ซึ่งใช้ฟังก์ชัน ( +หรือ-หรือ×หรือ÷) กับ 2 และใช้ผลลัพธ์เพื่อเลือกสตริงที่จะประเมิน สตริงคือ:

3 -M: (('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
 regex ลบเกิดขึ้นครั้งล่าสุดของ (.. สตริงตัวแทนของหาเรื่องขวา) ใน(สตริงตัวแทนของหาเรื่องซ้าย..)

2 สำหรับ + ​​M: '10⊥⍺⍵'
 ประเมินอาร์กิวเมนต์เป็นตัวเลขฐาน 10

1 สำหรับ× M: (b⎕R(⍵⍴'&')⊢a)
 แทนที่การเกิดขึ้นของbด้วยเครื่องหมายแอมเปอร์แซนด์b (เช่น regex สำหรับ

0 สำหรับ÷ M: '⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃bตัวเลขตัวแรกของb
⍺×M⍣(⍺≠1)ใช้⍺× M ถ้า⍺≠ 1

จากสี่สายข้างต้นเลือกหมายเลข:

(5|⌊⍺⍺2)mod-5 ของพื้นของฟังก์ชันที่ใช้กับ 2 คือ:
 3 = 5 | ⌊-2
 2 = 5 | ⌊+2
 1 = 5 | ⌊×2เพราะ× 2 ⇔ sgn (2) ⇔ 1
 0 = 5 | ⌊÷2เพราะ÷ 2 ⇔ 1 ÷ 2 ⇔ 0.5

ขอบคุณมากสำหรับเพื่อนรักของฉันสำหรับการโกนที่น่าทึ่ง


1
นี่เป็นเรื่องปกติ มันเหมาะกับสิ่งที่ฉันต้องการ
Conor O'Brien

เยี่ยมมากฉันจะแก้ไขโพสต์แล้ว
58

@ CᴏɴᴏʀO'Bʀɪᴇɴฉันอาจพลาดโบนัส แต่ตอนนี้มันสั้นที่สุดแล้ว
Adám

โอ๊ะลืมเรื่องนี้
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴลืม? ฉันเพิ่งแก้ไขวันนี้ทำให้สั้นกว่าที่ยอมรับ
Adám

12

Perl, 100 99 98 ไบต์

รหัส 97 ไบต์ + 1 บรรทัดคำสั่งไบต์

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

ตัวอย่างการใช้งาน:

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

ถ้ามันทำให้รหัสของคุณสั้นคุณจะต้องใช้*MสำหรับxMและสำหรับ/M <div>M
Conor O'Brien

ขอแสดงความยินดีกับรางวัล!
Conor O'Brien

7

Python 644 ไบต์

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

ยอมรับอินพุตบน STDIN (อยู่ในเครื่องหมายคำพูด) ใช้ regex เพื่อจับคู่และแยกวิเคราะห์การดำเนินงาน งานทั้งหมดทำบนสายอักขระและการส่งไปยังและจาก ints จะใช้เมื่อทำการดำเนินการทางคณิตศาสตร์ปกติเท่านั้น

ฉันค่อนข้างแน่ใจว่านี่จะสามารถเล่นกอล์ฟต่อไปได้ดังนั้นฉันจะพยายามแก้ไขเรื่องนี้ในอีกไม่กี่วันข้างหน้า


ฉันไม่เห็นหรือc f
RK
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.