Fransızcadaki sayıları hecele


23

Bir sayıyı İngilizce'deki rakamına dönüştürmek zor oldu , ancak bu çok basitti. 0-100 arasında bir sayı verildiğinde göreviniz, ilgili rakamı Fransızca olarak vermektir. Fransız sayısal sistemin arkasında İngilizceye göre daha karmaşık bir mantık var:

Sayı rakamı
---------------
 0 sıfır (aksana dikkat)
 1 un
 2 deux
 3 trois
 4 kat
 5 cinq
 6 altı
 7 sept
 8 huit
 9 neuf
10 dix
11 onze
12 duz
13 treize
14 quatorze
15 quinze
16 ele geçirmek
17 dix-sept (kelimenin tam anlamıyla on yedi)
18 dix-huit
19 dix-neuf
20 vingt
21 vingt et un (tire yok)
22 vingt-deux
...
30 trente
...
40 karantina
...
50 cinquante
...
60 soixante
...
70 soixante-dix (kelimenin tam anlamıyla altmış on)
71 soixante et onze
...
80 quatre-vingts (s; tam anlamıyla dört yirmili not edin)
81 quatre-vingt-un (tire işaretine dikkat edin)
...
90 quatre-vingt-dix
91 quatre-vingt-onze
...
99 quatre-vingt-dix-neuf (4 * 20 + 10 + 9)
100 kuruş

Tam bir liste için http://quizlet.com/996950/ ( http://www.webcitation.org/6RNppaJx0 ) izleyin .

Diğer kurallar / açıklamalar

  • Sayı 1 ile bittiğinde, EXCEPT kelimeleri arasında her zaman bir tire olacaktır.
  • Sayı 1 ile bittiğinde, et (anlam ve ) kelimesi un veya onze'den önce eklenir . (31 = trente ve diğerleri)
  • Bununla birlikte, 81 ve 91 diğer numaralarla aynı şekilde biçimlendirilir. (81 = quatre-vingt-un)
  • 60'da, sistem taban 10'dan taban 20'ye geçer.
  • Bu konuda web genelinde bazı küçük tutarsızlıklar vardır; Sorular için yukarıda verilen listeye bakın.
  • Varsayılan olarak yasaklanan boşluklara izin verilmez.
  • Web sitesi gibi harici bir kaynağın yanı sıra sayıları sayılara dönüştüren veya Fransızca'ya çeviren kitaplıklar, API'ler, işlevler veya benzerleri kullanılamaz.
  • Bu , bu yüzden en az bayt olan cevap kazanıyor.
  • Varsa, kodunuzun kolayca test edilmesini sağlamak için lütfen bir çevrimiçi derleyiciye bağlanın.

Giriş

  • Diliniz girdi alsa da girdi alınacaktır. (STDIN, komut satırı vb.)
  • Girdi, 0 ile 100 arasında bir tam sayıdan oluşan tek bir dize olacaktır (isteğe bağlı baştaki sıfırlar).
  • Girişin her zaman iyi biçimlendirileceğini varsayabilirsiniz.

Çıktı

  • Sonuç, diliniz için en uygun yönteme verilecektir. (STDOUT, iletişim kutusu vb.)
  • Case çıktıda önemli değil.

Örnekler

Kodunuzu bunlara karşı test edin:

Giriş çıkış
-------------
0 sıfır
18 dix-huit
51 cinquante et un
80 dörtlü vingt
91 quatre-vingt-onze
99 quatre-vingt-dix-neuf

3
Fransızca konuşan Belçikalıların, soixante-dix, quatre-vingts, quatre-vingt-dix yerine "septante", "octante" ve "nonante" kullandığını unutmayın. Eski Belçika kolonisinde kullanılmalı.
Emmanuel,

8
Bunu Fransızca yapmak dahi için +1. Bir Alman meslektaşımın dediği gibi: "Almanlar rakamları geriye doğru söylüyorlar. Fakat Fransızları anlamak için bir hesap makinesine ihtiyacınız var."
Level River St

