Sayısal stenografi ile ifadeleri değerlendirme


10

Bir kullanıcı dostu bir hesap makinesi yapmak isteyen bir şirket için çalışan ve böylece kullanıcıların ise "sayısal kestirme," gibi sayısal değerleri temsil harfleri kullanmak için yeteneği ekleyerek görevlendirilmiş durumda kiçin 1000. Şirketiniz söz konusu hesap makinelerinde depolama alanından tasarruf etmek istediğinden, depolama maliyetini azaltmak için kodunuzu mümkün olduğunca en aza indirmelisiniz.


Senin görevin

Bir ifadeyi STDIN'den girdi olarak okuyan veya parametre olarak alan ve değerlendirmesini döndüren ya da STDOUT'a yazdıran bir işlev oluşturmalısınız.

Bazı Açıklamalar

Bazı tanımlar yapmama izin verin. Öncelikle, ifade dediğim girdi var. Bu aşağıdaki gibi bir şey olabilir:

x + y / z

Bu ifade içinde üç numaraları: x, yve z, operatör (ayrılmış +ve /). Bu sayılar mutlaka pozitif tamsayılar (hatta tamsayılar) değildir. İşleri zorlaştıran şey, sayılardaki kısayolları değerlendirmemiz gerektiğidir. Örneğin,

2k15

: değerlendirmenin amaçları için, üç sayılar içine bu kadar bölünmüş 2, 1000(ki k) ve 15. Sonra, kurallara göre, onları elde etmek için birleştiririz.

2*1000 + 15 = 2015

Umarım bu, aşağıdaki kuralları anlamayı biraz kolaylaştırır.

kurallar

Not Aksi belirtilmedikçe, "numaralar" kelimesini veya eşanlamlılarını stenografi içerecek şekilde yorumlayabilirsiniz.

  1. Aşağıdakiler işlev süreci gerekir sayısal kestirme teşkil: k, m, b, t, and e. sırasıyla k, m, b, and tdeğerlere 1000, 1000000, 1000000000, and 1000000000000karşılık gelir (bin, bir milyon, bir milyar ve bir trilyon). eSteno her zaman başka bir numaraya takip edecek nve temsil 10^n. Sayısal kestirme bulunması için izin vermeniz gerekir nve daha önce mevcut e. Örneğin, olarak kekdeğerlendirir 1000*10^1000.

  2. Basitlik adına, eğer bir sayıda kısayol evarsa, sadece bir kez kullanılacaktır.

  3. Bir stenodan önceki herhangi bir sayı ( stenografi dahil ) ile çarpılır. örneğin 120kkolarak değerlendirilecektir 120 * 1000 * 1000. Öncesinde sayı yoksa, sayının 1 olduğunu varsaymalısınız (matematikte bir değişkeni nasıl xörtülü olarak ele alabileceğiniz gibi 1x). örneğin e10sonucunu 10^10. Başka bir örnek: 2m2kdeğerlendirir 2*1000000*2*1000(hiçbir şey eklenmez).

  4. Steno içeren bir sayıdaki son stenoyu takip eden herhangi bir sayı (stenografi uygulanmaz) eklenir. örneğin 2k12olarak değerlendirilecektir 2*1000 + 12. Bunun istisnası, stenografi ekullanıldığında, bu durumda aşağıdaki sayıya ( stenograflar dahil ) aşağıdaki egibi davranılır nve değerlendirilir 10^n(ilk kurala bakın).

  5. İşleviniz +, -, *, and /, sırasıyla toplama, çıkarma, çarpma ve bölme olan işleçleri işleyebilmelidir . Arzu ederseniz daha fazla işleyebilir.

  6. İşlemler işlem sırasına göre değerlendirilir .

  7. Stenolardaki sayılar sadece tamsayılar değildir. 3.5b1.2geçerli ve şu şekilde değerlendirilmelidir:3.5*1000000000 + 1.2 = 3500000001.2

  8. Bu tür şeyler için varsa yerleşik yapılara izin verilmez. Ekleyeceğim istisna, diliniz otomatik olarak büyük sayıları bilimsel gösterime dönüştürürse, bu durumda çıktınız için kabul edilebilir.

  9. Bayt cinsinden en kısa kod kazanır, standart boşluklar uygulanır.

Giriş

Girdi, her sayı ve operatörün boşluklarla ayrılmış bir ifadesi olacaktır. Sayılar stenografi içerebilir veya içermeyebilir. Bir örnek aşağıda gösterilmiştir:

10 + 1b - 2k

Çıktı

İşlevin ifadenin değerlendirmesini sayı olarak vermesi gerekir. Çıktı gösterilemeyecek kadar büyük olursa bilimsel gösterimin kullanılması kabul edilebilir. Sayı bir tamsayı değilse, en az üç ondalık basamağınız olmalıdır. Sayı bir tamsayı ise bu ondalık basamakları korumanız kabul edilebilir.

Test Durumları

Giriş

t

Çıktı

1000000000000

Giriş

1 + 4b / 10k11

Çıktı

399561.483

Giriş

e2 + k2ke-1 - b12

Çıktı

-999799912

veya

-999799912.000

Giriş

142ek12

Çıktı

142e1012

veya

