我编程拼图,il代码高尔夫


21

背景

意大利定冠词(相当于英语)有七个不同的形式:L”IL卤味GLI。使用哪一个取决于三个变量:

  • 性别:男性/女性。
  • 数字:单数/复数。
  • 后继单词的首字母:元音/ A型辅音/ B型辅音。
    • 元音是以下任何一种:aeiou
    • 辅音类型B是任何这些情况中:S-后跟另一个辅音,Z-GN- pn结PS-x轴接着元音(此充当半元音)。
    • 类型A的辅音不是类型B的辅音。

下表显示了上述三个变量的十二种组合中的每种将使用的商品形式。请注意,l'形式附加在后面的单词上,并带有单引号和空格。

在此处输入图片说明

挑战

输入一个单词和一个或两个表示性别数字的字符串,数字或布尔值。(必须从输入的单词中获取首字母)。

输入的单词将是一个小写的ASCII字母序列。重音元音将被其非重音版本代替(例如,realtà将作为realta输入)。

性别和数字输入可以是单独的数字,布尔值或字符串,也可以是字符串的组合数(例如,男性单数为1,女性单数为2,等等)。

只要在答案中指定,任何合理的格式和分隔符都可以使用。

输出单词,并冠以相应的文章形式,并根据需要添加空格或单引号。输出也应该是小写。允许尾随空格或前导空格。

打高尔夫,最短的胜利。

测试用例

在我使用的输入字母下面mf指定性别和sp对数(这只是一个可能的输入格式)。

Input               Output              Comment

macchina f s        la macchina         Initial letter is cons. A
zio m s             lo zio              Initial letter is cons. B
libri m p           i libri             Initial letter is cons. A
ieri m s            lo ieri             Initial letter is cons. B
aquile f p          le aquile           Initial letter is vowel
spagnoli m p        gli spagnoli        Initial letter is cons. B
golf m s            il golf             Initial letter is cons. A
ombra f s           l'ombra             Initial letter is vowel
impossibili m p     gli impossibili     Initial letter is vowel

您可能还想对常规动词的组合提出挑战。
user6245072 '16

@ user6245072嗯,有已经这个 ...差别很可能是太小了
路易斯Mendo

1
一个较小的技术上的小问题:/ j /通常被称为英语的半元音,而不是半辅音。我想知道如果将toch⟩代表[ʃ]而不是[k](lo Cheflo chardonnay),法语名称的变体(l'Havetlo Hugo)等边缘情况考虑在内,那么解决方案将是什么?化石形式(gli deiper lo meno),以其姓氏命名的女人(l'Antoniala Antonini),等等。这对于高尔夫球场代码来说是非常艰巨的事情。
Janus Bahs Jacquet

1
作为意大利语,我要求您取消ieri测试用例,因为它是副词而不是名词!(顺便说一句,这是正确的)请!
贾科莫·加拉贝洛

1
我们usally说: “非pensare 一个叔,Pensa 一个 DOMANI”
贾科莫Garabello

Answers:


7

视网膜,138个 133 129 113字节

^.(s[^aeiou]|z|gn|pn|ps|x|i[aeiou])
B$&
^.[aeiou]
V$&
^\d.
A$&
V[02]
l'
A0
il 
B0
lo 
A1
i 
.1
gli 
.2
la 
.3
le 

