フランス語で数字を綴る


23

英語数字を数字に変換するという課題がありましたが、それはあまりにも簡単でした。0〜100の数字を指定すると、対応する数字をフランス語で出力することになります。フランスの数字システムは、英語の数字システムと比較して、その背後にあるより複雑なロジックを持っています。

数字
---------------
 0ゼロ(アクセントに注意)
 1国連
 2ドゥ
 3トロワ
 4キャトル
 5チンク
 6 6
 9月7日
 8 huit
 9ヌーフ
10ディックス
11オンズ
12ダウズ
13トライズ
14クォート
15キンゼ
16つかむ
9月17日(文字通り10 7)
18 dix-huit
19ディックスニューフ
20ヴィント
21 vingt et un(ハイフンなし)
22ヴィントドゥ
...
30トレンテ
...
40隔離
...
50シンカンテ
...
60ソイシャンテ
...
70 soixante-dix(文字通り60)
71 soixante et onze
...
80 quatre-vingts(sに注意してください、文字通り4代)
81 quatre-vingt-un(ハイフンに注意してください)
...
90 quatre-vingt-dix
91 quatre-vingt-onze
...
99 quatre-vingt-dix-neuf(4 * 20 + 10 + 9)
100セント

完全なリストについては、http://quizlet.com/996950/http://www.webcitation.org/6RNppaJx0)に従ってください

さらなるルール/説明

  • 数字が1で終わる場合を除き、単語間には常にハイフンがあります。
  • 番号が1で終わるとき、unまたはonzeの前に単語etおよびandを意味する)が追加されます。(31 = trente et un)
  • ただし、81と91は他の数値と同じ形式です。(81 = quatre-vingt-un)
  • 60で、システムはベース10からベース20に切り替わります。
  • これについては、ウェブ全体で若干の不一致があります。質問については、上記のリンクのリストを参照してください。
  • デフォルトで禁止されている抜け穴は許可されていません。
  • Webサイトなどの外部ソース、および数字を数字に変換したりフランス語に翻訳したりするライブラリ、API、関数などを使用することは許可されていません。
  • これはであるため、バイト数が最も少ない答えが優先されます。
  • 可能な場合は、オンラインコンパイラにリンクして、コードを簡単にテストできるようにしてください。

入力

  • 入力は、あなたの言語が入力を取得するものから取得されます。(STDIN、コマンドラインなど)
  • 入力は、0〜100の整数(先頭のゼロはオプション)で構成される単一の文字列になります。
  • 入力は常に整形式であると想定できます。

出力

  • 結果は、あなたの言語にとって最も便利な方法で出力されます。(STDOUT、ダイアログボックスなど)
  • 出力では大文字と小文字は区別されません。

これらに対してコードをテストします。

入出力
-------------
0ゼロ
18 dix-huit
51 cinquante et un
80キャトルビング
91 quatre-vingt-onze
99 quatre-vingt-dix-neuf

3
フランス語圏のベルギー人は、soixante-dix、quatre-vingts、quatre-vingt-dixの代わりに「septante」、「octante」、「nonante」を使用することに注意してください。古代ベルギーの植民地で使用する必要があります。
エマニュエル14

8
フランス語でこれを行う天才のために+1。私のドイツの同僚が言ったように:「ドイツ人は数字を逆に言います。しかし、フランス語を理解するには、電卓が必要です。」
レベルリバーセント14

1
0〜100の範囲のアクセント付き数字はzéroのみです。これは標準のASCII文字ではありません。この文字を出力できる任意の形式(コードページ437、UTF-8など)が受け入れられると思います。
レベル川セント14

1
@Martinルールには「入力は常に整形式であると想定できます」と記載されているため、入力が100を超えると、どのような動作にもなります。
NinjaBearMonkey

3
フランスのシステムの背後には絶対にロジックはありません。フランスの小切手の99%に間違いがあると確信しています。これは100を超えるとさらに複雑になります。この共役も悪夢です。私を信じて、私はフランス人です。
マイケルM. 14

回答:


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: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:トレンテ、31:トレンテとウン、32:トレンテ-デュー、33:トレンテ-トロイ、34:トレンテ-クアントレ、35:トレンテ-チンク、36:トレンテ-シックス、37:トレンテ-9月、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:Quarante-Neuf、
50: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:シンカンテヌーフ、
60:Soixante-61、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-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-Quatre、85:Quatre-Vingt-Cinq、85:Quatre-Vingt-Cinq、86:Quatre-Vingt-Cruq Vingt-Six、87:Quatre-Vingt-Sept、88:Quatre-Vingt-Huit、89:Quatre-Vingt-Neuf、
90:Quatre-Vingt-Quixze、95:Quatre-Vingt-Quinze、96:Quatre-Vingt-Donze、92:Quatre-Vingt-Douze、92:Quatre-Vingt-Duze、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それでRubyの答えを改善しようとしても構いませんか?私が書いたとき、大文字と小文字を区別しない出力が許可されていることすら知りませんでした。^^
マーティン・エンダー14

@MartinBüttnerもちろんできます
edc65 14

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=interact$f.read、いくつかの文字を保存することもできます。
gxtaillon 14

@gxtaillonはい、忘れましたinteract。更新しました。
レイ14

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

ほとんどの場合、2つのルックアップテーブルと、すべての奇妙なルールをエンコードし、どのルックアップテーブルをいつ使用するかを指示する一連の三項演算子です。もっと知りたいなら教えてください。;)


1
気難しいのは嫌いですが80、最後にsを付けてquatre-vingtsを出力する必要があります。
NinjaBearMonkey 14

@hslを修正し、少し短縮しました。
マーティンエンダー14

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行目に使用でき、インデントには1つのスペースしか使用できません。そして、あなたは、65のバイトを保存することができますd=dict(zip(r(17)+r(20,70,10)+[80,100],'zéro un deux ... quatre-vingt cent'.split()))
GRC

r=rangeトリックは、私が知っていたが、私は第一改正を書いたときにそれを追加するのを忘れ。他のすべては私にとって比較的新しいものだったので、感謝しています。ただし、printステートメントがr関数に変換され、dict の関数がリストに変換されない限り、Python 3.xではコードは機能しません。
ドクトロライチャード14

python 2 int(input())では、必要ありません、input()十分です。
レイ14

1
いくつかのより多くのヒントは:あなたが入れた場合、私は思うb=a/60*10+10f(a)、あなたが使用することができますa-a%bし、a%bあなたの辞書のキーに。また、のスペースは必要ありません。4 1 or行目はに短縮できます[f(v)for v in r(100)if v not in d]。私はこれを試したことはありません。
GRC

1
if v not in d-> if(v in d)<1キャラクターを保存します。関数の2つの部分をセミコロンで区切る場合、すべてを1行に配置できます。
isaacg 14

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
あなたは、23のバイトを保存することができますa='_un_deux_trois ... quinze_seize'.split('_')
GRC

5
タイプミスがあります:ciquante、a nがありません。
AL

バイト数は実際には420であり、記載されている数よりも少なくなっています。
レイ14

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は最後の編集後に消えました。
レイ14

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.