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
Stewie Griffin
fuente
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?

qoou
fuente
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í.

Gato de negocios
fuente
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'
ETHproducciones
fuente
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)
Neil
fuente
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
;}
Titus
fuente
4

Python 2, 130 108 bytes

22 bytes guardados gracias a @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`

Pruébalo en línea!

Uriel
fuente
108 bytes: TIO
adicto a las matemáticas
1
Debe contar f=porque lo usó dentro de la lambda.
Leaky Nun
@LeakyNun arreglado
Uriel
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.

Neil
fuente
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
Jonathan Allan
fuente
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
K Zhang
fuente
*-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__.

emú
fuente
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));
    }
  }
}
Kevin Cruijssen
fuente