Tuliskan angka dalam bahasa Prancis

23

Ada tantangan untuk mengubah angka menjadi angka dalam bahasa Inggris , tetapi itu terlalu mudah. Diberi angka 0–100, tugas Anda adalah menampilkan angka yang sesuai dalam bahasa Prancis. Sistem angka Perancis memiliki logika yang lebih kompleks di belakangnya dibandingkan dengan sistem bahasa Inggris:

Angka
---------------
 0 zéro (perhatikan aksennya)
 1 un
 2 deux
 3 trois
 4 quatre
 5 cinq
 6 enam
 7 sept
 8 huit
 9 neuf
10 dix
11 kali
12 kali lipat
13 treize
14 quatorze
15 quinze
16 rebut
17 dix-sept (harfiah sepuluh tujuh)
18 dix-huit
19 dix-neuf
20 vingt
21 vingt et un (tanpa tanda hubung)
22 vingt-deux
...
30 trente
...
40 quarante
...
50 cinquante
...
60 soixante
...
70 soixante-dix (harfiah enam puluh sepuluh)
71 soixante et onze
...
80 quatre-vingts (perhatikan huruf s; harfiah empat puluhan)
81 quatre-vingt-un (perhatikan tanda hubungnya)
...
90 quatre-vingt-dix
91 quatre-vingt-onze
...
99 quatre-vingt-dix-neuf (4 * 20 + 10 + 9)
100 sen

Untuk daftar lengkap, ikuti http://quizlet.com/996950/ ( http://www.webcitation.org/6RNppaJx0 ).

Aturan / penjelasan lebih lanjut

  • Akan selalu ada tanda hubung antara kata-kata KECUALI ketika angka berakhir dengan 1.
  • Ketika angka berakhir pada 1, kata et (makna dan ) ditambahkan sebelum un atau onze . (31 = trente et un)
  • Namun, 81 dan 91 diformat sama dengan angka lainnya. (81 = quatre-vingt-un)
  • Pada usia 60, sistem beralih dari basis 10 ke basis 20.
  • Ada beberapa perbedaan kecil di web tentang ini; lihat daftar yang ditautkan di atas untuk pertanyaan.
  • Celah yang dilarang secara default tidak diizinkan.
  • Dilarang menggunakan sumber eksternal seperti situs web, serta perpustakaan, API, fungsi, atau sejenisnya yang mengubah angka menjadi angka atau menerjemahkan ke bahasa Prancis.
  • Ini adalah , jadi jawabannya dengan byte paling sedikit menang.
  • Jika tersedia, harap tautkan ke kompiler online untuk memudahkan pengujian kode Anda.

Memasukkan

  • Input harus diambil dari bahasa yang Anda gunakan. (STDIN, baris perintah, dll.)
  • Input akan berupa string tunggal, yang terdiri dari seluruh angka antara 0 dan 100 inklusif (memimpin nol opsional).
  • Anda dapat berasumsi bahwa input akan selalu terbentuk dengan baik.

Keluaran

  • Hasilnya harus berupa output ke metode yang paling nyaman untuk bahasa Anda. (STDOUT, kotak dialog, dll.)
  • Kasus tidak menjadi masalah dalam output.

Contohnya

Uji kode Anda terhadap ini:

Input output
-------------
0 zéro
18 dix-huit
51 cinquante et un
80 quatre-vingts
91 quatre-vingt-onze
99 quatre-vingt-dix-neuf
NinjaBearMonkey
sumber
3
Perhatikan bahwa orang-orang Belgia berbahasa Perancis menggunakan "septante", "octante" dan "nonante" sebagai ganti soixante-dix, quatre-vingts, quatre-vingt-dix. Ini harus digunakan di koloni Belgia kuno.
Emmanuel
8
+1 untuk jenius melakukan ini dalam bahasa Prancis. Seperti yang dikatakan oleh seorang kolega saya di Jerman: "Orang Jerman mengatakan angka-angka mundur. Tetapi untuk memahami bahasa Prancis, Anda memerlukan kalkulator."
Level River St
1
Sepertinya zéro adalah satu-satunya nomor beraksen di kisaran 0-100. Ini bukan karakter ASCII standar. Saya menganggap format apa pun (kode halaman 437, UTF-8, dll) yang dapat menampilkan karakter ini dapat diterima.
Level River St
1
@ Martin Aturan menyatakan "Anda dapat menganggap input akan selalu terbentuk dengan baik," sehingga input> 100 dapat menghasilkan perilaku apa pun.
NinjaBearMonkey
3
Sama sekali tidak ada logika di balik sistem Perancis. Saya yakin ada kesalahan dalam 99% dari cek Prancis, ini bahkan lebih rumit setelah 100. Konugaison juga merupakan mimpi buruk. Percayalah, saya orang Prancis.
Michael M.

Jawaban:

7

JavaScript (ES6) 318 321

Edit perbaikan Bug (mengelola 0s terkemuka) dan pegolf lainnya

Penghargaan untuk trik kasus unta @ Core1024

Dengan input / output melalui popup

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

Sebagai fungsi yang dapat diuji

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

Untuk menguji In FireFox console atau 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')

Output Uji

