Programando acertijos, il code golf

21

Fondo

El artículo definido italiano (correspondiente al inglés the ) tiene siete formas diferentes: l ' , il , lo , gli , i , la , le . Cuál usar depende de tres variables:

  • Género: masculino / femenino.
  • Número: singular / plural.
  • Letra inicial de la palabra siguiente: vocal / consonante tipo A / consonante tipo B.
    • Vowel es cualquiera de estos: aeiou .
    • El tipo de consonante B es cualquiera de estos casos: s- seguido de otra consonante, z- , gn- , pn- , ps- , x- , i- seguido de vocal (esto i actúa como una semivowel).
    • La consonante de tipo A es una consonante que no es de tipo B.

La tabla muestra el formulario del artículo que se utilizará en cada una de las doce combinaciones de las tres variables anteriores. Tenga en cuenta que la forma l ' se adjunta a la siguiente palabra con una comilla simple y sin un espacio.

ingrese la descripción de la imagen aquí

El reto

Ingrese una palabra y una o dos cadenas, números o booleanos que indiquen género y número . (Las letras iniciales deberán obtenerse de la palabra de entrada).

La palabra de entrada será una secuencia de letras minúsculas ASCII. Las vocales acentuadas serán reemplazadas por sus versiones no acentuadas (por ejemplo, realtà se ingresará como realta ).

Las entradas de género y número pueden ser números separados, booleanos o cadenas, o un número combinado de cadena (por ejemplo, 1 para singular masculino, 2 para singular femenino, etc.).

Se puede utilizar cualquier formato y separador razonable, siempre que se especifique en la respuesta.

Escriba la palabra precedida por la forma apropiada del artículo , con espacio o comillas simples según sea necesario. La salida también debe estar en minúsculas. Se permite el espacio en blanco final o inicial.

Código de golf, victorias más cortas.

Casos de prueba

A continuación, uso las letras de entrada m, fpara especificar el género y s, ppara el número (este es solo un formato de entrada posible).

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
fuente
Es posible que también desee hacer un desafío en la conjugación de los verbos regulares.
user6245072
@ user6245072 Bueno, ya existe esto ... la diferencia probablemente sería demasiado pequeña
Luis Mendo
1
Un inconveniente técnico menor: / j / normalmente se llama semivowel en inglés, no semiconsonante . Me pregunto cuáles serían las soluciones si tuvieran en cuenta casos extremos como ⟨ch⟩ que representa [ʃ] en lugar de [k] ( lo chef , lo chardonnay ), la variación con los nombres franceses ( l'Havet pero lo Hugo ), formas fosilizadas ( gli dei , per lo meno ), mujeres a las que se hace referencia por su apellido ( l'Antonia pero la Antonini ), etc. Eso sería bastante formidable para el código de golf.
Janus Bahs Jacquet
1
Como italiano, le pido que ieriretire el caso de prueba porque es un adverbio y no un sustantivo. (Por cierto, era formalmente correcto) ¡Por favor!
Giacomo Garabello
1
Usualmente decimos: "Non pensare a ieri, Pensa a Domani"
Giacomo Garabello

Respuestas:

7

Retina, 138 133 129 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 

