Đánh vần số trong tiếng Pháp


23

Có một thách thức để chuyển đổi một số thành số bằng tiếng Anh , nhưng điều đó quá đơn giản. Cho số 0 0100100, nhiệm vụ của bạn là xuất ra số tương ứng bằng tiếng Pháp. Hệ thống chữ số tiếng Pháp có logic phức tạp hơn đằng sau nó so với tiếng Anh:

Số số
---------------
 0 zéro (lưu ý dấu)
 1 un
 2 deux
 3 quân
 4 quatre
 5 rạp chiếu phim
 6 sáu
 7 tháng
 8 giờ
 9 neuf
10 dix
11 giờ
12 nhân đôi
13 treize
14 quatorze
15 quinze
16 nắm bắt
17 dix-sept (nghĩa đen là mười bảy)
18 dix-huit
19 dix-neuf
20 vingt
21 vingt et un (không có dấu gạch ngang)
22 vingt-deux
...
30 trượng
...
40 kiểm dịch
...
50 rạp chiếu phim
...
60 soixante
...
70 soixante-dix (nghĩa đen là sáu mươi mười)
71 soixante et onze
...
80 quatre-vingts (lưu ý s; nghĩa đen là bốn mươi)
81 quatre-vingt-un (lưu ý các dấu gạch nối)
...
90 quatre-vingt-dix
91 quatre-vingt-onze
...
99 quatre-vingt-dix-neuf (4 * 20 + 10 + 9)
100 xu

Để có danh sách đầy đủ, hãy theo dõi http://quizlet.com/996950/ ( http://www.webcitation.org/6RNppaJx0 ).

Quy tắc / giải thích thêm

  • Sẽ luôn có một dấu gạch nối giữa các từ NGOẠI TRỪ khi số kết thúc bằng 1.
  • Khi số kết thúc bằng 1, từ et (có nghĩa ) được thêm vào trước un hoặc onze . (31 = trente et un)
  • Tuy nhiên, 81 và 91 được định dạng giống như các số khác. (81 = quatre-vingt-un)
  • Ở tuổi 60, hệ thống chuyển từ cơ sở 10 sang cơ sở 20.
  • Có một số khác biệt nhỏ trên web về điều này; tham khảo danh sách liên kết ở trên cho câu hỏi.
  • Các lỗ hổng bị cấm theo mặc định không được phép.
  • Không được phép sử dụng nguồn bên ngoài như trang web, cũng như bất kỳ thư viện, API, hàm hoặc tương tự chuyển đổi số thành chữ số hoặc dịch sang tiếng Pháp.
  • Đây là , vì vậy câu trả lời có ít byte nhất sẽ thắng.
  • Nếu có sẵn, vui lòng liên kết với trình biên dịch trực tuyến để cho phép kiểm tra mã của bạn dễ dàng.

Đầu vào

  • Đầu vào sẽ được lấy từ tuy nhiên ngôn ngữ của bạn có đầu vào. (STDIN, dòng lệnh, v.v.)
  • Đầu vào sẽ là một chuỗi đơn, bao gồm toàn bộ số từ 0 đến 100, bao gồm (các số 0 đứng đầu tùy chọn).
  • Bạn có thể giả định đầu vào sẽ luôn được định dạng tốt.

Đầu ra

  • Kết quả sẽ là đầu ra cho phương thức thuận tiện nhất cho ngôn ngữ của bạn. (STDOUT, hộp thoại, v.v.)
  • Trường hợp không quan trọng trong đầu ra.

Ví dụ

Kiểm tra mã của bạn chống lại những điều này:

Đầu ra đầu vào
-------------
0 zéro
18 dix-huit
51 rạp chiếu phim
80 quatre-vingts
91 quatre-vingt-onze
99 quatre-vingt-dix-neuf

3
Lưu ý rằng người Bỉ nói tiếng Pháp sử dụng "septante", "octante" và "nonante" thay vì soixante-dix, quatre-vingts, quatre-vingt-dix. Nó nên được sử dụng để ở thuộc địa Bỉ cổ đại.
Emmanuel

