Przeliteruj liczby w języku francuskim

23

Trudno było przekonwertować liczbę na liczbę w języku angielskim , ale było to zbyt proste. Biorąc pod uwagę liczbę 0–100, Twoim zadaniem jest wyprowadzenie odpowiedniej cyfry w języku francuskim. Francuski system liczb ma za sobą bardziej złożoną logikę w porównaniu z angielskim:

Liczba Liczebnik
---------------
 0 zéro (zauważ akcent)
 1 un
 2 deux
 3 trois
 4 quatre
 5 cinq
 6 sześć
 7 września
 8 huit
 9 neuf
10 dix
11 onze
12 douze
13 treize
14 quatorze
15 quinze
16 chwytaj
17 dix-sept (dosłownie dziesięć siedem)
18 dix-huit
19 dix-neuf
20 vingt
21 vingt et un (bez łączników)
22 vingt-deux
...
30 trente
...
40 kwarantann
...
50 cinquante
...
60 soixante
...
70 soixante-dix (dosłownie sześćdziesiąt dziesięć)
71 soixante et onze
...
80 quatre-vingts (zwróć uwagę na s; dosłownie cztery lata dwudzieste)
81 quatre-vingt-un (zwróć uwagę na łączniki)
...
90 quatre-vingt-dix
91 quatre-vingt-onze
...
99 quatre-vingt-dix-neuf (4 * 20 + 10 + 9)
100 centów

Pełna lista znajduje się na stronie http://quizlet.com/996950/ ( http://www.webcitation.org/6RNppaJx0 ).

Dalsze zasady / objaśnienia

  • Zawsze będzie myślnik między słowami Z WYJĄTKIEM, gdy liczba kończy się na 1.
  • Kiedy końce Ilość w 1, słowo i (czyli a ) dodaje się przed un lub onze . (31 = trente et un)
  • Jednak 81 i 91 są sformatowane tak samo jak inne liczby. (81 = quatre-vingt-un)
  • Przy 60 system przełącza się z bazy 10 na bazę 20.
  • Istnieją pewne niewielkie rozbieżności w tym zakresie w sieci; pytania znajdują się na powyższej liście.
  • Luki, które są domyślnie zabronione, nie są dozwolone.
  • Używanie zewnętrznego źródła, takiego jak strona internetowa, a także dowolnych bibliotek, interfejsów API, funkcji itp., Które konwertują liczby na cyfry lub tłumaczą na francuski, jest niedozwolone.
  • To jest , więc wygrywa odpowiedź z najmniejszą liczbą bajtów.
  • Jeśli to możliwe, proszę połączyć się z kompilatorem online, aby umożliwić łatwe testowanie kodu.

Wkład

  • Dane należy pobierać z dowolnego języka. (STDIN, wiersz poleceń itp.)
  • Dane wejściowe będą pojedynczym ciągiem, składającym się z liczby całkowitej od 0 do 100 włącznie (opcjonalnie zera wiodącego).
  • Możesz założyć, że dane wejściowe zawsze będą dobrze sformułowane.

Wydajność

  • Wynik zostanie wysłany do najwygodniejszej metody dla twojego języka. (STDOUT, okno dialogowe itp.)
  • Wielkość liter nie ma znaczenia na wyjściu.

Przykłady

Przetestuj swój kod w stosunku do tych:

Wejście wyjście
-------------
0 zéro
18 dix-huit
51 cinquante et un
80 quatre-vingts
91 quatre-vingt-onze
99 quatre-vingt-dix-neuf
NinjaBearMonkey
źródło
3
Zauważ, że francuskojęzyczni Belgowie używają „septante”, „octante” i „nonante” zamiast soixante-dix, quatre-vingts, quatre-vingt-dix. Powinien być przyzwyczajony w starożytnej kolonii belgijskiej.
Emmanuel
8
+1 za geniusz robienia tego po francusku. Jak powiedział mój niemiecki kolega: „Niemcy mówią liczby od tyłu. Ale żeby zrozumieć francuski, potrzebujesz kalkulatora”.
Level River St
1
Wygląda na to, że Zéro jest jedyną akcentowaną liczbą w zakresie 0-100. To nie jest standardowy znak ASCII. Zakładam, że dowolny format (strona kodowa 437, UTF-8 itp.), Który może wypisać ten znak, jest dopuszczalny.
Level River St
1
@Martin Reguły mówią: „Możesz założyć, że dane wejściowe zawsze będą dobrze sformułowane”, więc dane wejściowe> 100 mogą spowodować dowolne zachowanie.
NinjaBearMonkey
3
System francuski nie ma absolutnie żadnej logiki. Jestem pewien, że w 99% francuskich czeków jest pomyłka, ale po 100 jest to jeszcze bardziej skomplikowane. Spojrzenie to także koszmar. Zaufaj mi, jestem Francuzem.
Michael M.,

Odpowiedzi:

7

JavaScript (ES6) 318 321

Edytuj błąd (zarządzanie wiodącymi zerami) i graj w golfa więcej

Kredyt za sztuczkę w etui na wielbłądy @ Core1024

Z wejściem / wyjściem przez wyskakujące okienko

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

Jako funkcja do przetestowania

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

Aby przetestować w konsoli FireFox lub 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')

