Distinguir entre sustantivos masculinos y femeninos en francés con 100 caracteres

21

Debes escribir un programa muy pequeño con 100 caracteres. Su programa debe distinguir entre sustantivos franceses masculinos y femeninos. El resultado debería ser unsi es masculino y unesi es femenino. A menudo, hay ciertas reglas estadísticas que puede seguir (por ejemplo, si termina en una "e", es más probable que sea femenino que masculino).

Entrada :

Una palabra francesa; puede consistir en letras minúsculas y guiones, incluidas letras minúsculas con acentos.

Entrada de ejemplo: ami

Salida :

unsi la palabra es masculina y unesi la palabra es femenina.

Salida de ejemplo: un

No es necesario que cada palabra sea correcta; Su objetivo es ser lo más preciso posible.

Puntuación : su respuesta debe estar dentro de 100 caracteres. Declaraciones como printo console.logo alertqué no se cuentan como parte de los bytes totales. También puede escribir una función o método que realice esta tarea, en cuyo caso los primeros bytes (p f=x=>. Ej. ) Que forman parte de la declaración de la función no cuentan en su total. Su puntaje total es el número de respuestas incorrectas. Los lazos están rotos por el tamaño del código.

Sustantivos para probar con:

un ami
un café
un chapeau
un concert
un crayon
un garage
un garçon
un lit
un livre
un mari
un musée
un oncle
un ordinateur
un pantalon
un piano
un pique-nique
un portable
un père
un sandwich
un saxophone
un stade
un stylo
un théâtre
un téléphone
un voisin
une botte
une boum
une chaise
une chaussette
une chemise
une clarinette
une copine
une femme
une fille
une glace
une heure
une lampe
une maison
une montagne
une personne
une piscine
une pizza
une radio
une raquette
une salade
une souris
une sœur
une table
une télé
une voiture
soktinpk
fuente
66
Hubiera agregado un squelette a la lista solo para complicar las cosas.
200_success

Respuestas:

23

CJam, 0 incorrecto, 32 29 bytes

Este código utiliza algunos caracteres extraños (algunos de ellos no imprimibles), pero todos están dentro del rango ASCII extendido. Entonces, nuevamente, cuento cada carácter como un solo byte.

"un"'el2b"zPB:  ":i+:%2/*

Debido a los caracteres no imprimibles, estoy seguro de que Stack Exchange se traga un poco, por lo que es posible que desee copiar el código del contador de caracteres (muestra bytes con codificación UTF-8, que es subóptimo para este desafío; también, el enlace no ' No parece funcionar en Firefox, pero funciona en Chrome).

Pruébalo aquí.

Después de un poco más de discusión en el chat, nos dimos cuenta de que regex golf no nos llevaría mucho más lejos. Entonces, siguiendo una sugerencia mía anterior (en broma), comenzamos a buscar manipular los códigos de caracteres de las palabras con ciertas funciones, de modo que todas las palabras de un grupo arrojarían un número con alguna propiedad que es fácil de verificar. ¡Y tuvimos más suerte de lo que esperábamos! Esto es lo que el código le hace a las palabras:

  • Convierte implícitamente los caracteres de la palabra en sus puntos de código.
  • Interprete esos como dígitos en la base 2 (sí, los dígitos serán mucho más grandes que 0 o 1, pero CJam puede manejar eso).
  • En repetidas ocasiones tomar el resultado de módulo ... los siguientes números: [133, 122, 80, 66, 58, 26, 20, 14, 9, 4]. Esta secuencia de números está codificada como los puntos de código de una cadena (aquí es donde entran los caracteres extraños e imprimibles).
  • Como por arte de magia, los 25 sustantivos masculinos rinden 0o 1, y los 25 sustantivos femeninos rinden 2o 3con este procedimiento. Entonces, si dividimos esto por 2(división entera) obtenemos ceros para sustantivos masculinos y unos para sustantivos femeninos.

Para redondear, empujamos "un"la pila, luego empujamos un solo e. Luego leemos la palabra de entrada de STDIN y realizamos el cálculo anterior, y finalmente multiplicamos el epor el resultado.

Nunca antes había incluido el módulo en ninguna lista, y siento que nunca lo volveré a hacer ...

Muchas gracias por xnor y Sp3000 por lanzar ideas y ayudar con la búsqueda de la cadena divisoria.

Martin Ender
fuente
No solo más corto, sino 2 minutos más rápido. ¡El horror!
Dennis
@sudo;) ... una de las raras veces que puedo vencerte ... Sin embargo, estaría muy interesado en una explicación tuya :)
Martin Ender
11
Espera, estoy confundido. Si existe la magia, ¿por qué la desperdicias en un sitio de desafío de programación tonto y no estás resolviendo la paz mundial o algo así? (No, pero en serio, woah . +1)
Pomo de la puerta
22

Ruby, 0 incorrecto, 63 56 53 52 51 50 bytes

Todos los caracteres están en ASCII extendido , específicamente ISO 8859-1 , por lo que cuento cada carácter como un solo byte.

f=->s{s[/la|tt|i.e|[égdzœu]..$|^b|^f|so|^ta/]?'une':'un'}

Parece que su conjunto de prueba era demasiado corto. He generado la expresión regular con el meta regex golfista de Peter Norvig .

Puede llamar a la función anterior como f["ami"]. Puede usar este arnés de prueba para verificar todos los casos de prueba:

puts "ami café chapeau concert crayon garage garçon lit livre mari musée 
      oncle ordinateur pantalon piano pique-nique portable père sandwich 
      saxophone stade stylo théâtre téléphone voisin botte boum chaise 
      chaussette chemise clarinette copine femme fille glace heure lampe 
      maison montagne personne piscine pizza radio raquette salade souris 
      sœur table télé voiture".split.map{|s|f[s]+" "+s}

Pruébelo en tierra de codificación.

Editar: Usando el segundo script de Peter Norvig, encontré una expresión regular diferente, que en realidad era un byte más, pero que podía acortar a dos bytes a mano.

Editar: Sp3000 configuró el golfista de expresiones regulares que escribió para mi reciente desafío de expresiones regulares, y encontró una expresión regular de 36 35 34 bytes para que yo usara. ¡Gracias por eso!

Martin Ender
fuente
2
Revivir las pesadillas del golf meta regex aquí porque tablees una subcadena de portable, y cambiar el conjunto para que coincida no es muy útil porque el segundo conjunto parece más fácil de combinar ...
Sp3000
13

CJam, 0 errores ( 36 32 29 28 bytes)

{"un"oEb72^"+ÕåWïº"583b2b='e*o}:F;

Esta es una función con nombre, así que solo estoy contando el código interno. Además, oes una declaración impresa, por lo que no contribuye al recuento de bytes.

Pruebe los casos de prueba en el intérprete de CJam .

Cómo funciona

"un"o       " Print 'un'.                                                  ";
Eb          " Consider the input a base 14 number.                        ";
72^         " XOR the result with 72.                                     ";
"+ÕåWïº"    " Push that string.                                           ";
583b2b      " Convert from base 583 to base 2.                            ";
=           " Retrieve the corresponding element (0 or 1) from the array. ";
'e*o        " Print 'e' that many times.                                  ";

Solo una función hash y una búsqueda de tabla.

Dennis
fuente