8
+1 cho thiên tài làm điều này bằng tiếng Pháp. Như một đồng nghiệp người Đức của tôi đã nói: "Người Đức nói những con số ngược. Nhưng để hiểu tiếng Pháp, bạn cần một máy tính."
Cấp sông St

1
Có vẻ như zéro là số có dấu duy nhất trong khoảng 0-100. Đây không phải là một ký tự ASCII tiêu chuẩn. Tôi giả sử bất kỳ định dạng nào (trang mã 437, UTF-8, v.v.) có thể xuất ký tự này đều được chấp nhận.
Cấp sông St

1
@Martin Trạng thái quy tắc "Bạn có thể giả sử đầu vào sẽ luôn được định dạng tốt", vì vậy đầu vào> 100 có thể dẫn đến bất kỳ hành vi nào.
NinjaBearMonkey

3
Hoàn toàn không có logic đằng sau hệ thống tiếng Pháp. Tôi chắc chắn có một lỗi trong 99% séc tiếng Pháp, điều này thậm chí còn phức tạp hơn sau 100. Kết hợp cũng là một cơn ác mộng. Tin tôi đi, tôi là người Pháp.
Michael M.

Câu trả lời:


7

JavaScript (ES6) 318 321

Chỉnh sửa sửa lỗi (quản lý 0 hàng đầu) và chơi gôn nhiều hơn

Tín dụng cho trường hợp lừa lạc đà @ Core1024

Với đầu vào / đầu ra thông qua cửa sổ bật lên

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')))

Là một chức năng có thể kiểm tra

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')
)

Để kiểm tra trong bảng điều khiển FireFox hoặc 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')

Kiểm tra đầu ra

0: Zéro, 1: Un, 2: Deux, 3: Trois, 4: Quatre, 5: Cinq, 6: Six, 7: 9, 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: Trente- Huit, 39: Trente-Neuf,
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-Sept Huit, 49: Cách ly-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: Cinquante- 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: Soixante-Neuf,
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-Deux, 83: Quatre-Vingt-Trois, 84: Quatre-Vingt-Quatre, 85: Quatre-Vingt-Cin Vingt-Six, 87: Quatre-Vingt-Tháng Chín, 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 Quatre-Vingt-Seize, 97: Quatre-Vingt-Dix-sept, 98: Quatre-Vingt-Dix-huit, 99: Quatre-Vingt-Dix-neuf, 
"Cent"

2
Thủ thuật tuyệt vời với trường hợp lạc đà!
tomsmeding

@tomsmeding thực sự rất tuyệt nên rõ ràng là không được tôi nghĩ ra (thêm tín dụng vào bài đăng)
edc65

@ edc65 Bạn có phiền nếu tôi cố gắng cải thiện câu trả lời Ruby của mình không? Tôi thậm chí không thấy rằng đầu ra không phân biệt chữ hoa chữ thường được cho phép khi tôi viết của tôi. ^^
Martin Ender

@ MartinBüttner tất nhiên bạn có thể
edc65

6

Haskell, 390 byte

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

Bị đánh cắp

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

Ngôn ngữ lập trình chức năng khá phù hợp cho công việc này.


Có một upvote, bạn đã nhanh hơn tôi. Bạn có thể muốn thay thế chính bằng main=interact$f.readvà lưu một vài ký tự.
gxtaillon

@gxtaillon Vâng, tôi quên mất interact. Cập nhật.
Ray

5

Ruby, 333 byte

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])

Nó chủ yếu chỉ là hai bảng tra cứu và một nhóm các toán tử ternary mã hóa tất cả các quy tắc kỳ lạ và cho bạn biết nên sử dụng bảng tra cứu nào khi nào. Hãy cho tôi biết nếu bạn muốn biết thêm. ;)


1
Ghét là nitpicky, nhưng 80nên xuất ra quatre-vingts, với một s ở cuối.
NinjaBearMonkey

@hsl cố định và rút ngắn một chút.
Martin Ender

