Traduire les nombres en français

46

Les Français épeler les chiffres d'une manière particulière.

  • 1-16 sont "normaux"
  • 17-19 sont épelés 10 + 7. 10 + 8, 10 + 9 .
  • 20-69 sont "normaux" (OK, OK! Pas vraiment, mais ils sont dans ce défi)
  • 70-79 sont 60 + 10, 60 + 11 ... 60 + 10 + 7, 60 + 10 + 8, 60 + 10 + 9 .
  • 80-99 sont 4 * 20, 4 * 20 + 1, 4 * 20 + 2 ... 4 * 20 + 16, 4 * 20 + 10 + 7, 4 * 20 + 10 + 8, 4 * 20 + 10 + 9

Défi:

Prenez un entier positif dans l'intervalle [1.100] et exportez-le "à la française". Vous devez le produire exactement comme il est montré ci-dessous, avec *et +, ainsi 97est-il 4*20+10+7, pas [4 20 10 7]ou quelque chose d'autre.

Cas de test:

1  - 1
.. - ..
16 - 16
17 - 10+7
18 - 10+8
19 - 10+9
20 - 20
21 - 21
.. - ..
69 - 69
70 - 60+10
71 - 60+11
72 - 60+12
77 - 60+10+7
78 - 60+10+8
79 - 60+10+9
80 - 4*20
81 - 4*20+1
82 - 4*20+2
.. - ..
90 - 4*20+10
91 - 4*20+11
96 - 4*20+16
97 - 4*20+10+7
98 - 4*20+10+8
99 - 4*20+10+9
100 - 100
Stewie Griffin
la source
14
Chaque langue que je connais a une transition dans les "adolescents", comme celle de haut 16en 10+7bas. (En anglais, cela se produit entre 12et 10+3, avec un déguisement un peu plus morphologique.) J'ai toujours été un peu trop obsédé par le fait que différentes langues effectuent cette transition à des nombres différents.
Greg Martin
25
Pourquoi devrait être "vingt-deux" être 22quand "dix-huit" est 10+8?
Titus
11
Heureusement, il s’agit d’un site de casse-tête pour la programmation et non d’un jeu questionnaire. Sinon, les gens pourraient se fâcher lorsque OP commettra des erreurs stupides. Phew!
Stewie Griffin
4
@StewieGriffin Les gens étaient toujours agacés.
Leaky Nun
2
En tant que français, je trouve ça plutôt bien: D.
Walfrat

Réponses:

13

Excel, 153 149 octets

=IF(OR(A1<17,A1>99,AND(A1>19,A1<70)),A1,IF(A1<20,"10+"&A1-10,IF(A1<80,"60","4*20")&IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))))

Je suis sûr que cela pourrait être mieux, j'ai eu du mal à trouver un moyen efficace de rendre compte de # 80.

edit: Consolidé les cas "normaux" afin de mieux sauvegarder 4 octets. N ° 80 est toujours nul.

Impossible de trouver une réponse précise ici, pas sûr des règles du code-golf tbh. Puis-je utiliser plusieurs cellules dans Excel et ajouter le nombre d'octets de chacune?

c'est à dire. Pour une entrée dans la cellule A1

A2: 11 octets

=MOD(A1,20)

A3 (résultat): 125 octets

=IF(OR(A1<17,A1>99,AND(A1>19,A1<70)),A1,IF(A1<20,"10+"&A1-10,IF(A1<80,"60","4*20")&IF(A1=80,,IF(A2>16,"+10+"&A2-10,"+"&A2))))

Pour un total de 136?

qoou
la source
Je pense qu'il devrait être permis d'écrire du code dans plusieurs cellules. IMHO c'est comme avoir des variables intermédiaires ou des fonctions dans d'autres langages de programmation.
pajonk
Je pense qu’il devrait y avoir une pénalité d’utilisation de plusieurs cellules, tout comme une pénalité d’utilisation de fonctions dans d’autres langages (celle de taper le standard pour déclarer la fonction). Peut-être que tersest supportait l'encodage (c.-à-d. CSV), donc le nombre nécessaire de virgules et (le cas échéant) de citations?
Muzer
Je ne suis au courant d'aucun format dans lequel des fichiers Excel peuvent être enregistrés avec une sortie reconnaissable. Les fichiers CSV, par défaut, ne prennent pas en charge des fonctions comme celles-ci et vont rompre toute fonction utilisant une virgule. S'il est enregistré sous forme de texte pur dans une colonne avec une nouvelle ligne entre les cellules, il peut être copié directement dans Excel et function. Dans ce cas, 1 octet serait ajouté pour chaque cellule supplémentaire.
Qoou
Sauvegarder un octet en convertissant IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))enIFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
Greedo
Dans Libreoffice calc, vous pouvez ignorer la )fin, pouvez-vous faire la même chose dans Excel? Donc vous pouvez économiser 5 "octets" (il y a vraiment UCS2-Chars, donc si vous dites Byte == octet, vous devez le compter en double). Et vous devez modifier le ,en;
12431234123412341234123
8

