총 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 shilling→ 1 pounds is 20 shilling
( 1.0000 pounds is 20.0000 shilling괜찮을 것이다)

0.6 tuppence in tanner → 0.6 tuppence is 0.2 tanner

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

144 threepennies in guineas → 144 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대신 .forEach과 3 더 호출하여 c(0)및 c(1)및 일s[d].match
— Alconja
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.