프랑스어로 숫자 철자


23

숫자를 영어로 숫자로 변환하는 데 어려움이 있었지만 너무 간단했습니다. 숫자 0–100이 주어지면 해당 숫자를 프랑스어로 출력해야합니다. 프랑스의 숫자 체계는 영어와 비교할 때 더 복잡한 논리를 가지고 있습니다.

숫자 숫자
---------------
 0 제로 (강세 표시)
 1 개
 2 개
 3 개 트로이
 4 쿼트
 5 cinq
 6 6
 9 월 7 일
 8 개
 9 명
10 딕스
11 온제
12 개
13 Treize
쿼터제
퀸즈 15 개
16 압류
17 dix-sept (문자 그대로 열 일곱)
18 딕스 휴잇
19 딕스-뉴프
20 명
21 vingt et un (하이픈 없음)
22 빙트 듀
...
30 트 렌테
...
40 분위
...
cinquante 50 개
...
soixante 60 개
...
soixante-dix 70 (문자 그대로 육십 열)
71 soixante et onze
...
80 개의 쿼트-베팅 (s에 주목하십시오; 말 그대로 4 대)
81 quatre-vingt-un (하이픈 참고)
...
90 콰트 르 빙트 딕스
91 콰트로 빙트 온제
...
99 콰트 르 베팅 딕스-뉴프 (4 * 20 + 10 + 9)
100 센트

전체 목록을 보려면 http://quizlet.com/996950/ ( http://www.webcitation.org/6RNppaJx0 )을 따르십시오 .

추가 규칙 / 설명

  • 숫자가 1로 끝나는 경우 EXCEPT라는 단어 사이에는 항상 하이픈이 있습니다.
  • 숫자가 1로 끝나면 et (의미 의미 ) 라는 단어 가 un 또는 onze 앞에 추가 됩니다. (31 = 트 렌테 외)
  • 그러나 81과 91은 다른 숫자와 같은 형식입니다. (81 = 콰트로 빙 트운)
  • 60에서 시스템은베이스 10에서베이스 20으로 전환됩니다.
  • 이것에 대해 웹 전체에 약간의 차이가 있습니다. 질문은 위에 링크 된 목록을 참조하십시오.
  • 기본적으로 금지 된 허점은 허용되지 않습니다.
  • 웹 사이트와 같은 외부 소스뿐만 아니라 숫자를 숫자로 변환하거나 프랑스어로 번역하는 라이브러리, API, 함수 등은 사용할 수 없습니다.
  • 이것은 이므로 가장 적은 바이트를 가진 답이 이깁니다.
  • 가능한 경우 코드를 쉽게 테스트 할 수 있도록 온라인 컴파일러에 연결하십시오.

입력

  • 입력은 언어에서 입력해야합니다. (STDIN, 명령 행 등)
  • 입력은 0에서 100 사이의 정수로 구성되는 단일 문자열입니다 (앞의 0은 선택 사항 임).
  • 입력이 항상 올바르게 구성되어 있다고 가정 할 수 있습니다.

산출

  • 결과는 귀하의 언어에 가장 편리한 방법으로 출력됩니다. (STDOUT, 대화 상자 등)
  • 대소 문자는 출력에 중요하지 않습니다.

다음에 대해 코드를 테스트하십시오.

입출력
-------------
0 제로
18 딕스 휴잇
51 cinquante et un
80 쿼트-베팅
91 콰트로 빙트 온제
99 콰트 르 빙트 딕스-뉴프

3
프랑스어를 사용하는 벨기에 인은 soixante-dix, quatre-vingts, quatre-vingt-dix 대신 "septante", "octante"및 "nonante"를 사용합니다. 고대 벨기에 식민지에서 사용되어야합니다.
Emmanuel

8
프랑스어로 이것을하는 천재에 +1. 저의 독일 동료가 말했듯이 "독일인들은 숫자를 거꾸로 말하지만 프랑스어를 이해하려면 계산기가 필요합니다."
Level River St

1
0에서 100 사이의 유일한 악센트 숫자 인 것 같습니다. 이것은 표준 ASCII 문자가 아닙니다. 이 문자를 출력 할 수있는 모든 형식 (코드 페이지 437, UTF-8 등)을 사용할 수 있다고 가정합니다.
Level River St

1
@Martin 규칙 상태는 "입력이 항상 올바르게 구성되어 있다고 가정 할 수 있습니다"이므로 입력> 100은 모든 동작을 유발할 수 있습니다.
NinjaBearMonkey