5

Python - 344 (348) (380) (445) (537) byte

Cảm ơn grc, Ray và isaacg vì sự giúp đỡ của họ trong quá trình chơi gôn.

Mã này bao gồm định nghĩa từ điển ban đầu và một sự hiểu biết danh sách điền vào chỗ trống với đường nối của các yếu tố của từ điển.

Bạn có thể kiểm tra mã trực tuyến tại 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()]

Những nỗ lực mới nhất của tôi để đánh golf mã này đã từ bỏ quá trình tạo và với việc giảm đó, tinh chỉnh chức năng để tạo ra số được yêu cầu tại chỗ. Tuy nhiên, vì số 60 và 80 cần các yếu tố không tính toán, cuộc đấu tranh đã tạo ra một chức năng như vậy trong khi giảm mã.


3
Bạn có thể sử dụng r=range, thủ thuật này cho dòng 2 & 3 và chỉ một khoảng trống để thụt lề. Và bạn có thể lưu 65 byte vớid=dict(zip(r(17)+r(20,70,10)+[80,100],'zéro un deux ... quatre-vingt cent'.split()))
grc

Thủ r=rangethuật tôi đã biết, nhưng quên thêm nó khi tôi viết bản sửa đổi thứ nhất. Mọi thứ khác tương đối mới với tôi, vì vậy cảm ơn theo thứ tự. Mặc dù vậy, một lưu ý, mã không hoạt động trên Python 3.x trừ khi printcâu lệnh được chuyển thành hàm và các rhàm trong dict được chuyển thành danh sách.
Doktoro Reichard

Trong python 2 bạn không cần int(input()), input()là đủ.
Ray

1
Một số mẹo khác: Tôi nghĩ rằng nếu bạn đưa b=a/60*10+10vào f(a)thì bạn có thể sử dụng a-a%ba%bcho các khóa từ điển của mình. Ngoài ra, bạn không cần không gian trong 1 orvà dòng thứ 4 có thể được rút ngắn [f(v)for v in r(100)if v not in d]. Tôi đã không thử bất kỳ điều này mặc dù.
grc

1
if v not in d-> if(v in d)<1lưu một ký tự. Nếu bạn đánh dấu chấm phẩy tách hai phần chức năng của bạn, bạn có thể đặt tất cả trên một dòng.
isaacg

4

Python - 392 byte

Nó có một danh sách với các số cơ sở mà nó sử dụng để tạo ra các số khác. Hầu hết logic thế hệ nằm trong phần hiểu danh sách trên dòng 2, sử dụng lập chỉ mục danh sách cho các điều kiện. Khi danh sách được tạo, nó sẽ tìm số đã nhập và in nó.

Chỉnh sửa: Rút ngắn từ 426 byte bằng mẹo của grc.

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
Bạn có thể lưu 23 byte vớia='_un_deux_trois ... quinze_seize'.split('_')
grc

5
Có một lỗi đánh máy: ciquante , một n bị thiếu.
AL

Số byte của bạn thực sự là 420, ít hơn so với quy định.
Ray

1

Python 3, (503 byte)

Nén bảng bằng bzip2 và sau đó sử dụng mã hóa ascii85 để lưu trữ kết quả. Bảng là:

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

Phương pháp rất ngây thơ, nhưng nó không phải là xấu.

Chơi gôn

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())])

Bị đánh cắp

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])

Tiền thưởng

Bạn có thể tìm thấy từ "Vim" trong chuỗi nén không?


1
Tôi khá thích Sh0W. Không thể tìm thấy Vim, bạn cũng không thể.
tomsmeding

@tomsmeding Thật đáng tiếc! Vim biến mất sau lần chỉnh sửa cuối cùng của tôi.
Ray

1

Bash, 456 440 421 408

Giả sử đầu vào hợp lệ (số nguyên từ 0 đến 100 với bất kỳ số 0 đầu nào).

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 (Không có vỏ lạc đà)

@ edc65 không thể lấy điều đó từ bạn ...;)

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()])

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.