Retina , 52 48 octets

4 octets économisés grâce à Neil

^7\B
60+1
^9\B
81
^8\B
4*20+
1(?=7|8|9)
10+
\+0

Essayez-le en ligne! ou vérifier toutes les entrées (fournies par Neil)

Explication

^7\B
60+1
^9\B
81
^8\B
4*20+

Nous traitons d’abord les traductions de 70, 80 et 90. Dans ces 3 premières étapes, un 7 au début suivi d’un autre caractère est remplacé par 60+1. De même, 9est remplacé par 81, et 8par 4*20+1. Le remplacement de 9est essentiellement remplacé par "quatre vingt dix" et autres, de sorte que le 8est remplacé par le prochain remplacement, ce qui économise les octets sur l'écriture 4*20+1deux fois.

1(?=7|8|9)
10+

Cela gère les cas de 17, 18et 19, en remplaçant le 1dans chacun par 10+.

\+0

Enfin, il ne devrait jamais y avoir de +0fin, alors supprimez-le s'il est présent.

Chat d'affaires
la source
Vous pouvez sûrement utiliser les groupes de capture si vous regardez derrière vous et derrière vous
Downgoat
Cela ne fonctionne pas pour 7-9, mais je ne pense pas que vous ayez besoin de ça: essayez-le en ligne!
Neil
@Neil, j'ai réalisé que pendant mon absence: P Mais merci pour la nouvelle version!
Business Cat
@Downgoat Je pourrais remplacer le lookahead par un groupe de capture, mais cela ne sauverait aucun octet car il $1est aussi long que ?=.
Business Cat
7

JavaScript (ES6), 73 71 octets

f=n=>n>16&n<20?'10+'+n%10:n<70|n>99?n:n%20?f(n-n%20)+'+'+f(n%20):'4*20'

Version bonus qui affiche les nombres tels qu'ils sont réellement épelés pour 2 octets supplémentaires:

