Пропишіть цифри французькою мовою


23

Було завдання перетворити число на його цифру англійською мовою , але це було занадто просто. Враховуючи число 0–100, ваше завдання - вивести відповідну цифру французькою мовою. Французька система числення має за собою більш складну логіку порівняно з англійською:

Число Число
---------------
 0 zéro (зверніть увагу на наголос)
 1 ун
 2 декс
 3 трої
 4 кватр
 5 цинк
 6 шість
 7 вересня
 8 хайт
 9 neuf
10 дікс
11 онзе
12 дуж
13 тризе
14 кварце
15 квінза
16 захоплення
17 ді-септів (буквально десять сім)
18 дікс-хайт
19 dix-neuf
20 вінгт
21 vingt et un (дефісів немає)
22 vingt-deux
...
30 тренте
...
40 каранти
...
50 цинкантен
...
60 сойканте
...
70 soixante-dix (буквально шістдесят десять)
71 soixante et onze
...
80 кватр-вінгтів (зауважте, що буквально чотири двадцяті роки)
81 quatre-vingt-un (зверніть увагу на дефіси)
...
90 quatre-vingt-dix
91 кватр-вінгт-онзе
...
99 кватр-вінгт-дікс-неуф (4 * 20 + 10 + 9)
100 цент

Щоб отримати повний список, перегляньте http://quizlet.com/996950/ ( http://www.webcitation.org/6RNppaJx0 ).

Подальші правила / пояснення

  • Завжди буде дефіс між словами ВСЕ, коли число закінчується на 1.
  • Коли число закінчується на 1, слово et (значення і ) додається перед un або onze . (31 = трент та ін)
  • Однак 81 і 91 відформатовані так само, як і інші номери. (81 = quatre-vingt-un)
  • У 60 років система переходить з бази 10 на базу 20.
  • У цій мережі є незначні розбіжності; зверніться до списку, пов'язаного вище, для питань.
  • Пропуски, заборонені за замовчуванням , не допускаються.
  • Використання зовнішнього джерела, такого як веб-сайт, а також будь-які бібліотеки, API, функції тощо, які перетворюють номери в цифри або переводять на французьку мову, не дозволяються.
  • Це , тому відповідь з найменшими байтами виграє.
  • Якщо це можливо, зв’яжіться з онлайн-компілятором, щоб легко перевірити свій код.

Вхідні дані

  • Введення даних береться з огляду на вашу мову. (STDIN, командний рядок тощо)
  • Вхід буде представляти собою один рядок, що складається з цілого числа від 0 до 100 включно (провідні нулі необов’язково).
  • Можна припустити, що вхід завжди буде добре сформований.

Вихід

  • Результат повинен вивести найбільш зручний для вашої мови метод. (STDOUT, діалогове вікно тощо)
  • Справа не має значення у виході.

Приклади

Перевірте свій код на наступне:

Введення-виведення
-------------
0 zéro
18 дікс-хайт
51 cinquante et un
80 кватр-вінгтів
91 кватр-вінгт-онзе
99 quatre-vingt-dix-neuf

3
Зауважимо, що бельгійці, які говорять на французькій мові, використовують замість soixante-dix, quatre-vingts, quatre-vingt-dix "септанте", "октант" та "нонанте". Це слід використовувати в старовинній бельгійській колонії.
Еммануель

8
+1 для генія робити це французькою мовою. Як сказав мій німецький колега: "Німці говорять цифри назад. Але для розуміння французів потрібен калькулятор".
Рівень річки Св.

1
Схоже, zéro - це єдине наголошене число в діапазоні 0-100. Це не стандартний символ ASCII. Я припускаю, що будь-який формат (кодова сторінка 437, UTF-8 тощо), який може вивести цей символ, є прийнятним.
Рівень р. Св.

1
@Martin У правилах зазначено "Ви можете припустити, що вхід завжди буде добре сформований", тому введення> 100 може спричинити будь-яку поведінку.
NinjaBearMonkey