3
프랑스 시스템에는 논리가 전혀 없습니다. 나는 프랑스 수표의 99 %에 실수가 있다고 확신합니다. 100 세 이후에는 훨씬 더 복잡합니다. 활용도 악몽입니다. 날 믿어, 난 프랑스 인이야
Michael M.

답변:


7

자바 스크립트 (ES6) (318) (321)

버그 수정 (선행 0 관리) 편집 및 기타 골프

낙타 케이스 트릭 @ Core1024의 크레딧

팝업을 통한 입 / 출력

alert((n=prompt(),w='ZéroUnDeuxTroisQuatreCinqSixSeptHuitNeufDixOnzeDouzeTreizeQuatorzeQuinzeSeizeDix-septDix-huitDix-neufVingtTrenteQuaranteCinquanteSoixante'.match(/[A-Z][^A-Z]+/g),
u=n%10,s=u-1|n>80?d='-':' et ',n>99?'Cent':n<21?w[n|0]:n<70?w[18+n/10|0]+(u?s+w[u]:''):(n<80?w[24]:w[4]+d+w[20])+(n-80?s+w[n%20]:'s')))

테스트 가능한 기능으로

F=n=>(
  w='ZéroUnDeuxTroisQuatreCinqSixSeptHuitNeufDixOnzeDouzeTreizeQuatorzeQuinzeSeizeDix-septDix-huitDix-neufVingtTrenteQuaranteCinquanteSoixante'
  .match(/[A-Z][^A-Z]+/g),
  u=n%10,s=u-1|n>80?d='-':' et ',
  n>99?'Cent':
  n<21?w[n|0]:
  n<70?w[18+n/10|0]+(u?s+w[u]:''):
  (n<80?w[24]:w[4]+d+w[20])+(n-80?s+w[n%20]:'s')
)

FireFox 콘솔 또는 FireBug에서 테스트하려면

for (i = 0; i < 100; console.log(r),i+= 10) 
  for (j=0, r=''; j < 10; j++)
    r+=(i+j)+':'+F(i+j+'')+", "; // specific: input is a string
F('100')

테스트 출력

0 : 제로, 1 : Un, 2 : 듀, 3 : Trois, 4 : Quatre, 5 : Cinq, 6 : Six, 7 : Sept, 8 : Huit, 9 : Neuf,
10 : Dix, 11 : Onze, 12 : Douze, 13 : Treize, 14 : Quatorze, 15 : Quinze, 16 : Seize, 17 : Dix-sept, 18 : Dix-huit, 19 : Dix-neuf,
20 : Vingt, 21 : Vingt et Un, 22 : Vingt-Deux, 23 : Vingt-Trois, 24 : Vingt-Quatre, 25 : Vingt-Cinq, 26 : Vingt-Six, 27 : Vingt-Sept, 28 : Vingt- Huit, 29 : Vingt-Neuf,
30 : Trente, 31 : Trente et Un, 32 : Trente-Deux, 33 : Trente-Trois, 34 : Trente-Quatre, 35 : Trente-Cinq, 36 : Trente-Six, 37 : Trente-Sept, 38 : 트 렌테- Huit, 39 : 트 렌테-네프,
40 : Quarante, 41 : Quarante et Un, 42 : Quarante-Deux, 43 : Quarante-Trois, 44 : Quarante-Quatre, 45 : Quarante-Cinq, 46 : Quarante-Six, 47 : Quarante-Sept, 48 : Quarante- Huit, 49 : Quanter-Neuf,
50 : Cinquante, 51 : Cinquante et Un, 52 : Cinquante-Deux, 53 : Cinquante-Trois, 54 : Cinquante-Quatre, 55 : Cinquante-Cinq, 56 : Cinquante-Six, 57 : Cinquante-Sept, 58 : 친양자- Huit, 59 : Cinquante-Neuf,
60 : Soixante, 61 : Soixante et Un, 62 : Soixante-Deux, 63 : Soixante-Trois, 64 : Soixante-Quatre, 65 : Soixante-Cinq, 66 : Soixante-Six, 67 : Soixante-Sept, 68 : Soixante- Huit, 69 : 소산 테 네프,
70 : Soixante-Dix, 71 : Soixante et Onze, 72 : Soixante-Douze, 73 : Soixante-Treize, 74 : Soixante-Quatorze, 75 : Soixante-Quinze, 76 : Soixante-Seize, 77 : Soixante-Dix-sept, 78 : Soixante-Dix-huit, 79 : Soixante-Dix-neuf,
80 : Quatre-Vingts, 81 : Quatre-Vingt-Un, 82 : Quatre-Vingt-Dux, 83 : Quatre-Vingt-Trois, 84 : Quatre-Vingt-Quatre, 85 : Quatre-Vingt-Cinq, 86 : 쿼터 Vingt-Six, 87 : Quatre-Vingt-Sept, 88 : Quatre-Vingt-Huit, 89 : Quatre-Vingt-Neuf,
90 : Quatre-Vingt-Dix, 91 : Quatre-Vingt-Onze, 92 : Quatre-Vingt-Douze, 93 : Quatre-Vingt-Treize, 94 : Quatre-Vingt-Quatorze, 95 : Quatre-Vingt-Quinze, 96 : Quatre-Vingt-Seize, 97 : Quatre-Vingt-Dix-sept, 98 : Quatre-Vingt-Dix-huit, 99 : Quatre-Vingt-Dix-neuf, 
"센트"