1
Görünüşe göre sıfır 0-100 aralığında tek aksanlı sayı sıfırdır. Bu standart bir ASCII karakteri değil. Bu karakteri çıkarabilecek herhangi bir formatın (kod sayfası 437, UTF-8, vb.) Kabul edilebilir olduğunu kabul ediyorum.
Level River St

1
@Martin "Girdiyi her zaman iyi biçimlendireceğinizi varsayabilirsin" kurallarını belirtir, böylece girdi> 100 herhangi bir davranışla sonuçlanabilir.
NinjaBearMonkey 31:14

3
Fransız sisteminin arkasında kesinlikle hiçbir mantık yoktur. Fransız çeklerinin% 99'unda bir hata olduğundan eminim, bu 100'den sonra daha da karmaşık. Eşzamanlılık da bir kabus. Güven bana, ben fransızım.
Michael M.,

Yanıtlar:


7

JavaScript (ES6) 318 321

Düzenleme Hata düzeltme (bir 0 yöneten) ve golfed daha

Deve davası numarası için @ Core1024

Popup ile giriş / çıkış

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

Test edilebilir bir fonksiyon olarak

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 konsolu veya FireBug’da test etmek için

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

Test Çıkışı

0: Sıfır, 1: Un, 2: Deux, 3: Trois, 4: Quatre, 5: Cinq, 6: Altı, 7: Eylül, 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 ve Un, 22: Vingt-Deux, 23: Vingt-Trois, 24: Vingt-Quatre, 25: Vingt-Cinq, 26: Vingt-Altı, 27: Vingt-Eylül, 28: Vingt- Huit, 29: Vingt-Neuf,
30: Trente, 31: Trente ve Un, 32: Trente-Deux, 33: Trente-Trois, 34: Trente-Quatre, 35: Trente-Cinq, 36: Trente-Altı, 37: Trente-Eylül, 38: Trente- Huit, 39: Trente-Neuf,
40: Karantina, 41: Karantina ve Un, 42: Karantina-Deux, 43: Karantina-Trois, 44: Karantina-Kuatre, 45: Karantina-Cinq, 46: Karantina-Altı, 47: Karantina-Eylül, 48: Karantina- Büyük, 49: Karantina-Neuf,
50: Cinquante, 51: Cinquante ve Un, 52: Cinquante-Deux, 53: Cinquante-Trois, 54: Cinquante-Quatre, 55: Cinquante-Cinq, 56: Cinquante-Altı, 57: Cinquante-Eylül, 58: Cinquante- Huit, 59: Cinquante-Neuf,
60: Soixante, 61: Soixante ve Un, 62: Soixante-Deux, 63: Soixante-Trois, 64: Soixante-Quatre, 65: Soixante-Cinq, 66: Soixante-Altı, 67: Soixante-Eylül, 68: Soixante- Huit, 69: Soixante-Neuf,
70: Soixante-Dix, 71: Soixante ve 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: Dörtlü-Vingt-Cinq, 86: Quatre- Vingt-Six, 87: Quatre-Vingt-Eylül, 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, 
"Cent"

2
Deve davasında havalı numara!
Ağustos'ta

@tomsmeding gerçekten harika bir şekilde benim tarafımdan tasarlanmadı (yazıya kredi eklendi)
edc65

@ edc65 Ruby cevabımı geliştirmeye çalışmamın sakıncası var mı? Benim yazdığımda büyük-küçük harf duyarlı çıktılara bile izin verilmediğini görmedim. ^^
Martin Ender

Elbette @ MartinBüttner yapabilirsiniz
edc65 13

6

Haskell, 390 bayt

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

Ungolfed

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

İşlevsel programlama dilleri bu iş için oldukça uygundur.


Olumlu bir oyum var, benden daha hızlıydın. Ana dizinizi değiştirmek main=interact$f.readve birkaç karakter kaydetmek isteyebilirsiniz .
gxtaillon

@gxtaillon Evet, unuttum interact. Güncellenmiş.
Ray

5

Ruby, 333 bayt

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

Çoğunlukla sadece iki arama tablosu ve tüm tuhaf kuralları kodlayan ve ne zaman kullanacağınızla ilgili arama masasını söyleyen bir grup üçlü operatör var. Daha fazla bilgi edinmek istiyorsanız bana bildirin. ;)