142.000e1012

Giriş:

1.2m5.25

Çıktı:

1200005.25

Son Notlar

Bu benim ilk meydan okuma benim (sanal alandaki kullanıcıların bazı yardım ile). Net olmayan bir şey varsa, bunu bana bildirin ve açıklığa kavuşturmak için elimden geleni yapacağım.


1
İyi bir ilk meydan okuma
Dijital Travma

@DigitalTrauma Çok teşekkürler! Cevapları görmek için sabırsızlanıyorum.
cole

İkinci örneği anlamıyorum. Orta vadeli olarak yorumlandığını düşündüm 1000 + 2000 * 10 ^ -1, ama bu son bir cevap verdi -999998712. (Ayrıca, yorumum kural 4'ün " son stenografi " ile jive gibi görünmüyor , ancak diziyi nasıl anlayacağımızdan emin değilim k2k.) Değerlendirme adımlarını açıklayabilir misiniz?
DLosc

@trichoplax evet, sadece bir sayı olmalı; İyi yakalama.
cole

1
Sandbox yazıya yorum baktıktan sonra, ben gibi bir örnek düşünmek 2m2kgibi edebi sayılar için - belki "tamsayı" - Ayrıca Kural 3. tartışılması eklenmelidir, farklı bir terimi kullanmak için iyi olabilir 123o Var değil kestirme. "Sayı" kelimesinin, şu anda olduğu gibi, burada yaklaşık 3 farklı tanımı vardır.
DLosc

Yanıtlar:


4

Python 2, 553 bayt

import sys
a=lambda i:lambda j:j*10**i
d={'k':a(3),'m':a(6),'b':a(9),'t':a(12)}
e='e'
o={'+':lambda i,j:i+j,'-':lambda i,j:i-j,'*':lambda i,j:i*j,'/':lambda i,j:i/j,e:lambda i,j:i*10**j}
r=[e,'*','/','+','-']
x=0
y=k=b=''
z=[]
q=lambda i,j:float(i or j)
for l in ''.join(sys.argv[1:]):
 if l in d:x,y=d[l](q(x,1)*q(y,1)),b
 elif l==e:z.extend([q(x+q(y,0),1),l]);x,y=0,b
 elif k==e:y+=l
 elif l in o:z.extend([x+q(y,0),l]);x,y=0,b
 else:y+=l
 k=l
z.append(x+q(y,0))
for m in r:
 while m in z:n=z.index(m);z[n-1:n+2]=[o[m](z[n-1],z[n+1])]
print repr(z[0])

Bu soru biraz sevilmemiş ve eğlenceli görünüyordu, bu yüzden denedim. Daha önce hiç kod golf yapmadım, bu yüzden muhtemelen geliştirilebilecek çok şey var, ama dil bilgime dayanarak elimden geleni yaptım. Python 3'te ek bir bayt pahasına eşdeğer bir çözüm mümkündür: print repr(z[0])-> print(repr(z[0])).

Kullanım çizgileri boyunca bir şeydir

python2 ShorthandMath.py <equation>

yani

python2 ShorthandMath.py e2 + k2ke-1 - b12

çıktılar

-999799912.0

Bunun nasıl geliştirileceğine ilişkin girdiler çok takdir edilecektir. Yeterince ilgi varsa, ben ungolf ve program yorum, ama çoğu zaten oldukça okunaklı (kod golf ilgili bir gerçek).

Bu 142ek12değerin gülünç derecede büyük olması ve programın taşması nedeniyle programın örnekle koptuğu unutulmamalıdır.

Telafi etmek için aşağıdakiler biraz daha uzundur, ancak teorik olarak yerleşik keyfi hassas kütüphanenin kullanımı nedeniyle atılan her şeyi işleyebilir. Sözdizimi aynıdır.

Python 2, 589 588 bayt (keyfi hassasiyet)

import sys
from decimal import*
a=lambda i:lambda j:j*10**i
d={'k':a(3),'m':a(6),'b':a(9),'t':a(12)}
e='e'
o={'+':lambda i,j:i+j,'-':lambda i,j:i-j,'*':lambda i,j:i*j,'/':lambda i,j:i/j,e:lambda i,j:i*10**j}
r=[e,'*','/','+','-']
x=c=Decimal(0)
y=k=b=''
z=[]
q=lambda i,j:Decimal(float(i or j))
for l in ''.join(sys.argv[1:]):
 if l in d:x,y=d[l](q(x,1)*q(y,1)),b
 elif l==e:z.extend([q(x+q(y,0),1),l]);x,y=c,b
 elif k==e:y+=l
 elif l in o:z.extend([x+q(y,0),l]);x,y=c,b
 else:y+=l
 k=l
z.append(x+q(y,0))
for m in r:
 while m in z:n=z.index(m);z[n-1:n+2]=[o[m](z[n-1],z[n+1])]
print z[0]

İlk sürümün iyi olması gerektiğini söyleyeceğim ve yanlış bir şey denerseniz size geri döneceğim (şu anda çok dikkatli bakamıyorum / düşünemiyorum).
cole

@Cole Harika, teşekkürler. Verilen her örnek üzerinde denedim ve en azından hepsini doğru anladım.
BobChao87
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.