2
낙타 케이스와 멋진 트릭!
tomsmeding

@tomsmeding 정말 멋지다 그래서 나에 의해 고안되지 않은 (포스트에 추가)
edc65

@ edc65 루비 응답을 향상 시키려고해도 괜찮습니까? 필자가 글을 쓸 때 대소 문자를 구분하지 않는 출력이 허용되는 것을 보지 못했습니다. ^^
Martin Ender

@ MartinBüttner는 물론
edc65

6

하스켈, 390 바이트

b=(words"zéro un deux trois quatre cinq six sept huit neuf dix onze douze treize quatorze quinze seize vingt trente quarante cinquante soixante"!!)
a!b=a++"-"++b
f 0=b 0
f 71=f 60++" et onze"
f 80=f 4!b 17++"s"
f 100="cent"
f x|x<17=b x|x<20=b 10!b(x-10)|x>80=b 4!b 17!f(x-80)|m==1=f(x-1)++" et un"|x>60=f 60!f(x-60)|m==0=b(15+div x 10)|1<2=f(x-m)!f m where m=mod x 10
main=interact$f.read

언 골프

base :: Int -> String
--              0    1  2    3     4      5    6   7    8    9    10  11   12     13     14       15     16    17    18     19       20        21      
base i = words "zéro un deux trois quatre cinq six sept huit neuf dix onze douze  treize quatorze quinze seize vingt trente quarante cinquante soixante" !! i

hyphen :: String -> String -> String
a `hyphen` b = a ++ "-" ++ b

say :: Int -> String
say 0 = base 0
say 71 = say 60 ++ " et onze"
say 80 = say 4 `hyphen` base 17 ++ "s"
say 100 = "cent"
say x
  | x < 17 = base x
  | x < 20 = base 10 `hyphen` base (x - 10)
  | x > 80 = base 4 `hyphen` base 17 `hyphen` say (x - 80)
  | m == 1 = say (x - 1) ++ " et un"
  | x > 60 = say 60 `hyphen` say (x - 60)
  | m == 0 = base (div x 10 + 15)
  | otherwise = say (x - m) `hyphen` say m
  where m = mod x 10

main = putStr.say.read=<<getLine

기능적 프로그래밍 언어는이 작업에 매우 적합합니다.


공감대를 가지고, 당신은 나보다 빠르다. 메인을 바꾸고 main=interact$f.read몇 문자를 저장 하고 싶을 수도 있습니다 .
gxtaillon

@gxtaillon 예, 잊어 버렸습니다 interact. 업데이트되었습니다.
Ray

5

루비, 333 바이트

l=['']+%w{un deux trois quatre cinq six sept huit neuf dix onze douze treize quatorze quinze seize}
d=%w{vingt trente quarante cinquante soixante _ quatre-vingt}+['']*2
n=gets.to_i
v=n%20
t=n%10
puts n<1?'zéro':n>99?'cent':d[(n<70?n:n-v)/10-2]+(n<21||t<1&&n<61?'':v<1??s:t==1&&n<80?' et ':?-)+(n>60||n<20?v<17?l[v]:'dix-'+l[t]:l[t])

대부분 두 개의 룩업 테이블과 모든 이상한 규칙을 인코딩하고 언제 사용할 룩업 테이블을 알려주는 삼항 연산자입니다. 더 알고 싶다면 알려주세요. ;)