Wyjście testowe

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: 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: Kwarantanna, 41: Kwarantanna i Un, 42: Kwarantanna-Deux, 43: Kwarantanna-Trois, 44: Kwarantanna-Quatre, 45: Kwarantanna-Cinq, 46: Kwarantanna-Sześć, 47: Kwarantanna-wrzesień, 48: Kwarantanna Huit, 49: Quarante-Neuf,
50: Cinquante, 51: Cinquante i Un, 52: Cinquante-Deux, 53: Cinquante-Trois, 54: Cinquante-Quatre, 55: Cinquante-Cinq, 56: Cinquante-Six, 57: Cinquante-wrzesień, 58: Cinquante- Huit, 59: Cinquante-Neuf,
60: Soixante, 61: Soixante i Un, 62: Soixante-Deux, 63: Soixante-Trois, 64: Soixante-Quatre, 65: Soixante-Cinq, 66: Soixante-Six, 67: Soixante-wrzesień, 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, 
"Cent"
edc65
źródło
2
Fajna sztuczka z futerałem wielbłąda!
tomsmeding
@tomsmeding naprawdę fajne, więc oczywiście nie opracowane przeze mnie (dodane kredyty w poście)
edc65
@ edc65 Czy masz coś przeciwko, jeśli spróbuję poprawić moją odpowiedź Ruby? Nawet nie widziałem, że przy pisaniu mojej jest dozwolone rozróżnianie wielkości liter. ^^
Martin Ender
@ MartinBüttner, oczywiście, że możesz
edc65
6

Haskell, 390 bajtów

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

Bez golfa

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

Funkcjonalne języki programowania są odpowiednie do tego zadania.

Promień
źródło
Głosuj, byłeś szybszy ode mnie. Możesz zamienić główny na main=interact$f.readi zapisać kilka znaków.
gxtaillon
@gxtaillon Tak, zapomniałem interact. Zaktualizowano
Ray
5

Rubinowy, 333 bajty

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

Przeważnie są to tylko dwie tabele przeglądowe i grupa operatorów trójskładnikowych, które kodują wszystkie dziwne reguły i mówią, której tabeli przeglądowej użyć, kiedy. Daj mi znać, jeśli chcesz dowiedzieć się więcej. ;)

Martin Ender
źródło
1
Nienawidzę być nikczemny, ale 80powinien generować quaters-vingts, z s na końcu.
NinjaBearMonkey
@hsl naprawił i nieco skrócił.
Martin Ender
5

Python - 344 (348) (380) (445) (537) bajtów

Dzięki grc, Ray i isaacg za pomoc w procesie gry w golfa.

Kod składa się z początkowej definicji słownika i zrozumienia listy, która wypełnia puste miejsca połączeniem elementów słownika.

Możesz sprawdzić kod online na 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()]

Moje ostatnie próby gry w ten kod w golfa polegały na rezygnacji z procesu generowania i dzięki tej redukcji udoskonaliłem funkcję generowania żądanego numeru na miejscu. Ponieważ jednak liczby z lat 60. i 80. wymagają elementów nieobliczonych, problemem było stworzenie takiej funkcji przy jednoczesnym zmniejszeniu kodu.

Doktoro Reichard
źródło
3
Można użyć r=range, ten trick na liniach 2 i 3, a tylko jeden przestrzeń dla wcięcia. I możesz zapisać 65 bajtów za pomocąd=dict(zip(r(17)+r(20,70,10)+[80,100],'zéro un deux ... quatre-vingt cent'.split()))
grc
r=rangeTrik byłem świadomy, ale zapomniał dodać, kiedy pisałem 1st rewizji. Wszystko inne było dla mnie stosunkowo nowe, więc dzięki są w porządku. Należy jednak pamiętać, że kod nie działa w języku Python 3.x, chyba że printinstrukcja zostanie przekształcona w funkcję, a rfunkcje w słowie zostaną przekształcone w listy.
Doktoro Reichard
W Pythonie 2 nie potrzebujesz int(input()), input()wystarczy.
Ray
1
Kilka wskazówek: Myślę, że jeśli włożysz b=a/60*10+10w f(a)to można użyć a-a%bi a%bdo słownika kluczy. Nie potrzebujesz też miejsca 1 or, a czwartą linię można skrócić [f(v)for v in r(100)if v not in d]. Jednak tego nie próbowałem.
grc
1
if v not in d-> if(v in d)<1zapisuje postać. Jeśli średnik oddzielisz dwie części funkcji, możesz umieścić wszystko w jednym wierszu.
isaacg
4

Python - 392 bajty

Ma listę z numerami podstawowymi, których używa do generowania innych liczb. Większość logiki generowania znajduje się w zestawieniu listy w wierszu 2, z wykorzystaniem indeksowania listy dla warunków warunkowych. Po wygenerowaniu lista wyszukuje wprowadzony numer i drukuje go.

Edycja: Skrócono z 426 bajtów za pomocą końcówki 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
źródło
1
Możesz zapisać 23 bajty za pomocąa='_un_deux_trois ... quinze_seize'.split('_')
grc
5
Istnieje literówka: ciquante , n brakuje.
AL
Liczba bajtów to w rzeczywistości 420, mniej niż podano.
Ray
1

Python 3, (503 bajty)

Skompresuj tabelę za pomocą bzip2, a następnie użyj kodowania ascii85 do zapisania wyniku. Tabela jest:

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

Bardzo naiwna metoda, ale nie jest taka zła.

Grał w golfa

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

Bez golfa

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

Premia

Czy możesz znaleźć słowo „Vim” w skompresowanym ciągu?

Promień
źródło
1
Bardzo mi się podoba Sh0W. Nie mogłem znaleźć Vima, ty też nie możesz.
tomsmeding
@tomsmeding Co za szkoda! Vim zniknął po mojej ostatniej edycji.
Ray
1

Grzmotnąć, 456 440 421 408

Przyjmuje prawidłowe dane wejściowe (liczba całkowita od 0 do 100 z dowolną liczbą zer wiodących).

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}

źródło
1

JavaScript 459 (bez obudowy wielbłąda)

@ edc65 nie może ci tego odebrać ...;)

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
źródło