Traducir números al francés


46

Los franceses deletrean los números de una manera peculiar.

  • 1-16 son "normales"
  • 17-19 se detallan 10 + 7. 10 + 8, 10 + 9 .
  • 20-69 son "normales" (OK, OK! No realmente, pero están en este desafío)
  • 70-79 son 60 + 10, 60 + 11 ... 60 + 10 + 7, 60 + 10 + 8, 60 + 10 + 9 .
  • 80-99 son 4 * 20, 4 * 20 + 1, 4 * 20 + 2 ... 4 * 20 + 16, 4 * 20 + 10 + 7, 4 * 20 + 10 + 8, 4 * 20 + 10 + 9 9

Desafío:

Tome un número entero positivo en el rango [1,100] y transmítalo a la "manera francesa". Debe generarlo exactamente como se muestra a continuación, con *y +, por 97lo tanto 4*20+10+7, no [4 20 10 7]o algo más.

Casos de prueba:

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

14
Todos los idiomas que conozco tiene una transición en los "adolescentes", como el de 16a 10+7arriba. (En inglés ocurre entre 12y 10+3, con un poco más de disfraz morfológico). Siempre he estado un poco obsesionado con el hecho de que diferentes idiomas hacen esa transición en diferentes números.
Greg Martin

25
¿Por qué debería ser "vingt-deux" 22cuando es "dix-huit" 10+8?
Titus

11
Afortunadamente, este es un sitio de programación de rompecabezas y no un sitio de trivia lingüística. De lo contrario, las personas podrían molestarse cuando OP comete errores tontos. ¡Uf!
Stewie Griffin

44
@StewieGriffin La gente todavía se molestó.
Leaky Nun

2
Como francés, lo encuentro bastante bien: D.
Walfrat

Respuestas:


13

Excel, 153 149 Bytes

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

Estoy seguro de que esto podría ser mejor, luché para encontrar una manera eficiente de dar cuenta del # 80.

editar: Consolidado los casos 'Normal' mejor para guardar 4 bytes. # 80 todavía apesta.

No puedo encontrar una respuesta específica aquí, no estoy seguro de las reglas de code-golf tbh. ¿Puedo usar varias celdas en Excel y agregar el recuento de bytes de cada una?

es decir. Para una entrada en la celda A1

A2: 11 bytes

=MOD(A1,20)

A3 (resultado): 125 bytes

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

Para un total de 136?


Creo que debería permitirse escribir código en varias celdas. En mi humilde opinión es como tener variables intermedias o funciones en otros lenguajes de programación.
pajonk

Siento que debería haber alguna penalización por usar múltiples celdas, al igual que hay una penalización por usar funciones en otros idiomas (eso de escribir el repetitivo para declarar la función). ¿Quizás la codificación más compatible admite (es decir, CSV), por lo que la cantidad necesaria de comas y (si es necesario) comillas?
Muzer

No conozco ningún formato en el que los archivos de Excel se puedan guardar con una salida reconocible. Los archivos CSV no admiten de manera predeterminada funciones como estas, y dividirán cualquier función que use una coma. Si se guarda como texto puro en una columna con una nueva línea entre celdas, podría copiarse directamente en Excel y en la función. En este caso, se agregaría 1 byte por cada celda adicional.
qoou

Ahorre un byte mediante la conversión IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))aIFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
Greedo

En Libreoffice calc, puede omitir )al final, ¿puede hacer lo mismo en Excel? Por lo tanto, puede guardar 5 "bytes" (realmente hay caracteres UCS2, por lo que si dice Byte == octeto, debe contarlo dos veces). Y debe cambiar el ,en;
12431234123412341234123

8

Retina , 52 48 bytes

4 bytes guardados gracias a Neil

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

Pruébalo en línea! o verificar todas las entradas (proporcionadas por Neil)

Explicación

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

Primero manejamos la traducción de 70, 80 y 90. En estas primeras 3 etapas, un 7 al comienzo con otro carácter que lo sigue se reemplaza por 60+1. Del mismo modo, 9se reemplaza por 81y 8por 4*20+1. El reemplazo de 9esencialmente lo está cambiando a "ochenta y diez" y tal, de modo que 8el siguiente reemplazo lo maneja, lo que ahorra bytes sobre la escritura 4*20+1dos veces.

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