0: Zéro, 1: Un, 2: Deux, 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-September, 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-September, 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-Enam, 47: Quarante-Sept, 48: Quarante-Sept, 48: Quarante- Huit, 49: Quarante-Neuf,
50: Cinquante, 51: Cinquante et Un, 52: Cinquante-Deux, 53: Cinquante-Trois, 54: Cinquante-Quatre, 55: Cinquante-Cinq, 56: Cinquante-Six, 57: 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-Cinq, 86: Quatre- 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, 
"Sen"
edc65
sumber
2
Trik keren dengan kasing unta!
tomsmeding
@tomsmeding benar-benar keren jadi jelas tidak dirancang oleh saya (menambahkan kredit dalam pos)
edc65
@ edc65 Apakah Anda keberatan jika saya mencoba meningkatkan jawaban Ruby saya dengan itu? Saya bahkan tidak melihat bahwa output case-insensitive diperbolehkan ketika saya menulis milik saya. ^^
Martin Ender
@ MartinBüttner tentu saja Anda bisa
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

Tidak disatukan

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

Bahasa pemrograman fungsional cukup cocok untuk pekerjaan ini.

sinar
sumber
Dapatkan upvote, Anda lebih cepat dari saya. Anda mungkin ingin mengganti main Anda dengan main=interact$f.readdan menyimpan beberapa karakter.
gxtaillon
@ gxtaillon Ya, saya lupa interact. Diperbarui.
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])

Sebagian besar hanya dua tabel pencarian dan sekelompok operator ternary yang menyandikan semua aturan aneh dan memberi tahu Anda tabel pencarian yang harus digunakan kapan. Beri tahu saya jika Anda ingin tahu lebih banyak. ;)

Martin Ender
sumber
1
Benci menjadi nitpicky, tetapi 80harus menampilkan quatre-vingts, dengan huruf s pada akhirnya.
NinjaBearMonkey
@ hsl diperbaiki dan dipersingkat sedikit.
Martin Ender
5

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

Terima kasih kepada grc, Ray dan isaacg atas bantuan mereka dalam proses bermain golf.

Kode terdiri dari definisi kamus awal dan pemahaman daftar yang mengisi kekosongan dengan persimpangan elemen kamus.

Anda dapat memeriksa kode secara online di 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()]

Upaya terakhir saya untuk bermain golf kode ini adalah untuk mengabaikan proses pembuatan dan dengan pengurangan itu memperbaiki fungsi untuk hanya menghasilkan nomor yang diminta di tempat. Namun, karena angka 60 dan 80-an membutuhkan elemen yang tidak dihitung, perjuangannya adalah menciptakan fungsi seperti itu sambil mengurangi kode.

Doktoro Reichard
sumber
3
Anda dapat menggunakan r=range, trik ini untuk baris 2 & 3, dan hanya satu ruang untuk lekukan. Dan Anda dapat menghemat 65 byte dengand=dict(zip(r(17)+r(20,70,10)+[80,100],'zéro un deux ... quatre-vingt cent'.split()))
grc
The r=rangetrick aku menyadari, tapi lupa untuk menambahkannya ketika saya menulis revisi 1. Segala sesuatu yang lain relatif baru bagi saya, jadi terima kasih sudah teratur. Namun catatan, kode tersebut tidak berfungsi pada Python 3.x kecuali printpernyataan tersebut diubah menjadi fungsi dan rfungsi dalam dict diubah menjadi daftar.
Doktoro Reichard
Dalam python 2 Anda tidak perlu int(input()), input()sudah cukup.
Ray
1
Beberapa tips: Saya pikir jika Anda menempatkan b=a/60*10+10di f(a)maka Anda bisa menggunakan a-a%bdan a%buntuk kunci kamus Anda. Juga, Anda tidak perlu ruang dalam 1 or, dan baris ke-4 dapat disingkat [f(v)for v in r(100)if v not in d]. Saya belum mencoba semua ini.
grc
1
if v not in d-> if(v in d)<1menyimpan karakter. Jika Anda titik koma memisahkan dua bagian dari fungsi Anda, Anda bisa meletakkan semuanya pada satu baris.
isaacg
4

Python - 392 byte

Ini memiliki daftar dengan angka dasar yang digunakan untuk menghasilkan angka lainnya. Sebagian besar logika generasi ada dalam pemahaman daftar pada baris 2, menggunakan pengindeksan daftar untuk persyaratan. Setelah daftar dihasilkan, kemudian mencari nomor yang dimasukkan dan mencetaknya.

Sunting: Dipendekkan dari 426 byte menggunakan ujung 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())])
faubi
sumber
1
Anda dapat menyimpan 23 byte dengana='_un_deux_trois ... quinze_seize'.split('_')
grc
5
Ada salah ketik: ciquante , n hilang.
AL
Jumlah byte Anda sebenarnya 420, kurang dari yang disebutkan.
Ray
1

Python 3, (503 bytes)

Kompres tabel menggunakan bzip2 dan kemudian gunakan pengkodean ascii85 untuk menyimpan hasilnya. Tabelnya adalah:

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

Metode yang sangat naif, tetapi tidak seburuk itu.

Golf

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

Tidak disatukan

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

Bonus

Bisakah Anda menemukan kata "Vim" di string yang dikompresi?

sinar
sumber
1
Saya cukup suka Sh0W. Tidak dapat menemukan Vim, juga tidak bisa.
tomsmeding
@tomsmeding Sayang sekali! Vim menghilang setelah edit terakhir saya.
Ray
1

Pesta, 456 440 421 408

Mengasumsikan input yang valid (bilangan bulat dari 0 hingga 100 dengan angka nol terkemuka mana pun).

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}

sumber
1

JavaScript 459 (Tanpa Casing Unta)

@ edc65 tidak dapat mengambilnya dari Anda ...;)

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

WallyWest
sumber