I programação de quebra-cabeças, il code golf

21

fundo

O artigo definitivo italiano (correspondente ao inglês the ) possui sete formas diferentes: l ' , il , lo , gli , i , la , le . Qual usar depende de três variáveis:

  • Gênero: masculino / feminino.
  • Número: singular / plural.
  • Letra inicial da palavra subsequente: vogal / consoante tipo A / consoante tipo B.
    • A vogal é uma destas: aeiou .
    • Tipo consoante B é qualquer um destes casos: S- seguido por outra consoante, Z- , gn- , p_N , ps , X- , i- seguido de vogal (isto i actua como um semivowel).
    • A consoante tipo A é uma consoante que não é do tipo B.

A tabela mostra o formulário do artigo a ser usado em cada uma das doze combinações das três variáveis ​​acima. Observe que o formulário l ' é anexado à seguinte palavra com aspas simples e sem espaço.

insira a descrição da imagem aqui

O desafio

Insira uma palavra e uma ou duas seqüências, números ou booleanos indicando sexo e número . (As letras iniciais deverão ser obtidas a partir da palavra de entrada).

A palavra de entrada será uma sequência de letras ASCII em minúsculas. As vogais acentuadas serão substituídas por suas versões não acentuadas (por exemplo, realtà será inserida como realta ).

As entradas de gênero e número podem ser números separados, booleanos ou strings ou um número combinado de strings (por exemplo, 1 para singular masculino, 2 para singular feminino, etc.).

Qualquer formato e separador razoáveis ​​podem ser usados, desde que especificados na resposta.

Envie a palavra precedida pela forma apropriada do artigo , com espaço ou aspas simples, conforme necessário. A saída também deve estar em minúsculas. Espaço em branco à direita ou à esquerda é permitido.

Código de golfe, vitórias mais curtas.

Casos de teste

Em seguida eu uso as letras de entrada m, fpara especificar o sexo, e s, ppara o número (este é apenas um possível formato de entrada).

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
Luis Mendo
fonte
Você também pode desafiar a coniugação de verbos regulares.
user6245072
@ user6245072 Bem, já há este ... a diferença seria provavelmente muito pequena
Luis Mendo
11
Um pequeno detalhe técnico: / j / é normalmente chamado de semivogal em inglês, e não semiconsonante . Eu me pergunto quais seriam as soluções se eles levassem em consideração casos extremos como ⟨ch⟩ representando [ʃ] em vez de [k] ( lo chef , lo chardonnay ), a variação com nomes franceses ( l'Havet, mas lo Hugo ), formas fossilizadas ( gli dei , per lo meno ), mulheres chamadas por seu sobrenome ( l'Antonia but la Antonini ), etc. Isso seria bastante formidável para o código de golfe.
Janus Bahs Jacquet
11
Como italiano, peço que retire o iericaso de teste porque é um advérbio e não um substantivo! (BTW foi formalmente correto) Por favor!
Giacomo Garabello
11
Costumamos dizer: "Não pensare a ieri, Pensa a Domani"
Giacomo Garabello

Respostas:

7

Retina, 138 133 129 113 113 bytes

