用法语拼写数字


23

将数字转换为英文的数字时遇到了挑战,但这太简单了。给定数字0-100,您的任务是输出相应的法语数字。与英语相比,法语数字系统背后的逻辑更为复杂:

数字数
---------------
 0zéro(注意口音)
 1个
 2倍
 3 trois
 4夸脱
 5 cinq
 6 6
 9月7日
 8点
 9块
10迪克斯
11次
12 douze
13 treize
14夸脱
15颗
16抢占
9月17日(字面上是十点七)
18 dix-huit
19 dix-neuf
20根
21 Vent等(没有连字符)
22文特
...
30个
...
40夸脱
...
50 cinquante
...
60 Soixante
...
70 soixante-dix(字面意思是六十)
71 Soixante et onze
...
80夸脱(注意s;字面意思是二十二十)
81 quatre-vingt-un(注意连字符)
...
90夸脱
91夸脱
...
99 quatre-vingt-dix-neuf(4 * 20 + 10 + 9)
100分

有关完整列表,请按照http://quizlet.com/996950/http://www.webcitation.org/6RNppaJx0)。

进一步的规则/解释

  • 当数字以1结尾时,单词EXCEPT之间总会有连字符。
  • 当数字以1结尾时,在unonze之前添加单词et(含义)。(31 = trente et un)
  • 但是,81和91的格式与其他数字相同。(81 =四分卫)
  • 在60,系统从基数10切换到基数20。
  • 网路上对此有一些细微的差异;有关问题,请参见上面链接的列表。
  • 默认情况下不允许存在漏洞
  • 禁止使用外部资源(例如网站)以及将数字转换为数字或转换为法语的任何库,API,函数等。
  • 这是,因此,字节数最少的答案将获胜。
  • 如果有的话,请链接到在线编译器,以便轻松测试您的代码。

输入项

  • 输入内容应取自您的语言,但您的语言仍需输入。(STDIN,命令行等)
  • 输入将是单个字符串,由0到100之间(包括0和100之间)的整数组成(可选的前导零)。
  • 您可以假设输入将始终格式正确。

输出量

  • 结果将以您的语言输出到最方便的方法。(STDOUT,对话框等)
  • 在输出中大小写无关紧要。

例子

针对这些测试您的代码:

输入输出
-------------
0zéro
18 dix-huit
51 cinquante等
80夸脱
91夸脱
99 quatre-vent-dix-neuf

3
请注意,法语的比利时人使用“ septante”,“ octante”和“ nonante”,而不是soixante-dix,quatre-vingt,quatre-vingt-dix。它应该在古老的比利时殖民地中使用。
伊曼纽尔

8
+1是用法语做的天才。正如我的一位德国同事所说:“德语说的是倒数。但是要了解法语,您需要一个计算器。”
级圣河

1
看起来zéro是0-100范围内唯一的重音数字。这不是标准的ASCII字符。我假设可以输出此字符的任何格式(代码页437,UTF-8等)都是可以接受的。
Level St

1
@Martin规则状态为“您可以假定输入将始终格式正确,”因此,输入> 100可能会导致任何行为。
NinjaBearMonkey

3
法国体系背后绝对没有逻辑。我确信99%的法国支票都有错误,这在100后会更加复杂。共舞也是一场噩梦。相信我,我是法国人。
Michael M.

Answers:


7

的JavaScript(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:Zéro,1:Un,2:Deux,3:Trois,4:Quatre,5:Cinq,6:6、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-6、27:Vingt-Sept,28:Vingt- Huit,29:Vingt-Neuf,
30:特伦特,31:特伦特等,32:特伦特-德伊斯,33:特伦特-特鲁瓦,34:特伦特-夸特,35:特伦特-辛克,36:特伦特-六岁,37:特伦特-九月,38:特伦特-惠特,39:特伦特-纽夫,
40:Quarante,41:Quarante-Unux,42:Quarante-Deux,43:Quarante-Trois,44:Quarante-Quatre,45:Quarante-Cinq,46:Quarante-6,47:Quarante-Sept,48:Quarante- Huit,49岁:Quarante-Neuf,
50:Cinquante,51:Cinquante-Deux,52:Cinquante-Trouis,53:Cinquante-Trois,54:Cinquante-Quatre,55:Cinquante-Cinq,56:Cinquante-6,57:Cinquante-Sept,58:Cinquante-惠特,59:辛奎特-纽夫,
60:索ixante,61:Soixante et Un,62:Soixante-Deux,63:Soixante-Trois,64:Soixante-Quatre,65:Soixante-Cinq,66:Soixante-Six,67:Soixante-Sept,68:Soixante-惠特,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-Vingt-Un,81:Quatre-Vingt-Un,82:Quatre-Vingt-Deux,83:Quatre-Vingt-Trois,84:Quatre-Vingt-Quatre,85:Quatre-Vingt-Cinq,86:Quatre-温特六岁,87:四月-温特-九月,88:四人-温特-惠特,89:四人-温特-纽夫,
90:夸特-温格-迪克斯(Quatre-Vingt-Dix),91:夸特-温特-昂兹,92:夸特-温特-杜兹,93:夸特-温特-特雷泽,94:夸特-温特-Quatorze,95:夸特-温特-奎特泽,96: Quatre-Vingt-Seize,97:Quatre-Vingt-Dix-sept,98:Quatre-Vingt-Dix-huit,99:Quatre-Vingt-Dix-neuf, 
“分”

2
骆驼案子的绝招!
tomsmeding

@tomsmeding真的很酷,所以显然不是我设计的(帖子中增加了信用)
edc65

@ edc65您介意我是否尝试以此来改善我的Ruby答案?编写我的代码时,我什至没有看到不区分大小写的输出。^^
Martin Ender

@MartinBüttner当然可以了
edc65

6

Haskell,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替​​换main=interact$f.read并保存一些字符。
gxtaillon 2014年

@gxtaillon是的,我忘了interact。更新。
2014年

5

Ruby,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
讨厌讨厌挑剔,但80应该输出四分音符,末尾带有s。
NinjaBearMonkey 2014年

@hsl固定并缩短了一点。
Martin Ender 2014年

5

Python-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
您可以使用r=range此技巧适用于第2行和第3行,并且只有一个空格用于缩进。您可以使用d=dict(zip(r(17)+r(20,70,10)+[80,100],'zéro un deux ... quatre-vingt cent'.split()))
grc 2014年

r=range我知道的技巧,但是在编写第一个修订版时忘了添加。对我而言,其他所有内容都是相对较新的,所以谢谢。不过请注意,除非将print语句转换为函数并将rdict中的函数转换为列表,否则代码在Python 3.x上不起作用。
Doktoro Reichard 2014年

在python 2中,您不需要int(input())input()就足够了。

1
一些其他提示:我认为,如果您输入b=a/60*10+10f(a)则可以使用a-a%ba%b作为字典键。另外,您不需要中的空格1 or,并且第4行可以缩短为[f(v)for v in r(100)if v not in d]。我还没有尝试过。
grc 2014年

1
if v not in d-> if(v in d)<1保存一个字符。如果用分号分隔函数的两个部分,则可以将它们全部放在一行上。
isaacg

4

Python-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
有一个错字:ciquanten缺失。
AL

您的字节数实际上是420,少于说明的数目。
2014年

1

Python 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消失了。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.