f=n=>n<17|n>99?n:n<20?'10+'+n%10:n%20?f(n-n%20)+'+'+f(n%20):n-80?n:'4*20'
ETHproductions
la source
1
échoue pour beaucoup d'entrées; en réalité, il ne fonctionne que pour 1..20, 30, 40, 50, 60, 80 et 100.
Titus le
@ Titus Je pense que vous avez mal compris la plupart des résultats. 23, par exemple, est censé produire 23, pas 20+3.
ETHproductions
Économisez deux octets avec(m=n%20)
Titus le
@ Titus Merci, mais j'ai déjà essayé cela, et cela ne fonctionne pas sur 70-99 car il mest réinitialisé 0dans l' f(n-n%20)appel. (C'est une variable globale)
ETHproductions
Vous pouvez enregistrer un octet en changeant n<70|n>99à n%100<70. Aussi, pourriez-vous ajouter un compilateur test?
Kevin Cruijssen
5

R, 110 octets

i=scan()
r=i%%10;paste0(ifelse(i>16&i<20,"10+",ifelse(i>69&i<80,"60+10+",ifelse(i>16&i<20,"4*20+",i-r/10))),r)
Neil
la source
Essayez (i-r)/10au lieu de floor(i/10). Et i>15devrait être i>16.
Titus
5

PHP, 99 octets (je veux être la version heureuse)

un port direct de ETHproductions´ JS , 4 octets joués au golf . Imprime les numéros demandés par l'OP.

function f($n){return$n<17|$n>19?$n>60&$n<100?($m=$n%20)?f($n-$m)."+".f($m):'4*20':$n:"10+".$n%10;}

panne

function f($n){return
    $n<17|$n>19
        ?$n>69&$n<100
            ?($m=$n%20)
                ?f($n-$m)."+".f($m) # 70..79, 81..99
                :'4*20'             # 80
            :$n                     # 1..16, 20..69
        :"10+".$n%10                # 17..19
    ;
}

Je veux avoir raison, 114 98 octets

nouvelle approche inspirée par ETHproductions , imprime les nombres tels qu’ils sont épelés.

function f($n){return$n>16&$n<100?$n-80?($m=$n%($n>60?20:10))?f($n-$m)."+".f($m):$n-$m:'4*20':$n;}

essayez-le en ligne .

panne

function f($n){return
    $n>16&$n<100
        ?$n-80
            ?($m=$n%($n>60?20:10))
                ?f($n-$m)."+".f($m) # $n%$m>0
                :$n-$m              # 10,20,30,40,50,60
            :'4*20'                 # 80
        :$n                         # 1..16, 100
;}
Titus
la source
4

Python 2, 130 108 octets

22 octets enregistrés grâce à @mathjunkie

f=lambda x:79<x<100and('4*20'+('+'+f(x-80))*(x>80))or 69<x<100and'60+'+f(x-60)or 16<x<20and'10+'+`x-10`or`x`

Essayez-le en ligne!

Uriel
la source
108 octets: TIO
junkie en mathématiques
1
Vous devez compter f=parce que vous l'avez utilisé à l'intérieur du lambda.
Leaky Nun
@ LeakyNun corrigé
Uriel le
3

Lot, 220 217 octets

@set/pn=
@set s=
@if %n% gtr 99 goto g
@if %n% gtr 79 set s=+4*20&set/an-=80
@if %n% gtr 69 set s=+60&set/an-=60
@if %n% gtr 16 if %n% lss 20 set s=%s%+10&set/an-=10
:g
@if %n% gtr 0 set s=%s%+%n%
@echo %s:~1%

Prend une entrée sur STDIN. Générer et supprimer les premiers +arrêts d'un octet sur un cas spécial 80. Édition: 3 octets sauvegardés grâce à @ ConorO'Brien.

Neil
la source
Vous pouvez enregistrer 3 octets en supprimant @echo offet en préfixant toutes les instructions, à l'exception de l'instruction de boucle hte avec@
Conor O'Brien
@ ConorO'Brien Hein, je me demande pourquoi j'ai oublié de le faire cette fois-ci ...
Neil
2

Gelée , 55 octets

⁹
’,ṃ60Ṁ€
⁹%80“4*20”,
Dj⁾0+µ¹e?“×ØŒ‘
%ȷ2:“FP‘S‘ŀḟ0Ç€j”+

Essayez-le en ligne! ou voir une suite de tests

Sans doute, il y a un moyen plus court!

Comment?

+ - Link 1, helper for 1-69&100: number s=0, number n
⁹ - link's right argument, n

’,ṃ60Ṁ€ - Link 2, helper for 70-79: number s=1, number n
’       - decrement s -> 0
 ,      - pair -> [0,n]
  ṃ60   - base decompress (vectorises) using [1,2,...60]  effectively -> [60,[1,n%60]]
     Ṁ€ - maximum for €ach effectively -> [60,n%60]

⁹%80“4*20”, - Link 3, helper for 80-99: number s=2, number n
⁹           - link's right argument, n
 %80        - mod 80
    “4*20”  - literal ['4','*','2','0']
          , - pair -> [['4','*','2','0'],n]

Dj⁾0+µ¹e?“×ØŒ‘ - Link 4, reformat 17-19: element v (may be char list or number)
        ?      - if
       e       - v exists in
         “×ØŒ‘ - literal [17,18,19]
               - then:
D              -   convert to decimal list  e.g. [1,7]
  ⁾0+          -   literal ['0','+']
 j             -   join                          [1,'0','+',7]
     µ         - else:
      ¹        -   identity, v

%ȷ2:“FP‘S‘ŀḟ0Ç€j”+ - Main link: number n in [1,100]
 ȷ2                - literal 100
%                  - mod (convert 100 to 0)
    “FP‘           - literal [70,80]
   :               - integer division (vectorises)
        S          - sum (0 for 1-69&100; 1 for 70-79; 2 for 80-99)
         ‘         - increment (...1, 2 or 3)
          ŀ        - call link at index (1, 2 or 3) as a dyad(sum, n)
           ḟ0      - filter out zeros (remove 0 from 4*20+0)
             ǀ    - call the last link (4) as a monad for each
                ”+ - literal '+'
               j   - join
Jonathan Allan
la source
2

Pyth, 61 56 octets

L?}b}17 19++T\+eb|bk?}/QTr6T.s+?<Q80"60+""4*20+"y%Q20\+y

