Distinguer les noms masculins et féminins en français sur 100 caractères

21

Vous devez écrire un très petit programme de 100 caractères. Votre programme doit faire la distinction entre les noms français masculins et féminins. La sortie doit être unsi elle est masculine et unesi elle est féminine. Souvent, il existe certaines règles statistiques que vous pouvez suivre (par exemple, si elle se termine par un «e», elle est plus susceptible d'être féminine que masculine).

Entrée :

Un mot français; il peut être composé de lettres minuscules et de tirets, y compris de lettres minuscules accentuées.

Exemple d'entrée: ami

Sortie :

unsi le mot est masculin et unesi le mot est féminin.

Exemple de sortie: un

Vous n'avez pas besoin de bien saisir chaque mot; votre objectif est d'être aussi précis que possible.

Notation : votre réponse doit contenir moins de 100 caractères. Des déclarations telles que printou console.logou alertne pas compter dans le cadre de vos octets au total. Vous pouvez également écrire une fonction ou une méthode qui exécute cette tâche, auquel cas les premiers octets (par exemple f=x=>) qui font partie de la déclaration de fonction ne comptent pas dans votre total. Votre score total est le nombre de réponses incorrectes. Les liens sont rompus par la taille du code.

Noms à tester avec:

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
la source
6
J'aurais ajouté un squelette à la liste juste pour compliquer les choses.
200_success

Réponses:

23

CJam, 0 incorrect, 32 29 octets

Ce code utilise quelques caractères impairs (certains non imprimables), mais ils sont tous bien dans la plage ASCII étendue. Encore une fois, je compte chaque caractère comme un seul octet.

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

En raison des caractères non imprimables, je suis sûr que Stack Exchange en avale, donc vous voudrez peut-être copier le code du compteur de caractères (il affiche des octets avec le codage UTF-8, ce qui n'est pas optimal pour ce défi; aussi, le lien ne fonctionne pas '' semble pas fonctionner dans Firefox, mais fonctionne dans Chrome).

Testez-le ici.

Après quelques discussions supplémentaires dans le chat, nous avons pensé que le golf regex ne nous amènerait pas beaucoup plus loin. Donc, suite à une suggestion (plaisantante) de moi, nous avons commencé à chercher à manipuler les codes de caractères des mots avec certaines fonctions, de sorte que tous les mots d'un groupe donneraient un nombre avec une propriété facile à vérifier. Et nous avons eu plus de chance que prévu! Voici ce que le code fait aux mots:

  • Convertissez implicitement les caractères du mot en leurs points de code.
  • Interprétez-les comme des chiffres dans la base 2 (oui, les chiffres seront beaucoup plus grands que 0 ou 1, mais CJam peut gérer cela).
  • Prendre à plusieurs reprises le modulo résultat ... les numéros suivants: [133, 122, 80, 66, 58, 26, 20, 14, 9, 4]. Cette séquence de nombres est elle-même codée comme les points de code d'une chaîne (c'est là qu'interviennent les caractères étranges et non imprimables).
  • Comme par magie, les 25 noms masculins donnent 0ou 1, et les 25 noms féminins donnent2 ou 3avec cette procédure. Donc, si nous divisons cela par 2(division entière), nous obtenons des zéros pour les noms masculins et des zéros pour les noms féminins.

Pour arrondir, on pousse "un" sur la pile, nous poussons un seul e. Ensuite, nous lisons le mot d'entrée de STDIN et effectuons le calcul ci-dessus, et finalement multiplions le epar le résultat.

Je n'ai jamais ajouté modulo à aucune liste auparavant, et j'ai l'impression de ne plus jamais le faire ...

Un grand merci pour xnor et Sp3000 pour avoir lancé des idées et aidé dans la recherche de la chaîne de diviseurs.

Martin Ender
la source
Non seulement plus court, mais 2 minutes plus rapide. L'horreur!
Dennis
@sudo;) ... une des rares fois où je suis en mesure de vous battre ... Je serais très intéressé par une explication de la vôtre :)
Martin Ender
11
Attends, je suis confus. Si la magie existe, pourquoi la gaspillez-vous sur un site de défi de programmation stupide et ne résolvez-vous pas la paix mondiale ou quelque chose? (Non, mais sérieusement, woah . +1)
Poignée de porte
22

Ruby, 0 incorrect, 63 56 53 52 51 50 octets

Tous les caractères sont en ASCII étendu , en particulier ISO 8859-1 , donc je compte chaque caractère comme un seul octet.

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

Il semble que votre jeu de test soit un peu trop court. J'ai généré l'expression régulière avec le golfeur meta regex de Peter Norvig .

Vous pouvez appeler la fonction ci-dessus comme f["ami"]. Vous pouvez utiliser ce faisceau de test pour vérifier tous les cas de test:

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}

Testez-le sur Coding Ground.

Edit: En utilisant le deuxième script de Peter Norvig, j'ai trouvé un regex différent, qui était en fait un octet de plus, mais que je pouvais raccourcir de deux octets à la main.

Edit: Sp3000 a défini le golfeur regex qu'il a écrit pour mon récent défi regex dessus, et a trouvé une regex 36 35 34 octets pour moi à utiliser. Merci pour ça!

Martin Ender
la source
2
Revivre les cauchemars du golf méta regex ici parce que tablec'est une sous-chaîne de portable, et changer le jeu qui correspond n'est pas très utile parce que le deuxième jeu semble plus facile à faire correspondre ...
Sp3000
13

CJam, 0 erreur ( 36 32 29 28 octets)

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

Ceci est une fonction nommée, donc je ne compte que le code interne. Également,o est une instruction d'impression, donc elle ne contribue pas au nombre d'octets.

Essayez les cas de test dans l' interpréteur CJam .

Comment ça marche

"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.                                  ";

Juste une fonction de hachage et une recherche de table.

Dennis
la source