3
За французькою системою абсолютно немає логіки. Я впевнений, що у 99% французьких чеків є помилка, це ще складніше після 100. Шлюб - це теж кошмар. Повірте, я французька.
Майкл М.

Відповіді:


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: 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- Хуїт, 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-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-Sept, 58: Cinquante- Huit, 59: Cinquante-Neuf,
60: Соаксанте, 61: Соаксанте та Ун, 62: Соаксанте-Деу, 63: Соаксанте-Троа, 64: Соаксанте-Кватр, 65: Соаксанте-Сінк, 66: Соаксанте-Шість, 67: Соаксанте-Септ, 68: Сойксанте- Хуйт, 69: Соаксанте-Нойф,
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: Соаксанте-Дікс-хуйт, 79: Соаксанте-Дікс-Неуф,
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-huit, 99: Quatre-Vingt-Dix-neuf, 
"Цент"

2
Прикольний трюк з кейсом верблюда!
tomsmeding

@tomsmeding дуже крутий, так очевидно, не придуманий мною (додав кредит у дописі)
edc65,

@ edc65 Ви не заперечуєте, якщо спробую покращити свою відповідь Рубі? Я навіть не бачив, що дозволений вихід з урахуванням регістру дозволений, коли я пише моє. ^^
Мартін Ендер

@ 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=interact$f.readта зберегти кілька символів.
gxtaillon

@gxtaillon Так, я забув interact. Оновлено.
Рей

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

Це здебільшого дві таблиці пошуку та купа потрійних операторів, які кодують усі дивні правила та підказують, яку таблицю пошуку використовувати, коли. Повідомте мене, якщо ви хочете дізнатися більше. ;)


1
Ненавиджу бути вибагливим, але 80слід виводити чотиривірші, з s на кінці.
NinjaBearMonkey

@hsl виправлено і трохи скорочено.
Мартін Ендер

5

Пітон - 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, і тільки одне місце для відступу. А ви можете зберегти 65 байт за допомогоюd=dict(zip(r(17)+r(20,70,10)+[80,100],'zéro un deux ... quatre-vingt cent'.split()))
grc

r=rangeТрюк я був в курсі, але забув додати його , коли я написав 1 - й перегляд. Все інше було для мене відносно новим, тому вдячність за порядок. Зауважте, що код не працює на Python 3.x, якщо printоператор не перетворений на функцію і rфункції дикту не перетворяться на списки.
Doktoro Reichard

У python 2 вам не потрібно int(input()), input()достатньо.
Рей

1
Ще кілька порад: Я думаю , що якщо ви поклали b=a/60*10+10в f(a)то ви можете використовувати a-a%bі a%bдля словника ключів. Крім того, вам не потрібно місця в 1 or, і 4-й рядок можна скоротити до [f(v)for v in r(100)if v not in d]. Я ще нічого не пробував цього.
grc

1
if v not in d-> if(v in d)<1зберігає персонаж. Якщо крапкою з комою розділити дві частини вашої функції, ви можете поставити все це в один рядок.
isaacg

4

Пітон - 392 байти

У ньому є список з базовими номерами, який він використовує для генерування інших чисел. Більша частина логіки генерації знаходиться у розумінні списку на другому рядку, використовуючи індексацію списку для умовних умов. Після створення списку він шукає введене число та роздруковує його.

Редагувати: Скорочено з 426 байт за допомогою підказки 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())])

1
Ви можете зберегти 23 байти за допомогоюa='_un_deux_trois ... quinze_seize'.split('_')
grc

5
Там помилка друку : ciquante , п. Відсутня.
AL

Кількість байтів насправді 420, менше, ніж зазначено.
Рей

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. Не вдалося знайти Віма, і ти не можеш.
tomsmeding

@tomsmeding Як ​​шкода! Vim зник після моєї останньої редакції.
Рей

1

Bash, 456 440 421 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()])

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.