Banco de pruebas. (antes %(G`\nde ejecutar todos los casos de prueba a la vez)

Formato de entrada: se macchina f sconvierte en su 2macchinalugar.

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

Tabla de conversión gracias a Kevin Lau .

Monja permeable
fuente
4

Python 3.5, 238 235 192 181 178 bytes:

( -13 bytes gracias a los consejos de 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

Una función lambda anónima que toma argumentos en forma de (<String>, <Integer Gender-Plurality mapping>), donde la asignación es la siguiente:

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

Para llamarlo, simplemente asigne a la función un nombre válido y luego llámelo como una función normal dentro de una declaración de impresión. Por lo tanto, si la pregunta fuera nombrada U, simplemente llámela como print(U(<String>, <Integer Gender-Plurality mapping>)).

¡Pruébelo en línea! (Ideona)

R. Kap
fuente
zzz and yyy or xxxes dos bytes más corto que[xxx,yyy][bool(zzz)]
Leaky Nun
@LeakyNun, ¿puedo hacer eso? Wow, ni siquiera lo sabía. ¡Gracias! :)
R. Kap
Funciona mientras yyysea ​​verdad.
Leaky Nun
@LeakyNun Sí, por supuesto.
R. Kap
["l'",'gli '][b%2]es 3 bytes más corto que["l'",'gli ',"l'"][b]
Leaky Nun
4

Java, 227 208 195 bytes

-13 bytes gracias 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;}

Toma su cadena y un int basado en la siguiente asignación:

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

Devuelve una cadena con el resultado.

Sin golfista con casos de prueba y sin operadores ternarios (de verdad ahora):

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

Utiliza un poco de magia regex y actúa dependiendo de los dos booleanos especificados. Para mi sorpresa, no se necesitan importaciones, lo que ayuda con el tamaño del código.


fuente
1
El mío es ... ¿más largo que JAVA? ¡Debo jugar un poco más con el mío! Buen trabajo sin embargo! +1
R. Kap
Si tuviera que tomar mis argumentos de la línea de comando o stdin, créame, hubiera sido mucho más tiempo: P
Sí, los booleanos también aceptaron. Lo he editado en
Luis Mendo
Creo que puede usar en 0/1lugar de lo false/trueque debería ahorrarle algunos bytes.
Leaky Nun
No usar String e = "[^aeiou]).*";realmente te ahorra 5 bytes.
Leaky Nun
3

Rubí, 147146 bytes

Pruébalo en línea?

Puede ser posible utilizar un método mejor para determinar qué artículo usar, pero no conozco ninguno.

Según la especificación, el identificador es un número, como sigue:

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"' ",?'}
Tinta de valor
fuente
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%

La nueva versión usa la misma 0-3codificación para el género y el número que varias otras respuestas. Funciona creando una matriz unidimensional %2... %13de formas, luego desplazando los primeros 1+%1elementos para que las formas de interés se conviertan %1, %5y %9(lo cual es afortunado ya que Batch no irá arriba %9sin cambiar). Luego verifica laboriosamente las listas de prefijos para averiguar qué formulario debe usarse. _se usa como marcador de posición para representar un espacio hasta que se emite la palabra.

Neil
fuente
También podría codificarlos en un solo dígito (o letra si es necesario, ya que la especificación lo permite) para guardar bytes. ¡Todo es por el bien de los bytes!
Value Ink
@ KevinLau-notKenny ¡Cambiar a la codificación de dígitos me permitió ahorrar la friolera de 56 bytes al reescribir el género y el manejo de números!
Neil
1

Python 3, 235 bytes

Estaba interesado en ver qué tan corto podría obtener esto en Python sin expresiones regulares. Resulta que esta no es la mejor opción ...

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

Una función anónima que toma la entrada a través del argumento de la palabra sy el código de número de género ccomo un entero, utilizando la siguiente asignación:

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

y devuelve la palabra con el artículo correcto.

Cómo funciona

Se ccrea una lista que contiene las posibilidades para cada uno como listas separadas. Luego, la lista se indexa utilizando el valor de c, produciendo una lista de 3 elementos con las opciones relevantes. Ahora se elige un índice de lista indexando en otra lista anidada con los resultados de expresiones booleanas. Si el primer carácter de ses una vocal y no es iseguido por una vocal, la opción para se vowelproduce mediante la devolución del índice 0. De lo contrario, se evalúa una expresión booleana que devuelve Truepara cons. By Falsepara cons. A, produciendo los índices 2y 1respectivamente. Finalmente, el índice se usa para producir el artículo, que se concatena con un espacio y la cadena original antes de ser devuelto.

Pruébalo en Ideone

TheBikingViking
fuente
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}

Una función anónima que toma dos parámetros s y p donde

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

Después de asignar la función a una variable y un poco de desempaquetado), se puede probar 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))

dónde

  • ces una función para probar suna consonante en la posición i.
  • r evalúa a 0 para comenzar con una vocal, 1 para comenzar con una consonante de tipo A y 2 para comenzar con una consonante de tipo B (probado en orden inverso).
  • El golpeteo de bits en la declaración de retorno lo une.
traktor53
fuente