1
80Nitpicky olmaktan nefret ediyorum, ama sonunda bir kuatre vingts çıkarmalı.
NinjaBearMonkey 31:14

@hsl sabitlendi ve biraz kısaldı.
Martin Ender

5

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

Grc sayesinde, Ray ve isaacg golf sürecindeki yardımlarından dolayı.

Kod, ilk sözlük tanımından ve sözlük öğelerinin birleşme noktasıyla boşlukları dolduran bir liste kavrayışından oluşur.

Kodu repl.it adresinden çevrimiçi olarak kontrol edebilirsiniz.

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

Bu kodu golf oynamak için en son girişimlerim, üretim sürecinden vazgeçmekti ve bu azaltma, sadece istenen sayıyı üretme işlevini iyileştirdi. Bununla birlikte, 60 ve 80'lerin sayıları hesaplanmamış öğelere ihtiyaç duyduğundan, mücadele, kodu azaltırken böyle bir işlev yaratmak olmuştur.


3
Sen kullanabilirsiniz r=range, bu hile hatları 2 ve 3 için, ve girinti için tek boşluk. Ve 65 byte ile kaydedebilirsinizd=dict(zip(r(17)+r(20,70,10)+[80,100],'zéro un deux ... quatre-vingt cent'.split()))
grc

r=rangeHile Farkında, ama 1 revizyon yazarken eklemek unuttum. Geriye kalan her şey benim için nispeten yeniydi, bu yüzden teşekkürler. Ancak bir not, printifade bir işleve dönüştürülmedikçe ve rdikt içindeki işlevler listelere dönüştürülmedikçe , kod Python 3.x üzerinde çalışmaz .
Doktoro Reichard

Piton İhtiyacınız olmayan 2'de int(input()), input()yeterlidir.
Ray,

1
Bazı ipucu daha: Eğer koyarsanız bence b=a/60*10+10de f(a)o zaman kullanabilirsiniz a-a%bve a%bsizin Sözlük anahtarları için. Ayrıca, içindeki boşluğa ihtiyacınız yoktur 1 orve 4. satır kısaltılabilir [f(v)for v in r(100)if v not in d]. Bunlardan hiçbirini denemedim.
grc

1
if v not in d-> if(v in d)<1karakter kaydeder. Noktalı virgül işlevinizin iki bölümünü ayırırsanız, hepsini bir satıra yerleştirebilirsiniz.
isaacg

4

Python - 392 bayt

Diğer sayıları oluşturmak için kullandığı temel sayıları içeren bir listeye sahiptir. Üretim mantığının çoğu koşullu maddeler için liste indekslemesini kullanan 2. satırdaki listededir. Liste oluşturulduktan sonra girilen sayıya bakar ve yazdırır.

Düzenleme: grc'nin ucunu kullanarak 426 bayttan kısaltıldı.

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 byte ile kaydedebilirsiniza='_un_deux_trois ... quinze_seize'.split('_')
grc

5
Bir yazım hatası var: ciquante , bir n eksik.
AL,

Siz bayt sayısı aslında 420, belirtilenden daha az.
Ray,

1

Python 3, (503 bayt)

Tabloyu bzip2 kullanarak sıkıştırın ve sonucu kaydetmek için ascii85 kodlamasını kullanın. Tablo:

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

Çok saf yöntem, ama o kadar da kötü değil.

golfed

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

Ungolfed

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

Sıkıştırılmış dizede "Vim" kelimesini bulabilir misin?


1
Ben oldukça hoşuma gitti Sh0W. Vim bulunamadı, ne de sen.
Ağustos'ta

@tomsmeding Ne yazık! Vim, son düzenlememin ardından kayboldu.
Ray

1

Bash, 456 440 421 408

Geçerli bir giriş varsayar (herhangi bir sayıdaki sıfır ile 0 ile 100 arasında bir tam sayı).

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 (Deve Kasası Yok)

@ edc65 bunu senden alamıyor ...;)

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.