थ्रीपेनियों के सकल में कितने गिनी?


32

1971 में दशमलव तक , ब्रिटिश पैसे पाउंड को 240 पैसे में विभाजित करने पर आधारित थे । एक शिलिंग 12 पैसे का था इसलिए 20 शिलिंग ने एक पाउंड बनाया। सबसे छोटा संप्रदाय एक चौथाई पैसे में सबसे कम था। सिक्कों के लिए कई अन्य संप्रदाय और उपनाम थे, जो सिस्टम में उपयोग नहीं किए जाने पर काफी भ्रमित हो सकते हैं।

चुनौती

एक प्रोग्राम या फ़ंक्शन लिखें जो पुरानी अंग्रेजी पैसे के किसी भी संप्रदाय को लगभग किसी भी अन्य में परिवर्तित कर सकता है। उपयोगकर्ता के लिए इसे आसान बनाने के लिए आपको plurals और उपनामों का समर्थन करने की आवश्यकता है।

ये संप्रदाय और उनके पर्यायवाची शब्द हैं जिनका आपको समर्थन करना चाहिए। सुविधा के लिए किराए में उनका मूल्य प्रत्येक पंक्ति की ओर जाता है।

1: farthing, farthings
2: halfpence, halfpenny, halfpennies
4: penny, pennies, pence, copper, coppers
8: twopenny, twopennies, twopence, tuppence, half groat, half groats
12: threepence, threepenny, threepennies, threepenny bit, threepenny bits, thruppence, thrupenny, thrupennies, thrupenny bit, thrupenny bits
16: groat, groats
24: sixpence, sixpenny, sixpennies, sixpenny bit, sixpenny bits, tanner, tanners
48: shilling, shillings, bob
96: florin, florins, two bob bit, two bob bits
120: half crown, half crowns
240: crown, crowns
480: half sovereign, half sovereigns
504: half guinea, half guineas
960: pound, pounds, pounds sterling, sovereign, sovereigns, quid, quids
1008: guinea, guineas

(मैं ब्रिटिश नहीं हूं, यह सूची किसी भी तरह से आधिकारिक नहीं है लेकिन यह चुनौती के लिए पर्याप्त है।)

स्टड या फ़ंक्शन तर्क के माध्यम से आपको प्रपत्र की एक स्ट्रिंग में लेना चाहिए

[value to convert] [denomination 1] in [denomination 2]

और वापस या प्रिंट करें

[value to convert] [denomination 1] is [converted value] [denomination 2]

जहां [converted value]है [value to convert]मज़हब 1 की इकाइयों मज़हब 2 में बदला।

[value to convert]और [converted value]सकारात्मक तैरता है। आउटपुट में दोनों को 4 दशमलव स्थानों पर गोल या छोटा किया जाना चाहिए। यदि आप चाहते हैं [value to convert]कि इनपुट होने पर हमेशा दशमलव बिंदु और शून्य हो (उदाहरण के 1.0बजाय 1)।

ऊपर दी गई सूची में से 1 और 2 की कोई भी दो शर्तें हो सकती हैं। इस बात की चिंता न करें कि वे बहुवचन हैं या नहीं, सभी संप्रदायों के समान हैं और समानार्थक शब्द हैं। आप मान सकते हैं कि इनपुट प्रारूप और मूल्यवर्ग हमेशा मान्य हैं।

उदाहरण

1 pounds in shilling1 pounds is 20 shilling
( 1.0000 pounds is 20.0000 shillingठीक होगा)

0.6 tuppence in tanner0.6 tuppence is 0.2 tanner

24 two bob bits in pounds sterling24 two bob bits is 2.4 pounds sterling

144 threepennies in guineas144 threepennies is 1.7143 guineas

स्कोरिंग

बाइट्स में सबसे छोटा कोड जीतता है।


1
"पेनीज़" का उपयोग केवल कई सिक्कों को संदर्भित करने के लिए किया जाता है, न कि धन की राशि के लिए।
डेविड रिचरबी

4
नाइट-पिक: पोस्ट दशमलव, का बहुवचन quidहै quid। सबसे अधिक संभावना है कि पुराने पैसे के साथ ऐसा ही रहा होगा। उदाहरण: Five quid a pint! Cor blimey guvnor। अपवाद: quids-in
डिजिटल ट्रॉमा

