区分法语中的男性名词和女性名词(不超过100个字符)


21

您要编写一个不超过100个字符的小程序。您的程序必须区分男性和女性法语名词。输出应该un是男性的une还是女性的。通常,您可以遵循某些统计规则(例如,如果以“ e”结尾,则女性化的可能性要大于男性)。

输入

法语单词;它可以包含任何小写字母和破折号,包括带重音符号的小写字母。

输入示例: ami

输出

un如果这个词是男性的,une如果这个词是女性的。

输出示例: un

您不必每个单词都正确;您的目标是尽可能准确。

评分:您的答案必须在100个字符以内。语句如printconsole.logalert根本指望作为你的总字节数的一部分。您也可以编写执行此任务的函数或方法,在这种情况下,f=x=>属于函数声明的前几个字节(例如)不会计入总数。您的总分数是不正确答案的数量。领带因代码大小而中断。

要测试的名词:

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

6
我本可以将un squelette添加到列表中来,以使事情变得困难。
200_success

Answers:


23

CJam,0个错误,32个 29字节

该代码使用了一些奇数字符(其中一些是不可打印的),但是它们都在扩展的ASCII范围内。同样,我将每个字符都计为一个字节。

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

由于无法打印的字符,我确定Stack Exchange会吞下一些字符,因此您可能希望从字符计数器中复制代码(它显示采用UTF-8编码的字节,因此对于此挑战而言不是最佳选择;此外,链接不会似乎无法在Firefox中使用,但在Chrome中可以使用)。

在这里测试。

在聊天中进行了更多讨论之后,我们认为正则表达式高尔夫不会使我们走得更远。因此,按照我的一个早期(开玩笑)的建议,我们开始研究处理具有某些功能的单词的字符代码,以使来自一组的所有单词都将产生一个具有易于检查的属性的数字。而且我们比预期的要幸运!这是代码对单词的作用:

  • 将单词中的字符隐式转换为它们的代码点。
  • 将这些数字解释为以2为底的数字(是的,数字将比0或1大得多,但CJam可以处理)。
  • 反复取结果取模...以下数字:[133, 122, 80, 66, 58, 26, 20, 14, 9, 4]。这个数字序列本身被编码为字符串的代码点(这是奇怪且不可打印的字符出现的位置)。
  • 就像通过魔术一样,使用此过程,所有25个男性名词都产生01,并且所有25个女性名词都产生23。因此,如果将其除以2(整数除法),则男性名词为零,女性​​名词为1。

为了四舍五入,我们压入"un"堆栈,我们压入一个e。然后,我们从STDIN读取输入的单词并执行上述计算,最后将乘以e结果。

我以前从来没有对任何列表取模,而且我觉得我再也不会...

非常感谢xnor和Sp3000提出的想法并帮助寻找除数链。


不仅更短,而且快了2分钟。惊恐的事件!
丹尼斯

@sudo;)...我能打败您的罕见情况之一...我对您的解释很感兴趣:)
Martin Ender 2014年

11
等等,我很困惑。如果存在魔术,为什么要在一个愚蠢的编程挑战网站上浪费它而不解决世界和平之类的问题?(不,但认真的,。+1)
门把手

22

Ruby,0错误,63 56 53 52 51 50字节

所有字符均采用扩展ASCII格式,尤其是ISO 8859-1,因此我将每个字符视为一个字节。

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

您的测试集似乎太短了。我已经用Peter Norvig的meta regex golfer生成了正则表达式

您可以像一样调用上述函数f["ami"]。您可以使用此测试工具来检查所有测试用例:

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}

在编码地面上进行测试。

编辑:使用Peter Norvig的第二个脚本,我找到了一个不同的正则表达式,实际上长了一个字节,但是我可以手工缩短两个字节。

编辑: Sp3000设置了他为我最近的正则表达式挑战编写的正则表达式高尔夫球手,并发现了一个36 35 34字节的正则表达式供我使用。感谢那!


2
在这里消除meta regex golf的噩梦,因为它table是的子字符串portable,并且切换要匹配的设置不是很有用,因为第二组似乎更容易匹配...
Sp3000 2014年

13

CJam,0个错误(36 32 29 28个字节)

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

这是一个命名函数,因此我只计算内部代码。另外,它o是一条打印语句,因此它不会增加字节数。

CJam解释器中尝试测试用例。

怎么运行的

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

只是一个哈希函数和一个表查找。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.