Este se encarga de los casos de 17, 18y 19, mediante la sustitución de la 1de cada uno con 10+.

\+0

Finalmente, nunca debería haber un +0al final, así que elimínelo si está allí.


Seguramente, en cambio, si mira hacia atrás y hacia atrás, puede usar grupos de captura
Downgoat el

No funciona 7-9, pero no creo que necesites esa mirada atrás: ¡ Pruébalo en línea!
Neil

@Neil Me di cuenta de que mientras estaba fuera: P Pero gracias por la nueva versión!
Business Cat

@Downgoat Podría reemplazar el lookahead con un grupo de captura pero no guardaría ningún byte ya que $1es tan largo como ?=.
Business Cat


7

JavaScript (ES6), 73 71 bytes

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'

Versión de bonificación que imprime los números tal como se escriben en realidad para 2 bytes adicionales:

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'

1
falla por muchas entradas; en realidad solo funciona para 1..20, 30, 40, 50, 60, 80 y 100.
Titus

@Titus Creo que estás malinterpretando la mayoría de los resultados. 23, por ejemplo, se supone que sale 23, no 20+3.
ETHproductions

Ahorre dos bytes con(m=n%20)
Titus

@Titus Gracias, pero ya lo intenté, y no funciona en 70-99 porque mse restablece 0en la f(n-n%20)llamada. (Es una variable global)
ETHproductions

Puede guardar un byte cambiando n<70|n>99a n%100<70. Además, ¿podría agregar un compilador de prueba?
Kevin Cruijssen

5

R, 110 bytes

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)

Intenta en (i-r)/10lugar de floor(i/10). Y i>15debería ser i>16.
Titus

5

PHP, 99 bytes (quiero ser una versión feliz)

un puerto directo de ETHproductions 'JS , 4 bytes de golf. Imprime los números solicitados por el 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;}

Descompostura

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
    ;
}

Quiero tener la versión correcta, 114 98 bytes

El nuevo enfoque inspirado en ETHproductions imprime los números tal como están enunciados.

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;}

Pruébalo en línea .

Descompostura

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
;}


3

Lote, 220 217 bytes

@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%

Toma entrada en STDIN. La generación y eliminación de los primeros +guardados guarda 1 byte sobre la carcasa especial 80. Editar: Guardado 3 bytes gracias a @ ConorO'Brien.


Puede guardar 3 bytes eliminando @echo offy agregando el prefijo de todas las declaraciones, excepto la declaración de ciclo hte con@
Conor O'Brien

@ ConorO'Brien Huh, me pregunto por qué olvidé hacer eso esta vez ...
Neil

2

Jalea , 55 bytes

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

Pruébalo en línea! o ver un conjunto de pruebas

¡Sin duda hay un camino más corto!

¿Cómo?

+ - 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

2

Pyth, 61 56 bytes

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

¡Pruébelo en línea!

¡Gracias a Leaky Nun por una mejora de 5 bytes!

Explicación:

                     | 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

*-Q100>Q69}/QTr6T
Leaky Nun

@]b}17 19}b}17 19
Leaky Nun

+"10+"ebj\+,Teb
Leaky Nun

@LeakyNun ¡Gracias por la ayuda con el golf! He hecho los cambios que sugirió.
K Zhang

1

Python3, 127 bytes

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]

Cada elemento de la matriz contiene su representación:

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

El código en realidad no crea una función, solo una matriz; no sé si eso está permitido. De lo contrario, tendría que hacer estos 139 bytes agregando f=[...].__getitem__.


Bienvenido a PPCG! Creo que hubo una discusión sobre meta sobre el envío de matrices como asignaciones de enteros a objetos, pero parece que no puedo encontrarlo en este momento. Le haré saber si lo hago (y cuál fue el resultado de esa discusión). De cualquier manera, no necesitará f=, porque las funciones sin nombre (es decir, las expresiones que evalúan la función enviada) están bien a menos que el nombre sea necesario para algo como la recursividad.
Martin Ender

No existe un consenso claro, pero la respuesta marginalmente más votada sugiere permitir su solución.
Martin Ender

0

Java 7, 97 96 109 bytes

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 bytes para el caso de corrección de errores 80.. :(

Explicación:

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

Código de prueba:

Pruébalo aquí

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));
    }
  }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.