^.(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 

Suíte de teste. (anexado %(G`\npara executar todos os casos de teste de uma vez)

Formato de entrada: macchina f storna - se 2macchina.

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

Tabela de conversão graças a Kevin Lau .

Freira Furada
fonte
4

Python 3.5, 238 235 192 181 178 bytes:

( -13 bytes graças às dicas da 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

Uma função lambda anônima que recebe argumentos na forma de (<String>, <Integer Gender-Plurality mapping>), onde o mapeamento é o seguinte:

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

Para chamá-lo, simplesmente atribua à função qualquer nome válido e, em seguida, chame-a como uma função normal envolvida em uma instrução print. Portanto, se a pergunta for nomeada U, basta chamá-la como print(U(<String>, <Integer Gender-Plurality mapping>)).

Experimente Online! (Ideona)

R. Kap
fonte
zzz and yyy or xxxé dois bytes mais curto que #[xxx,yyy][bool(zzz)]
Leaky Nun
@LeakyNun eu posso fazer isso? Uau, eu nem sabia. Obrigado! :)
R. Kap
Funciona desde que yyyseja verdade.
Freira vazando
@LeakyNun Sim, é claro.
R. Kap 16/07
["l'",'gli '][b%2]3 bytes é mais curto do que["l'",'gli ',"l'"][b]
gotejante Nun
4

Java, 227 208 195 bytes

-13 bytes graças a 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;}

Leva sua string e um int com base no seguinte mapeamento:

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

Retorna uma string com o resultado.

Sem jogar com casos de teste e sem operadores ternários (de verdade agora):

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));
    }
}

Usa um pouco de magia regex e age dependendo dos dois booleanos especificados. Para minha surpresa, não são necessárias importações, o que ajuda no tamanho do código!


fonte
11
O meu é ... mais longo que o JAVA ?! Eu devo jogar o meu no golfe um pouco mais cedo possível! Bom trabalho! 1
R. Kap 16/07
Se eu tive que tirar meus argumentos na linha de comando ou stdin, acredite em mim, teria sido muito mais tempo: P
Sim, os booleanos também aceitaram. Eu editei isso em
Luis Mendo
Eu acho que você pode usar em 0/1vez de false/trueque você deve economizar alguns bytes.
Freira vazando
Não usar String e = "[^aeiou]).*";realmente economiza 5 bytes.
Freira vazando
3

Ruby, 147 146 bytes

Experimente online?

Pode ser possível usar um método melhor para determinar qual artigo usar, mas não conheço nenhum.

Conforme a especificação, o identificador é um número, da seguinte maneira:

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"' ",?'}
Value Ink
fonte
2

Lote, 446 390 385 380 bytes

@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%

A nova versão usa a mesma 0-3codificação para o gênero e o número de várias outras respostas. Funciona criando uma matriz unidimensional %2.. %13de formas e, em seguida, alterando os primeiros 1+%1elementos para que as formas de interesse se tornem %1, %5e %9(que é uma sorte, pois o Batch não subirá %9sem mudar). Em seguida, verifica laboriosamente as listas de prefixos para descobrir qual formulário precisa ser usado. _é usado como um espaço reservado para representar um espaço até a palavra ser impressa.

Neil
fonte
É bem possível que eles sejam codificados em um único dígito (ou letra, se necessário, pois a especificação permite) para salvar bytes. Tudo é pelo bem dos bytes!
Value Ink
@ KevinLau-notKenny Mudar para a codificação de dígitos me permitiu economizar 56 bytes, reescrevendo a manipulação de gênero e número!
Neil
1

Python 3, 235 bytes

Eu estava interessado em ver quão curto eu poderia conseguir isso em Python sem regexes. Acontece que esta não é a melhor opção ...

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

Uma função anônima que recebe entrada via argumento da palavra se o código do número do gênero ccomo um número inteiro, usando o seguinte mapeamento:

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

e retorna a palavra com o artigo correto.

Como funciona

Uma lista contendo as possibilidades de cada uma ccomo listas separadas é criada. A lista é então indexada usando o valor de c, produzindo uma lista de 3 elementos com as opções relevantes. Um índice de lista agora é escolhido indexando em outra lista aninhada com os resultados de expressões booleanas. Se o primeiro caractere de sfor uma vogal e não for iseguido por uma vogal, a opção for vowelserá obtida através do retorno do índice 0. Senão, é avaliada uma expressão booleana retornando Truepara cons. Be Falsepara cons. A, produzindo os índices 2e 1respectivamente. Por fim, o índice é usado para produzir o artigo, que é concatenado com um espaço e a sequência original antes de ser retornado.

Experimente no Ideone

TheBikingViking
fonte
1

JavaScript 210 bytes

(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}

Uma função anônima que aceita dois parâmetros se ep onde

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

Depois de atribuir a função a uma variável e a descompactar), ela pode ser testada como

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))

Onde

  • cé uma função para testar suma consoante na posição i.
  • r é avaliado em 0 para iniciar com uma vogal, 1 para iniciar com uma consoante do tipo A e 2 para iniciar com uma consoante do tipo B (testado na ordem inversa).
  • Um pouco de contenção na declaração de retorno o reúne.
traktor53
fonte