Houve um desafio em converter um número para seu numeral em inglês , mas isso era muito simples. Dado um número de 0 a 100, sua tarefa é produzir o número correspondente em francês. O sistema numérico francês tem uma lógica mais complexa por trás do que o inglês:
Número Numeral --------------- 0 zéro (observe o sotaque) 1 un 2 deux 3 trois 4 quatre 5 cinq 6 seis 7 set 8 huit 9 neuf 10 dix 11 onze 12 douze 13 treize 14 quatorze 15 quinze 16 apreender 17 dix-sept (literalmente dez sete) 18 dix-huit 19 dix-neuf 20 vingt 21 vingt et un (sem hífens) 22 vingt-deux ... 30 trente ... 40 quarante ... 50 cinquante ... 60 soixante ... 70 soixante-dix (literalmente sessenta e dez) 71 Soixante e Onze ... 80 quatre-vingts (observe os; literalmente quatro anos vinte) 81 quatre-vingt-un (observe os hífens) ... 90 quatre-vingt-dix 91 quatre-vingt-onze ... 99 quatre-vingt-dix-neuf (4 * 20 + 10 + 9) 100 cêntimos
Para obter uma lista completa, siga http://quizlet.com/996950/ ( http://www.webcitation.org/6RNppaJx0 ).
Regras / explicações adicionais
- Sempre haverá um hífen entre as palavras EXCETO quando o número termina em 1.
- Quando o número termina em 1, a palavra et (significado e ) é adicionada antes do un ou onze . (31 = tres et un)
- No entanto, 81 e 91 são formatados da mesma forma que os outros números. (81 = quatre-vingt-un)
- Aos 60, o sistema alterna da base 10 para a base 20.
- Existem algumas pequenas discrepâncias na web sobre isso; consulte a lista vinculada acima para perguntas.
- As brechas proibidas por padrão não são permitidas.
- Não é permitido o uso de uma fonte externa, como um site, bem como de bibliotecas, APIs, funções ou similares que convertam números em números ou que traduzam para o francês.
- Isso é código-golfe , então a resposta com o menor número de bytes vence.
- Se disponível, vincule a um compilador online para facilitar o teste do seu código.
Entrada
- A entrada deve ser obtida do modo que seu idioma receber entrada. (STDIN, linha de comando, etc.)
- A entrada será uma única sequência, consistindo em um número inteiro entre 0 e 100, inclusive (zeros à esquerda opcionais).
- Você pode assumir que a entrada sempre será bem formada.
Saída
- O resultado será impresso no método mais conveniente para o seu idioma. (STDOUT, caixa de diálogo etc.)
- O case não importa na saída.
Exemplos
Teste seu código com relação a eles:
Saída de entrada ------------- 0 zéro 18 dix-huit 51 cinquante e um 80 quatre-vingts 91 quatre-vingt-onze 99 quatre-vingt-dix-neuf
code-golf
number
kolmogorov-complexity
NinjaBearMonkey
fonte
fonte
Respostas:
JavaScript (ES6) 318
321Edite a correção de bugs (gerenciando os 0s principais) e jogue mais
Crédito para o truque de camelo @ Core1024
Com entrada / saída via pop-up
Como uma função testável
Para testar no console do FireFox ou no FireBug
Saída de teste
fonte
Haskell, 390 bytes
Ungolfed
Linguagens de programação funcional são bastante adequadas para este trabalho.
fonte
main=interact$f.read
e salvar alguns caracteres.interact
. Atualizada.Ruby, 333 bytes
Na maioria das vezes, são apenas duas tabelas de pesquisa e vários operadores ternários que codificam todas as regras estranhas e informam qual tabela de pesquisa usar quando. Deixe-me saber se você quiser saber mais. ;)
fonte
80
deve gerar quatre-vingts, com um s no final.Python - 344
(348) (380) (445) (537)bytesGraças ao grc, Ray e isaacg por sua ajuda no processo de golfe.
O código consiste na definição inicial do dicionário e uma compreensão da lista que preenche os espaços em branco com a junção dos elementos do dicionário.
Você pode verificar o código on-line em repl.it
Minhas últimas tentativas de jogar golfe nesse código foram renunciar ao processo de geração e, com essa redução, refinar a função para gerar apenas o número solicitado no local. No entanto, como os números dos anos 60 e 80 precisam de elementos não calculados, a luta tem sido criar essa função enquanto diminui o código.
fonte
r=range
, este truque para as linhas 2 e 3, e apenas um espaço para recuo. E você pode salvar 65 bytes comd=dict(zip(r(17)+r(20,70,10)+[80,100],'zéro un deux ... quatre-vingt cent'.split()))
r=range
truque que eu conhecia, mas esqueci de adicioná-lo quando escrevi a 1ª revisão. Tudo o resto era relativamente novo para mim, então, obrigado. Uma observação, porém, o código não funciona no Python 3.x, a menos que aprint
instrução seja transformada em uma função e asr
funções no dict sejam transformadas em listas.int(input())
,input()
é suficiente.b=a/60*10+10
emf(a)
seguida, você poderia usara-a%b
ea%b
para as suas chaves de dicionário. Além disso, você não precisa do espaço1 or
, e a quarta linha pode ser reduzida para[f(v)for v in r(100)if v not in d]
. Eu ainda não tentei nada disso.if v not in d
->if(v in d)<1
salva um personagem. Se você separar o ponto-e-vírgula das duas partes da sua função, poderá colocar tudo em uma linha.Python - 392 bytes
Possui uma lista com números de base que utiliza para gerar os outros números. A maior parte da lógica de geração está na compreensão da lista na linha 2, usando a indexação de lista para condicionais. Depois que a lista é gerada, ela pesquisa o número inserido e o imprime.
Edit: Encurtado de 426 bytes usando a dica do grc.
fonte
a='_un_deux_trois ... quinze_seize'.split('_')
Python 3, (503 bytes)
Compacte a tabela usando bzip2 e use a codificação ascii85 para armazenar o resultado. A tabela é:
Método muito ingênuo, mas não é tão ruim assim.
Golfe
Ungolfed
Bônus
Você consegue encontrar a palavra "Vim" na string compactada?
fonte
Sh0W
. Não foi possível encontrar o Vim, nem você.Bater,
456 440 421408Assume entrada válida (número inteiro de 0 a 100 com qualquer número de zeros à esquerda).
fonte
JavaScript 459 (sem revestimento de camelo)
@ edc65 não pode tirar isso de você ...;)
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()])
fonte