测试套件。%(G`\n可以一次运行所有测试用例)

输入格式:macchina f s成为2macchina代替。

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

转换表多亏了Kevin Lau


4

Python的3.5,238个 235 192 181 178字节:

-13个字节,感谢Leaky Nun的提示!

import re;R=re.match;lambda a,b:(R('s[^aeiou]|(z|gn|pn|ps|x|i)[aeiou]',a)and['lo ','gli ','la '][b]or R('[aeiou]',a)and["l'",'gli '][b%2]or['il ','i ','la '][b]if b<3else'le ')+a

匿名lambda函数,其接受形式为的参数(<String>, <Integer Gender-Plurality mapping>),其中的映射如下:

0 -> Masculine Singular
1 -> Masculine Plural
2 -> Feminine Singular
3 -> Feminine Plural

要调用它,只需为函数指定任何有效名称,然后像包装在print语句中的普通函数一样调用它。因此,如果要命名问题U,只需将其命名为like print(U(<String>, <Integer Gender-Plurality mapping>))

在线尝试!(爱迪生)


zzz and yyy or xxx比以下两个字节短[xxx,yyy][bool(zzz)]
Leaky Nun

@LeakyNun我能做到吗?哇,我什至都不知道。谢谢!:)
R. Kap

只要yyy是真实的,它就会起作用。
Leaky Nun

@LeakyNun是的,当然。
R. Kap

["l'",'gli '][b%2]比3个字节短["l'",'gli ',"l'"][b]
Leaky Nun

4

Java中,227个 208 195字节

-13个字节感谢Leaky Nun

String f(String a,int o){boolean v=a.matches("^([aeou]|i[^aeiou]).*"),b=a.matches("^([ixz]|gn|pn|ps|s[^aeiou]).*");return(o>1?o>2?"le ":v?"l'":"la ":o>0?v||b?"gli ":"i ":v?"l'":b?"lo ":"il ")+a;}

根据以下映射获取字符串和一个整数:

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

返回带有结果的字符串。

没有测试用例,没有三元运算符(现在为实):

class Test {

    public static String f(String a, int o) {
        boolean v = a.matches("^([aeou]|i[^aeiou]).*");
        boolean b = a.matches("^([ixz]|gn|pn|ps|s[^aeiou]).*");
        String r;
        if(o > 1)
            if(o > 2)
                r = "le ";
            else
                if(v)
                    r = "l'";
                else
                    r = "la ";
        else
            if(o > 0)
                if(v || b)
                    r = "gli ";
                else
                    r = "i ";
            else
                if(v)
                    r = "l'";
                else if(b)
                    r = "lo ";
                else
                    r = "il ";
        return r + a;
    }

    public static void main(String[] args) {
        System.out.println(f("macchina", 2));
        System.out.println(f("zio", 0));
        System.out.println(f("libri", 1));
        System.out.println(f("ieri", 0));
        System.out.println(f("aquile", 3));
        System.out.println(f("spagnoli", 1));
        System.out.println(f("golf", 0));
        System.out.println(f("ombra", 2));
        System.out.println(f("impossibili", 1));
    }
}

使用一点正则表达式魔术,并根据指定的两个布尔值进行操作。令我惊讶的是,不需要导入,这有助于代码大小!


1
我的比...长吗?我必须尽快打雷!干得好!+1
R. Kap

如果我不得不从命令行或标准输入取自我的论点,请相信我,这将花费更长的时间:P

是的,布尔也接受。我在
Luis Mendo

我认为您可以使用0/1而不是false/true应该节省一些字节。
Leaky Nun

String e = "[^aeiou]).*";实际上,不使用将为您节省5个字节。
Leaky Nun

3

Ruby,147,146字节

在线尝试吗?

可能可以使用更好的方法来确定要使用哪篇文章,但我不知道有什么。

根据规范,标识符是一个数字,如下所示:

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

->w,i{(%w"lo gli la le l' gli l' le il i la le"[(0..2).find{|r|[/^(i[aeiou]|s[^aeiou]|z|x|[gp]n|ps)/,/^[aeiou]/,//][r]=~w}*4+i]+' '+w).sub"' ",?'}

2

分批,446个 390 385 380字节

@echo off
set w=%2
call:l %1 l' gli_ l' le_ il_ i_ la_ le_ lo_ gli_ le_ le_
exit/b
:l
for /l %%a in (0,1,%1)do shift
set o=%5
for %%a in (gn pn ps)do if %%a==%w:~,2% set o=%9
for %%a in (s z x)do if %%a==%w:~,1% set o=%9
for %%a in (a e i o u)do if %%a==%w:~,1% set o=%1
for %%a in (a e i o u)do if i%%a==%w:~,2% (set o=%9)else if s%%a==%w:~,2% set o=%1
echo %o:_= %%w%

新版本使用的0-3性别和数字编码与其他几个答案相同。通过创建表单的一维数组%2.. %13,然后移出第一个1+%1元素,使感兴趣的表单变为%1%5%9(这很幸运,因为Batch不会移至上方)%9而起作用。然后,它会费力地检查前缀列表,以找出需要使用哪种格式。_用作占位符以表示空格,直到输出单词为止。


还可以将它们编码为一个数字(如果需要,可以按字母表示,因为规范允许)以保存字节。一切都是为了字节!
价值墨水

@ KevinLau-notKenny切换到数字编码使我可以通过重写性别和数字处理来节省多达56个字节!
尼尔

1

Python 3,235个字节

我很想知道没有正则表达式的情况下用Python可以得到多短的时间。事实证明,这不是最佳选择。

lambda s,c,v='aeiou':[["l'",'il','lo'],['gli','i','gli'],["l'",'la','la'],['le']*3][c][[[1,2][s[0]=='s'and s[1]not in v or s[0]in'zx'or s[:2]in['gn','pn','ps']or s[0]=='i'and s[1]in v],0][s[0]in v and not(s[0]=='i'and s[1]in v)]]+' '+s

一个匿名函数,使用以下映射通过单词的实参s和性别编号代码将输入c作为整数。

0 - Masculine Singular
1 - Masculine Plural
2 - Feminine Singular
3 - Feminine Plural

并返回带有正确文章的单词。

怎么运行的

创建一个包含每种可能性的列表c作为单独的列表。然后,使用的值对列表进行索引c,生成带有相关选项的3元素列表。现在,通过使用布尔表达式的结果索引到另一个嵌套列表中来选择列表索引。如果的第一个字符s是元音而不是i后跟元音,vowel则通过返回index产生for的选项0。否则,将计算返回Truefor cons. BFalsefor 的布尔表达式,分别cons. A产生索引21。最后,使用索引生成文章,并在返回之前将其与空格和原始字符串连接在一起。

在Ideone上尝试


1

JavaScript 210字节

(s,p)=>{var c=i=>!("aeiou".indexOf(s[i])+1),r=["z","gn","pn","ps","x"].some(t=>!s.indexOf(t))||(c(1)?s[0]=="s":s[0]=="i")?2:c(0)?1:0;return (p&1?(p&2?"le ":r&1?"i ":"gli "):!r?"l'":p&2?"la ":r&1?"il ":"lo ")+s}

具有两个参数s和p的匿名函数,其中

s  is the input string
p  is plurality (bit 0, set=plural) and gender (bit 1, set=f) combined as
    0 = masculine singular
    1 = masculine plural
    2 = feminine singular
    3 = feminine plural

将函数分配给变量并进行一些解压缩后,可以将其测试为

var f=(s,p)=>{
    var c = i=>!("aeiou".indexOf(s[i])+1),
        r = ["z","gn","pn","ps","x"].some(t=>!s.indexOf(t))
             || ( c(1)? s[0]=="s":s[0]=="i" )
             ?   2 : c(0) ? 1 : 0;

     return (p&1?(p&2?"le ":r&1?"i ":"gli "):!r?"l'":p&2?"la ":r&1?"il ":"lo ")+s;
}

console.log("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
 f("macchina",2),
 f("zio",0),
 f("libri",1),
 f("ieri", 0),
 f("aquile",3),
 f("spagnoli",1),
 f("golf",0),
 f("ombra",2),
 f("impossibili",1))

哪里

  • c是测试s位置辅音的功能i
  • r 以元音开头时为0,以A型辅音开头为1,以B型辅音开头为2(以相反顺序测试)。
  • return语句中的位冲击将其放在一起。
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.