Testez-le en ligne!

Merci à Leaky Nun pour une amélioration de 5 octets!

Explication:

                     | Implicit: Q=eval(input())
L                    | Define y(b):
 ?}b}17 19           |  If b is in the inclusive range from 17 to 19:
          ++T\+eb    |   Return "10+" + (last digit of b)
                 |b  |  Else: if b!=0: return b
                   k |   Else: return an empty string (Leaves a trailing '+' for case 80)
_____________________|________________
?}/QTr6T                              | If 70<=Q<100:
          +                           |  Concatenate the next two expressions:
           ?<Q80                      |   If Q<80:
                "60+"                 |    Evaluate to "60+"
                     "4*20+"          |    Else: Evaluate to "4*20+"
                            y%Q20     |   y(Q%20)
        .s                       \+   |  Strip off trailing '+', if present (for case 80)
                                   y  | Else: return y(Q)
                                   (Q)| Trailing Q is implicitly added
K Zhang
la source
*-Q100>Q69}/QTr6T
Leaky Nun
@]b}17 19}b}17 19
Leaky Nun
+"10+"ebj\+,Teb
Leaky Nun
@ LeakyNun Merci pour l'aide avec le golf! J'ai apporté les modifications que vous avez suggérées.
K Zhang
1

Python3, 127 octets

m,r=map,range;l=[*r(1,17),*m("10+{}".format,(7,8,9))];f=[0,*l,*r(20,61),*m("60+{}".format,l),"4*20",*m("4*20+{}".format,l),100]

Chaque élément de tableau contient sa représentation:

for i in range(1,101):
    print(i, f[i])

Le code ne crée pas réellement une fonction, mais un tableau - je ne sais pas si c'est autorisé. Sinon, je devrais créer 139 octets en ajoutant f=[...].__getitem__.

émeu
la source
Bienvenue chez PPCG! Je crois qu'il a été question de méta sur la soumission de tableaux sous forme de mappages d'entiers en objets, mais je ne parviens pas à le trouver pour le moment. Je vous ferai savoir si je le fais (et quel a été le résultat de cette discussion). Dans les deux cas, vous n’auriez pas besoin de cela f=, car les fonctions non nommées (c’est-à-dire les expressions qui correspondent à la fonction soumise) conviennent, à moins que le nom ne soit nécessaire pour quelque chose comme la récursion.
Martin Ender
Il n'y a pas de consensus clair, mais la réponse marginalement votée suggère de permettre votre solution.
Martin Ender
0

Java 7, 97 96 109 octets

String c(int i){return i>16&i<20?"10+"+(i-10):i%100<70?i+"":i<80?"60+"+c(i-60):"4*20"+(i<81?"":"+"+c(i-80));}

+13 octets pour le cas de résolution de bugs 80.. :(

Explication:

String c(int i){      // Method with integer parameter and String return-type
  return i>16&i<20?   //  If 17..19:
    "10+"+(i-10)      //   Return "10+" + `i`-10
   :i%100<70?         //  Else if 1..16; 20..69; 100:
    i+""              //   Return `i`
   :i<80?             //  Else if 70..79:
    "60+"+c(i-60)     //   Return "60+" + recursive-call with `i`-60
   :                  //  Else (80..99):
    "4*20"+           //   Return "4*20" +
     (i<81?           //   If 80:
      ""              //    nothing
     :                //   Else (81..99)
      "+"+c(i-80));   //    recursive-call with `i`-80
}                     // End of method

Code de test:

Essayez-le ici.

class M{
  static String c(int i){return i>16&i<20?"10+"+(i-10):i%100<70?i+"":i<80?"60+"+c(i-60):"4*20"+(i<81?"":"+"+c(i-80));}

  public static void main(String[] a){
    for (int i = 1; i <= 100; i++) {
      System.out.println(c(i));
    }
  }
}
Kevin Cruijssen
la source