7
मैं शायद उन लोगों को बहुत अधिक गड़बड़ कर दूंगा, जिन्हें उन्हें "हापनी" शामिल करने की आवश्यकता थी।
21

3
मैंने कभी नहीं सुना है एक ha'penny कहा जाता है, लेकिन एक ha'penny, @kaine। जैसे कि en.wikipedia.org/wiki/Ha%27penny_Bridge । बेशक, मैं बहुत छोटा हूँ, यह भाषण में बहुत बार सुना है, लेकिन प्रेरितों को लिखित रूप में मानक लगता है।
TRIG

जवाबों:


9

पायथ , 146 145

K4J24L?*y>b-5>b\t?2>b\t.5}<b2"hatw"@[1K8K12K16J48J1008*JT96*2J960)xc"fapetucothengrsishtagucrflbo"2<b2AGHcz" in"++G%" is %0.4f"*vhcGdcyjdtcGdytHH

अधिक पठनीय (चलाने के लिए नए सिरे और संकेत को हटाया जाना चाहिए):

K4J24
L?*y>b-5>b\t?2>b\t.5
  }<b2"hatw"
  @[1K8K12K16J48J1008*JT96*2J960)
   xc"fapetucothengrsishtagucrflbo"2<b2
AGHcz" in"
++G
  %" is %0.4f"
   *vhcGdcyjdtcGdytH
 H

अपडेट: यह पता चलता है कि, स्ट्रिंग इंडेक्स ऑपरेशन को चलाने से पहले 2 कैरेक्टर स्ट्रिंग्स की सूची में स्ट्रिंग को काट देने के लिए यह १ कैरेक्टर छोटा (कोई स्पेस की जरूरत नहीं) है। /x"string"<b2 2-> xc"string"2<b2। और कुछ नहीं बदलना होगा।

यह काम किस प्रकार करता है:

  • यह अपने पहले दो अक्षरों का उपयोग करते हुए मुद्रा के मूल्य को देखने के लिए @ xnor के दृष्टिकोण का उपयोग करता है, साथ ही प्रारंभिक का पता लगाने halfया twoइसे हटाने और फ़ंक्शन को फिर से कॉल करने की चाल ।

  • पहले दो वर्णों के मूल्य को देखने के लिए, यह मुद्रा के पहले दो अक्षरों का स्थान एक स्ट्रिंग में पाता है, फिर 2 से विभाजित होता है और सूची में उस मूल्य पर मान लेता है। यह अजगर के हुक्म से बहुत छोटा है।

  • इस तथ्य का उपयोग करता है कि x(स्ट्रिंग के भीतर खोजें) -1 को स्ट्रिंग में डालने po(पाउंड) qu(क्विड) या so(संप्रभु) से बचने में विफलता पर देता है , और बस सूची के अंतिम तत्व, 960 को डिफ़ॉल्ट रूप से वापस कर देता है।

  • साथ देखने प्रणाली में मुद्राओं के आदेश उलटफेर और ध्यान से आरंभ करके K4और J24, सभी रिक्त स्थान होता है कि सूची में संख्या को अलग करने के लिए आवश्यक किया गया है हटा दिया गया।

  • अलग-अलग चरों में इनपुट की शुरुआत और अंत प्राप्त करने के लिए Aइनपुट विभाजन पर pyth के दोहरे असाइनमेंट ऑपरेटर का उपयोग करता है in

  • अंत में समान रूप से एक ही लुकअप करता है, हालांकि अजगर के पास नहीं है .split(_,1), इसलिए यह कुछ अधिक बोझिल है।

उदाहरण:

$ pyth programs/currency.pyth <<< '5 florins in half guineas'
5 florins is 0.9524 half guineas

$ pyth programs/currency.pyth <<< '0.4 quid in sixpenny bits'
0.4 quid is 16.0000 sixpenny bits

3
मैं हार जाता हूं ...;)
मार्टिन एंडर

मुझे नहीं पता था <और >स्ट्रिंग / सूची स्लाइस ऑपरेटरों के रूप में काम किया था ; यह बहुत अच्छा है, एक चॉप के सिर या अंत लेने से बेहतर है :)
FryAmTheEggman

@FryAmTheEggman ऐसा लगता है कि प्रलेखन से भी गायब था - मैंने इसे जोड़ दिया है।
isaacg

