Manhattan'da Matematik


12

Aşağıdaki operatörleri tanımlarım:

Manhattan eklenmesi , a + K b tek haneli sayılar için bir üzerine b bitiştirme sonucudur. Yani, a + M b = 10a + b. Bu nedenle, genel operatör + M şu şekilde tanımlanır:

a + M b = 10a + b

Manhattan Çıkarma a - E b tek haneli sayılar için bir son b kaldırma sonucudur. Bu nedenle, - M operatörü sözde kodda şu şekilde tanımlanır:

a - M b = a son b'yi kaldır

Manhattan Çarpma bir x M , b, b örnekleri ile de b tüm örneklerini yerine sonucudur. Ergo, × M sözde kodunda şu şekilde tanımlanır:

a × M b = a -> s / b / <b b> / g kopyası

Manhattan Küme bir ÷ M x B cinsinden tanımlanır M :

1 ÷ M b = b'nin ilk karakteri
a ÷ M b = a × M (1 ÷ M b)

Tüm bunları göz önünde bulundurarak, aşağıdaki işleçleri kullanan (yani, ya da a + bdeğil ) infix ifadelerini değerlendirecek bir yorumlayıcı oluşturuna b ++ a b

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

Her Manhattan operatörü, normal muadillerinden daha yüksek bir sıra önceliğine sahiptir.

Test senaryoları:

> 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

Bu bir , bu yüzden bayttaki en kısa program kazanıyor.

Liderler

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra skor tablosu snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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


13
Neden Unicode sembollerini ×ve ÷ASCII *ve yerine kullanıyorsunuz /?
ASCIIThenANSI

1
Neden 232 ×M 23eşit 23232? 23 kopya ve 23ardından a ile eşit olmamalı mı 2?
senshin

1
@ASCIIThenANSI Bunu neden sorduğunu görebiliyorum. Seçim keyfidir. Seçimimle ilgili bazı acil sorunlar olmadıkça, değiştireceğimi sanmıyorum.
Conor O'Brien

4
Zorlu Unicode ile ilgili değilse, iyi Unicode desteği olmayan diller için katılımı keyfi olarak zorlaştırır .
Lynn

2
Bu soru, yeterince iyi tanımlanmadığı için yeterince ilgi görmemiştir. Tek haneli rakamlar için toplama tanımlarsınız, ardından ilk örneğinizde 2 rakam bulunur. Ben pes ediyorum ...
edc65

Yanıtlar:


5

Dyalog APL , 104 81 79 93 75 bayt

Düzenleme: Şimdi 4342343 -M 3443423doğru şekilde işler .

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

Arka fon

Bu APL'yi Manhattan operatörünü içerecek şekilde genişletir. APL terminolojisindeki bir operatör fonksiyonların değiştiricisidir (örn. ÷). Bir işleç örneği, işlevlerini bağımsız değişkenlerini değiştirecek şekilde değiştiren bir işleçtir 3 = 2 ÷⍨ 6. Aynı Mzamanda temel aritmetik işlevleri Manhattan'ın akrabaları olacak şekilde değiştirir. Ortaya çıkan dil APL'nin bir uzantısı olduğundan, APL'nin sağdan sola kesin önceliğinin devam ettiğini unutmayın.

açıklama

Kapsayıcı bir yapıdır M←{⍎(5|⌊⍺⍺2)⊃... }(function uygulanacağı +ya -ya ×ya ÷2'ye) ve değerlendirmek için hangi dize seçti sonucu kullanır. Dizeler:

-M için 3: (('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
 regex kaldır içindeki son görüldüğü b (.. Dize rep sağ arg) 'de bir (dize temsilcisi sol arg..)

+ M için 2: '10⊥⍺⍵'
 bağımsız değişkenleri temel-10 basamak olarak değerlendirin

X M 1: (b⎕R(⍵⍴'&')⊢a)
 tekrarlarını yerine b ile b için (ve işareti yani normal ifade

÷ M için 0: b'nin'⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃b ilk basamağı ⍺ M ise ⍺ × M uygulanır 1
⍺×M⍣(⍺≠1)

yukarıdaki dört dizeden, sayı seçin:

(5|⌊⍺⍺2)2'ye uygulanan işlevin tabanının mod-5'i:
 3 = 5 | ⌊-2
 2 = 5 | ⌊+2
 1 = 5 | ⌊×2çünkü × 2 gn sgn (2) ⇔ 1
 0 = 5 | ⌊÷2çünkü ÷ 2 ⇔ 1 ÷ 2 ⇔ 0.5

Şaşırtıcı talaş için sevgili arkadaşım ngn sayesinde çok teşekkürler.


1
Bu iyi. İstediğim şeye uyuyor.
Conor O'Brien

Harika, o zaman yazıyı düzenleyeceğim.
Adám

@ CᴏɴᴏʀO'Bʀɪᴇɴ Bonusu kaybetmiş olabilirdim, ama şimdi en kısa olanı.
09

Üzgünüz, bunu unuttum.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Unuttum? Bugün düzenledim, kabul edilenden daha kısa yaptım.
Haziran'da Adem

12

Perl, 100 99 98 bayt

97 bayt kodu + 1 bayt komut satırı

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

Kullanım örneği:

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

O kodunuzu kısa yaparsa, sadece kullanmak zorunda *Miçin xMve /Miçin <div>M.
Conor O'Brien

Ödül için tebrikler!
Conor O'Brien

7

Python, 644 bayt

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 (tırnak içine alınmış) girişini kabul eder. İşlemleri eşleştirmek ve ayrıştırmak için normal ifadeyi kullanır. Tüm çalışmalar iplerde yapılır ve ints'e ve ints'tan döküm sadece normal matematiksel işlemler yapılırken kullanılır.

Eminim bu daha fazla golf olabilir, bu yüzden önümüzdeki birkaç gün boyunca üzerinde çalışacağız.


Bir cveya görmüyorum f.
RK.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.