총 3 명의 페니에 얼마나 많은 기니가 있습니까?


32

1971 년 십 진화 까지 영국 돈은 파운드 를 240 동전으로 나누는 데 기초를 두었습니다 . 실링은 12 동전으로 20 실링은 파운드를 만들었습니다. 가장 작은 명칭은 1 페니의 1/4에 달하는 파싱이었다. 동전에 대한 많은 다른 명칭과 별명이 있었으며 , 시스템에 익숙하지 않으면 혼란 스러울 수 있습니다.

도전

오래된 영어 돈의 명칭을 다른 것으로 바꿀 수있는 프로그램이나 기능을 작성하십시오. 사용자가 더 쉽게 만들려면 복수와 닉네임을 지원해야합니다.

이것들은 당신이 지원해야 할 명칭과 동의어입니다. 편의를 위해 파열에 대한 가치는 각 라인을 이끈다.

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

(나는 영국인이 아니며,이 목록은 결코 권위가 없지만 도전에 충분할 것입니다.)

stdin 또는 함수 인수를 통해 양식의 문자열을 가져와야합니다.

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

반납 또는 인쇄

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

[converted value]이다 [value to convert]교단 하나의 단위 교단 2로 변환.

[value to convert][converted value]긍정적 인 수레입니다. 출력에서 둘 다 소수점 이하 4 자리로 반올림되거나 잘 려야합니다. 원하는 [value to convert]경우 입력 할 때 항상 소수점이 있고 0 이 있다고 가정 할 수 있습니다 (예 : 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
"페니"는 금액이 아닌 많은 동전을 말하는 데만 사용됩니다.
David Richerby

4
Nit-pick : 소수점 이하 자릿수, 복수형은 quid입니다 quid. 아마도 이것은 오래된 돈과 동일했을 것입니다. 예 : Five quid a pint! Cor blimey guvnor. 예외 : quids-in
Digital Trauma

7
아마 많은 사람들이 "ha'penny"를 포함하도록 요구할 것입니다.
케인

3
나는 ha'penny 외에 @kaine이라고 불리는 ha'penny를 들어 본 적이 없습니다. 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 개의 문자열 목록으로 자르는 것이 1 자 더 짧습니다 (공간이 필요 없음). /x"string"<b2 2-> xc"string"2<b2. 다른 것은 바꿀 필요가 없습니다.

작동 방식 :

  • 이것은 처음 두 글자를 사용하여 통화 가치를 찾는 @xnor의 접근 방식과 초기 값을 감지하는 트릭을 사용합니다. half 하거나 two, 그것을 제거하고 다시 함수를 호출합니다.

  • 처음 두 문자의 값을 조회하기 위해 문자열에서 통화의 처음 두 문자의 위치를 ​​찾은 다음 2로 나누고 목록에서 해당 인덱스의 값을 가져옵니다. 이것은 pyth의 dict보다 훨씬 짧습니다.

  • x(문자열 내에서 찾기) 문자열에 po(파운드) qu(quid) 또는 so(주권자) 를 두지 않는 데 실패하면 -1을 반환하고 기본적으로 목록의 마지막 요소 인 960을 반환 한다는 사실을 사용합니다 .

  • 조회 시스템에서 통화의 순서를 재 배열 조심스럽게 초기화에 의해 K4하고 J24, 목록에서 번호를 구분하는 데 필요한했을 모든 공간을 제거 하였다.

  • A입력 스플릿에서 pyth의 이중 할당 연산자를 사용합니다 . in 의 시작과 끝을 개별 변수로 가져옵니다.

  • pyth에는 없어도 본질적으로 동일한 조회를 수행 .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 2018

아마 :) 더주의 깊게 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 / half-groat case (value 8)를 기본값으로 사용하고 있습니다. 마찬가지로 일부 패턴은 다른 값이 이전 패턴과 이미 일치한다고 가정하므로 각 정규 표현식은 원하는 값만 나머지 값과 만 구별합니다. 이것을 사용하여 교파 순서를 다시 정렬하여 다른 몇 바이트를 줄일 수 있습니다.

Pyth이길 수 있게 도와 준 Ventero에게 감사합니다 !


1
s[k]을 덮어 쓰는 정규 표현식 일치 ( )입니다 $1. 맵 블록을 람다로 이동하고 마지막 줄에서 직접 호출하여 문자를 절약 할 수 있습니다 ( $1및에 대한 할당을 삭제할 수도 있습니다 $2). 또한 .index보다 짧습니다 .find_index.
Ventero

@Ventero Ah, 그 말이 맞아. 고맙습니다!
Martin Ender

1
Regexp.new k/#{k}/$><<gets.sub(/foo/){a=$3;...}gets[/foo/];a=$3;puts...총 221 개. 물론 int 배열을 문자열로 묶고 (을 사용하여 .pack("U*")) 문자열 로 인덱싱 하는 오래된 트릭을 사용할 수 있습니다 . 195 자 / 200 바이트로 줄이십시오.
Ventero

더 나은 :a=gets[/foo/,3]
Ventero 사용자

@Ventero 감사합니다. 인쇄 할 수없는 ASCII를 피하기 위해 문자 코드에 오프셋을 추가했기 때문에 196/202로 끝났습니다. 여전히 Pyth보다 짧습니다. ;)
Martin Ender

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 처음 두 글자 지문으로 표시하여 통화 문자열의 실링 값을 가져옵니다. 에서 문자열을 찾아서 . 접두사 "half"와 "two"는 접두사와 공백을 자르고 승수를 적용하여 감지하고 설명합니다. "halfpenny"에는 "half"뒤에 공백이 없기 때문에 "enny"가 발생하지만 가상의 "en"항목으로 처리됩니다.

사전 검색 기능을 많이 개선 한 @isaacg 및 @grc 덕분입니다.


나는 그것이 가능하다는 것을 알고 있었다 :) 나는 또한 당신이 그런 사전을 정의 할 수 있다는 것을 몰랐다는 것을 매우 당혹스럽게 생각합니다 ... : S
FryAmTheEggman

2
@FryAmTheEggman이 사이트의 답변에 사용되는 것을 볼 때까지 키워드를 통해 사전을 정의 할 수 없었습니다. 골프를 배우는 것들 ...
xnor

나는 이것의 Pyth 버전을 만들고 207 문자를 얻었다. 커뮤니티 위키 답변을 추가하거나 게시 할 수 있도록 여기에 게시 하시겠습니까?
FryAmTheEggman

1
해당 2/4**(c<'t')부분에 +1
njzk2

1
.get(c[:2],960)사전에서 값을 조회하고 사전에서 po=960,so=960,qu=960,항목을 생략 하여 13자를 저장할 수 있습니다 .
isaacg

5

파이썬 2-345358

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

@ 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

자바 스크립트 (ES5), 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
Falsey 일 때 또는 동등하게 평가되기 때문에 3 항 x and y or 0을 일반적으로 단축 할 수 있습니다 . x and y0Falsex
xnor

1

자바 스크립트 ES6, 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 화살표 기능을 제거하여 누구나 쉽게 코드를 테스트 할 수 있도록 포맷되었습니다). Alconja에게 제안 해 주셔서 감사합니다.


1
당신은 트리밍 할 수 2 개 를 사용하여 문자를 't0sh|bo0^p....'.split(0), 4를 사용하여 더 많은 .map대신 .forEach3 더 호출하여 c(0)c(1)및 일s[d].match
Alconja
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.