1
nitpicky로 싫어하지만 80끝에 s가있는 쿼터 빙을 출력해야합니다.
NinjaBearMonkey

@ hsl은 약간 수정되었습니다.
마틴 엔더

5

파이썬-344 (348) (380) (445) (537) 바이트

골프 과정에서 도움을 주신 grc, Ray, isaacg에게 감사드립니다.

이 코드는 초기 사전 정의와 사전 요소의 정션으로 공백을 채우는 목록 이해로 구성됩니다.

repl.it 에서 온라인으로 코드를 확인할 수 있습니다

r=range
def f(a):b=a/60*10+10;d[a]=d[a-a%b]+(' et ','-')[a%10!=1or a>80]+d[a%b]
d=dict(zip(r(17)+r(20,70,10)+[80,100],'zéro un deux trois quatre cinq six sept huit neuf dix onze douze treize quatorze quinze seize vingt trente quarante cinquante soixante quatre-vingt cent'.split()))
[f(v)for v in r(100)if(v in d)<1]
d[80]+='s'
print d[input()]

이 코드를 골프화하려는 최근의 시도는 생성 프로세스를 포기하고 그 감소로 요청 된 숫자를 즉시 ​​생성하도록 기능을 세분화했습니다. 그러나 60과 80의 숫자에는 계산되지 않은 요소가 필요하기 때문에 코드를 줄이면서 그러한 함수를 만드는 것이 힘들었습니다.


3
2, 3 행 r=range에는 이 트릭 을 사용할 수 있고 들여 쓰기에는 하나의 공백 만 사용할 수 있습니다 . 그리고 당신은 65 바이트를 저장할 수 있습니다d=dict(zip(r(17)+r(20,70,10)+[80,100],'zéro un deux ... quatre-vingt cent'.split()))
GRC

r=range트릭 나는 알고 있었다, 그러나 나는 1 차 개정을 쓸 때 추가하는 것을 잊었다. 다른 모든 것은 나에게 비교적 새로운 것이 었으므로 감사합니다. 참고로, print명령문이 r함수로 바뀌고 dict 의 함수가 목록으로 바뀌지 않으면 Python 3.x에서 코드가 작동하지 않습니다 .
Doktoro Reichard

파이썬 필요하지 않은 2에서 int(input()), input()충분하다.
Ray

1
좀 더 팁 : 당신이 세우면 내 생각 b=a/60*10+10f(a)당신이 사용할 수 a-a%ba%b당신의 사전 키에 대해. 또한에 공백이 필요하지 않으며 1 or4 번째 줄을으로 줄일 수 있습니다 [f(v)for v in r(100)if v not in d]. 나는 이것을 시도하지 않았다.
grc

1
if v not in d-> if(v in d)<1문자를 저장합니다. 세미콜론으로 함수의 두 부분을 분리하면 한 줄에 모두 넣을 수 있습니다.
isaacg

4

파이썬-392 바이트

여기에는 다른 숫자를 생성하는 데 사용되는 기본 번호가있는 목록이 있습니다. 대부분의 생성 논리는 조건부에 대한 목록 인덱싱을 사용하여 2 행의 목록 이해에 있습니다. 목록이 생성되면 입력 한 번호를 찾아 인쇄합니다.

편집 : grc의 팁을 사용하여 426 바이트에서 단축되었습니다.

a='_un_deux_trois_quatre_cinq_six_sept_huit_neuf_dix_onze_douze_treize_quatorze_quinze_seize_dix-sept_dix-huit_dix-neut'.split('_')
a+=[[['vingt','trente'],['quarante','cinquante'],['soixante']*2,[a[4]+'-vingt']*2][b][c>9]+['','-',' et '][(c%[10,20][b>1]>0)+(c%10==1)*(b<3)]+a[c%[10,20][b>1]]for b in[0,1,2,3]for c in range(20)]
a[0]='zéro'
a[80]+='s'
a+=['cent']
print(a[int(input())])

1
a='_un_deux_trois ... quinze_seize'.split('_')
grc

5
오타가 있습니다 : ciquante , n 이 없습니다.
AL

바이트 수는 실제로 420보다 적습니다.
Ray

1

파이썬 3 (503 바이트)

bzip2를 사용하여 테이블을 압축 한 다음 ascii85 인코딩을 사용하여 결과를 저장하십시오. 테이블은 다음과 같습니다

zéro
un
deux
trois
quatre
cinq
...
cent