मुझे शायद macros.py के माध्यम से और अधिक ध्यान से पढ़ना चाहिए :)
FryAmTheEggman

14

रूबी, 345 306 302 288 287 278 273 253 252 242 232 221 202 190 बाइट्स

f=->s{" !#+/7OďǿȗϟЏ'"[%w{fa fp ^pe|co r..p ^gr x|ta sh|^b fl|b f.c ^c f.s .gu d|v ^g .}.index{|k|s[/#{k}/]}].ord-31}
$><<gets.sub(/ (.+ i)n /){" #{r=$1}s %0.4f ".%$`.to_f/f[$']*f[r]}

STDIN से इनपुट लेता है और STDOUT पर प्रिंट करता है।

मैं प्रत्येक मूल्य के लिए वांछित संप्रदायों के मिलान के लिए छोटे नियमित अभिव्यक्तियों का उपयोग कर रहा हूं। दो सरणियाँ हैं, एक रेगीक्स के साथ और एक वैल्यू के साथ, संबंधित सूचकांकों पर। रेगेक्स सरणी एक स्थान सीमांकित सरणी शाब्दिक है, और मान सरणी UTF-8 वर्णों के स्ट्रिंग में पैक किया गया है।

मैं प्रत्येक रेगुलेशन से मेल खाने वाले रेक्सक्स की खोज करके इंडेक्स को मूल्यों में चुन रहा हूं। मैं भी tuppence / आधा-गला मामले (मान 8) को डिफ़ॉल्ट कर रहा हूं, क्योंकि सबसे लंबे समय तक रेगेक्स की आवश्यकता होती है। इसी तरह, कुछ पैटर्न यह मानते हैं कि अन्य मान पहले के पैटर्न से मेल खा चुके हैं, इसलिए प्रत्येक regex केवल शेष लोगों से वांछित मूल्य को अलग करता है। इसका उपयोग करते हुए, मैं शायद संप्रदायों के क्रम को पुन: व्यवस्थित करके बाइट्स के एक और जोड़े को बंद कर सकता हूं।

मेरी मदद करने के लिए वेंटरो को धन्यवाद पियथ को हराकर छोटा कर दिया!


1
यह रेगुलर एक्सप्रेशन मिलान का है ( s[k]) कि अधिलेखित कर देता है $1आदि तुम एक लैम्ब्डा में नक्शा ब्लॉक चलती और बुला कि अंतिम पंक्ति में सीधे (जो भी अनुमति देता है आप कार्य के लिए ड्रॉप करने से कुछ वर्ण को बचा सकता है $1और $2)। से भी .indexछोटा है .find_index
19

@ वेंटरो आह, यह समझ में आता है। धन्यवाद!
मार्टिन एंडर

1
Regexp.new k/#{k}/और $><<gets.sub(/foo/){a=$3;...}gets[/foo/];a=$3;puts...कुल 221 के लिए। और आप निश्चित रूप से इंट सरणी को एक स्ट्रिंग में बाँधने (उपयोग करने .pack("U*")) की पुरानी चाल का उपयोग कर सकते हैं और फिर उस स्ट्रिंग में अनुक्रमण कर सकते हैं। आपको 195 चार्ट / 200 बाइट्स पर ले जाना चाहिए।
वेंटरो

इससे भी बेहतर:a=gets[/foo/,3]
वेंटरो

@ वेंचरो बहुत बहुत धन्यवाद। मैंने 196/202 के साथ समाप्त किया, क्योंकि मैंने अप्राप्य ASCII से बचने के लिए चार कोड में एक ऑफसेट जोड़ा। अभी भी पाइथ से कम है। ;)
मार्टिन एंडर

8

पायथन 3: 264 239 वर्ण

f=lambda c:c[:2]in"hatw"and f(c[5-(c>'t'):])*2/4**(c<'t')or[1,4,4,4,8,12,16,24,24,48,48,96,240,1008,960]['fapecoentuthgrsitashboflcrgu'.find(c[:2])//2]
a,b=input().split(" in ")
x,c=a.split(" ",1)
print(a,"is %0.4f"%(eval(x)*f(c)/f(b)),b)

फ़ंक्शन fको स्ट्रिंग में ढूंढकर शब्दकोश का उपयोग करकेc पहले दो अक्षरों को फ़िंगरप्रिंट करके मुद्रा-स्ट्रिंग का शिलिंग मान प्राप्त होता है । उपसर्ग "आधा" और "दो" का पता लगाया जाता है और उपसर्ग और स्थान को काटकर एक गुणक लागू करने के लिए जिम्मेदार है। चूँकि "हाफपनी" में "हाफ" के बाद जगह की कमी होती है, इसके परिणामस्वरूप "एनी" होता है, लेकिन यह एक काल्पनिक "एन" प्रविष्टि के साथ संभाला जाता है।

डिक्शनरी लुकअप में बहुत सुधार के लिए @isaacg और @grc को धन्यवाद।


मुझे पता था कि यह किया जा सकता है :) मैं बेहद शर्मिंदा हूं कि मुझे नहीं पता था कि आप इस तरह से एक डिक्शनरी को परिभाषित कर सकते हैं ...: S
FryAmTheEggman

2
@FryAmTheEggman जब तक मैंने इस साइट पर एक उत्तर में इसका इस्तेमाल नहीं किया, तब तक मैं आपको कीवर्ड के माध्यम से शब्दकोशों को परिभाषित नहीं कर सकता था। जिन चीजों को आप गोल्फ सीखते हैं ...
xnor

मैंने इसका एक पायथन संस्करण बनाया और इसे 207 वर्ण मिले। क्या आप बल्कि इसे एक समुदाय विकि उत्तर जोड़ने, या पोस्ट करने के लिए यहाँ पोस्ट करोगे?
FryAmTheEggman

1
उस 2/4**(c<'t')भाग के लिए +1 ।
njzk2

1
आप .get(c[:2],960)शब्दकोश से मूल्य देखने और शब्दकोश po=960,so=960,qu=960,से प्रविष्टियों को छोड़ने के लिए 13 वर्णों को बचा सकते हैं ।
isaacg

5

अजगर 2 - 345 358

s=str.startswith
h='half'
u,v=raw_input().split(' in ')
a,b=u.split(' ',1)
C=dict(fa=1,pe=4,twop=8,tu=8,thr=12,gr=16,si=24,ta=24,sh=48,b=48,fl=96,c=240,po=960,so=960,q=960,gu=1008)
C.update({h+'p':2,h+' gr':8,'two ':96,h+' c':120,h+' s':480,h+' gu':504})
for c in iter(C):
 if s(b,c):k=C[c]
 if s(v,c):f=C[c]
print u+' is %0.4f '%(eval(a)*k/f)+v

अजगर में फ्लोट होने के लिए इनपुट नंबर की आवश्यकता होती है 144.1

मुझे लगता है कि यह अजगर 3 में छोटा किया जा सकता है ...

... @xnor को धन्यवाद। यह भी पुष्टि की कि एक बेहतर एल्गोरिथ्म होना बहुत मायने रखता है;)


मैं जगह लेंगे q=raw_input().split(' in ')द्वाराq,b=raw_input().split(' in ')
njzk2

@ njzk2 काफी सही ... मैंने इसे अगली पंक्ति के लिए भी उपयोग किया है, अब :)
FryAmTheEggman

मुझे लगता है कि बीच में एक संघर्ष है h+' gr':8और h+' g':504इस बात पर निर्भर करता है कि पहले आधे
ग्रेट्स के लिए किसका

@ njzk2 यह सच है ... uगिनी एक में जोड़ा ...
FryAmTheEggman

2

हास्केल - 315 बाइट्स

w x=f(u x)*v(u x)
f=maybe 1 id.l"ha tw tu th si"[0.5,2,2,3,6]
v x@(_:xs)|Just w<-l"bo cr gr gu so co fa fl pe po qu sh ta"[12,60,4,252,240,1,0.25,24,1,240,240,12,6]x=w|True=v xs
l k v x=take 2 x`lookup`zip(words k)v
u=unwords
i s|(n:x,_:t)<-span(/="in")$words s=u$n:x++["is",show$read n*w x/w t]++t
main=interact i

2

जावास्क्रिप्ट (ईएस 5), 344

I=prompt()
n=I.match(/[\d.]+ /)[0]
A=I.slice(n.length).split(" in ")
function m(x){return{fi:1,he:2,p:4,pe:4,cr:4,tn:8,hg:8,tp:12,te:12,g:16,gs:16,sn:24,tr:24,si:48,b:48,fn:96,to:96,hc:120,c:240,cs:240,hs:480,hgtrue:504,ps:960,se:960,q:960,ga:1008}[x[0]+(x[5]||"")+(x[10]=="a"||"")]}
alert(n+A[0]+" is "+(n*m(A[0])/m(A[1])).toFixed(4)+" "+A[1])

मैं एक हैश फ़ंक्शन दृष्टिकोण के साथ गया ... मुझे लगता है कि मैंने कम (अपेक्षाकृत) कम करके आंका है कि इनपुट प्रसंस्करण कितना जटिल होगा (रेगेक्स दृष्टिकोण पर, जो संख्या के बारे में परवाह नहीं करेगा)।


1

परीक्षण के एक अलग तरीके के साथ @ FryAmTheEggMan के उत्तर के आधार पर str.startwith:

अजगर 2: 317

h='half'
C=dict(fa=1,pe=4,twop=8,tu=8,thr=12,gr=16,si=24,ta=24,sh=48,b=48,fl=96,c=240,po=960,so=960,q=960,gu=1008)
C.update({h+'p':2,h+' gr':8,'two ':96,h+' c':120,h+' s':480,h+' gu':504})
u,v=raw_input().split(' in ')
a,b=u.split(' ',1)
s=lambda x:x and C.get(x, s(x[:-1]))
print u+' is %0.4f '%(eval(a)*s(b)/s(v))+v

मुझे लगता है कि आपको एक printस्ट्रिंग स्थान और स्वरूपित स्ट्रिंग को जोड़ने की आवश्यकता है । आप s=lambda x:x and C.get(x,s(x[:-1]))or 0एक चरित्र (रिक्त स्थान के साथ) को बचाने के लिए लंबोदर को फिर से लिख सकते हैं । यह एक बहुत साफ विचार है, btw :)
FryAmTheEggman

धन्यवाद, मैंने कुछ समय के लिए इस टर्नरी नोटेशन के साथ काम किया, जो मुझे हमेशा क्रियात्मक लगता है, लेकिन and/orबात के बावजूद नहीं ।
njzk2

हाँ, मैंने इसे यहाँ सीखा :) मुझे यह भी लगता है कि आपको उन मुद्राओं के लिए u.split(' ')कहना होगा u.split(' ',1)जिनके पास रिक्त स्थान हैं, जैसे "आधा संप्रभु"।
FryAmTheEggman

तो इसका कारण है , 1!
njzk2

2
टर्नरी x and y or 0को सामान्य रूप से छोटा किया जा सकता है x and y, क्योंकि दोनों फाल्सी होने पर 0या उसके बराबर मूल्यांकन Falseकरते हैं x
xnor

1

जावास्क्रिप्ट ईएस 6, 264 273

f=t=>{s=t.split(x=' in')
c=d=>{'t0sh|bo0^p|co0f0fp0fl|b b0gu0d|v0wn0gr0f g|t..?p0f s0f gu0f c0x|an'.split(0).map((e,i)=>{v=s[d].match(e)?[12,48,4,1,2,96,1008,960,240,16,8,480,504,120,24][i]:v})
return v}
return s.join(' is '+~~(1e4*t.split(' ')[0]*c(0)/c(1))/1e4)}

यह प्रत्येक मुद्रा का मूल्य विभिन्न रेगेक्स के खिलाफ जांच करके प्राप्त करता है, जो सबसे व्यापक के साथ शुरू होता है /t/; यदि एक और मैच का सामना करना पड़ा है तो मान को ओवरराइट किया गया है। रेगेक्स स्ट्रिंग को पुनः व्यवस्थित करके एक जोड़े बाइट्स को दाढ़ी बनाने का एक तरीका हो सकता है। आप ऊपर दिए गए स्निपेट का उपयोग करके इसका परीक्षण कर सकते हैं (यह केवल संवाद बॉक्स का उपयोग करने के लिए और ES6 तीर फ़ंक्शन को हटाने के लिए स्वरूपित किया गया है ताकि हर कोई आसानी से कोड का परीक्षण कर सके)। सुझावों के लिए अल्कोंजा का धन्यवाद।


1
आप ट्रिम कर सकते हैं 2 का उपयोग करके वर्ण 't0sh|bo0^p....'.split(0), 4 का उपयोग करके अधिक .mapके बजाय .forEachऔर 3 को फोन करके अधिक c(0)और c(1)और करs[d].match
Alconja
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.