매우 순진한 방법이지만 그렇게 나쁘지는 않습니다.

골프

import bz2,base64 as B
print(bz2.decompress(B.a85decode('6<\\%_0gSqh;d"=$\\VU:fOjTBn&3p:MiVu^S+:%s4!Q6o8\\8%r<Bp,5\\LT&Q+19!OmJC@3n\'bD<]UHekq<8OP<;]9BZ,;>836X4<[@KJ,)FsD^8j9Q=]O]&/8\'rjSK&0Sh0W[ru0E0!!M-tL69NZF6N\'Lc#$Q=?S_P0+uEZP"[H;%Ucch??nYC76\'k<)isZIBqqOKi(,IHp""^8d/EqRpc_I<IRj[\'4KB`/."%5,"pjr&27q+&t.6J+ik=Jdd2A)j]\'jt5ts0>:sr9.@E>V0F9L?9r&pX\'E.NUP:r&?>\'*(gKmd;/1QkUb*1&JhfWiE7Kl,P,o1go+.3O&l))Y,$/PO)%"al^4H2,n-l\\PuM!W1rBB9t.,U>DhAs83burMn(%%-qHG<gr+^')).decode().split('\n')[int(input())])

언 골프

import bz2, base64
s = '6<\\%_0gSqh;d"=$\\VU:fOjTBn&3p:MiVu^S+:%s4!Q6o8\\8%r<Bp,5\\LT&Q+19!OmJC@3n\'bD<]UHekq<8OP<;]9BZ,;>836X4<[@KJ,)FsD^8j9Q=]O]&/8\'rjSK&0Sh0W[ru0E0!!M-tL69NZF6N\'Lc#$Q=?S_P0+uEZP"[H;%Ucch??nYC76\'k<)isZIBqqOKi(,IHp""^8d/EqRpc_I<IRj[\'4KB`/."%5,"pjr&27q+&t.6J+ik=Jdd2A)j]\'jt5ts0>:sr9.@E>V0F9L?9r&pX\'E.NUP:r&?>\'*(gKmd;/1QkUb*1&JhfWiE7Kl,P,o1go+.3O&l))Y,$/PO)%"al^4H2,n-l\\PuM!W1rBB9t.,U>DhAs83burMn(%%-qHG<gr+^'
table = bz2.decompress(base64.a85decode(s)).decode().split('\n')
num = int(input())
print(table[num])

보너스

압축 된 문자열에서 "Vim"이라는 단어를 찾을 수 있습니까?


1
나는 아주 좋아한다 Sh0W. Vim을 찾을 수 없었습니다.
tomsmeding

@tomsmeding 얼마나 유감! 마지막 편집 후 Vim이 사라졌습니다.
Ray

1

세게 때리다, 456440421 408

유효한 입력을 가정합니다 (정수 0부터 100까지의 정수).

v=`sed 's/0*//'<<<$1`
f=('' dix vingt trente quarante cinquante soixante soixante-dix quatre-vingts quatre-vingt-dix)
s=('' ' et un' -deux -trois -quatre -cinq -six -sept -huit -neuf)
o=${f[${v: -2:1}]}${s[${v: -1:1}]}
[ "${o:0:1}" = \  ]&&o=un
((v>99))&&o=cent
sed 's/^-//
s/s-/-/
s/s et /-/
s/dix et un/onze/
s/di.*ux/douze/
s/d.*s$/treize/
s/d.*re/quatorze/
s/d.*q/quinze/
s/di.*ix/seize/'<<<${o:-zéro}

1

JavaScript 459 (낙타 케이싱 없음)

@ edc65는 당신에게서 그것을 취할 수 없습니다 ...;)

A="0un0deux0trois0quatre0cinq0six0sept0huit0neuf0dix0onze0douze0treize0quatorze0quinze0seize0dix-sept0dix-huit0dix-neuf".split(0);S="soixante";Q=A[4]+"-vingt";T=10;V=20;N=59;for(b=5;1<b--;)for(c=V;c--;)X=b*V+c,A[X]=[,["vingt","trente"],["quarante","cinquante"],[S,S],[Q,Q]][b][c/T|0]+(X%T?X>N?X%V==T?"-dix":"":"":"")+(1>X%T?"":(1==X%(X>N?V:T)|71==X)&81!=X?" et ":"-")+(X>N&X%V==T?"-dix":A[c%(X>N?V:T)]);A[0]="zéro";A[80]+="s";A[100]="cent";alert(A[prompt()])

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.