Je programme des puzzles, il code golf

21

Contexte

L'article défini italien (correspondant à l'anglais le ) a sept formes différentes: l ' , il , lo , gli , i , la , le . Laquelle utiliser dépend de trois variables:

  • Sexe: masculin / féminin.
  • Nombre: singulier / pluriel.
  • Lettre initiale du mot suivant: voyelle / type consonne A / type consonne B.
    • La voyelle est l'une de celles-ci: aeiou .
    • La consonne de type B est l'un de ces cas: s- suivi d'une autre consonne, z- , gn- , pn- , ps- , x- , i- suivie d'une voyelle (cette i agit comme une demi-voyelle).
    • La consonne de type A est une consonne qui n'est pas de type B.

Le tableau montre le formulaire d'article à utiliser dans chacune des douze combinaisons des trois variables ci-dessus. Notez que le l » formulaire est joint au mot suivant avec une citation simple et sans espace.

entrez la description de l'image ici

Le défi

Saisissez un mot et une ou deux chaînes, des nombres ou des booléens indiquant le sexe et le nombre . (Les premières lettres devront être obtenues à partir du mot saisi).

Le mot d'entrée sera une séquence de lettres ASCII minuscules. Les voyelles accentuées seront remplacées par leurs versions non accentuées (par exemple, realtà sera entré comme realta ).

Les entrées de genre et de nombre peuvent être des nombres séparés, des booléens ou des chaînes, ou un nombre combiné de chaînes (par exemple, 1 pour le singulier masculin, 2 pour le singulier féminin, etc.).

Tout format et séparateur raisonnable peuvent être utilisés, pour autant qu'ils soient spécifiés dans la réponse.

Sortez le mot précédé de la forme appropriée de l'article , avec un espace ou une citation unique au besoin. La sortie doit également être en minuscules. Les espaces vides de fin ou de début sont autorisés.

Golf de code, victoires les plus courtes.

Cas de test

Dans ce qui suit, j'utilise les lettres d'entrée m, fpour spécifier le sexe et s, ppour le nombre (ce n'est qu'un format d'entrée possible).

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
la source
Vous voudrez peut-être aussi faire un défi sur la coniugation des verbes réguliers.
user6245072
@ user6245072 Eh bien, il y a déjà ceci ... la différence serait probablement trop petite
Luis Mendo
1
Un petit problème technique: / j / est normalement appelé une demi - voyelle en anglais, pas un semi - conducteur . Je me demande quelles seraient les solutions si elles prenaient en compte des cas marginaux comme ⟨ch⟩ représentant [ʃ] plutôt que [k] ( lo chef , lo chardonnay ), la variation avec des noms français ( l'Havet mais lo Hugo ), formes fossilisées ( gli dei , per lo meno ), femmes désignées par leur nom de famille ( l'Antonia mais la Antonini ), etc. Ce serait tout à fait formidable pour le golf-code.
Janus Bahs Jacquet
1
En tant qu'italien, je vous demande de retirer le iericas de test car c'est un adverbe et non un substantif! (BTW c'était formellement correct) S'il vous plaît!
Giacomo Garabello
1
Nous disons généralement: "Non pensare a ieri, Pensa a Domani"
Giacomo Garabello

Réponses:

7

Rétine, 138 133 129 113 octets

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

Suite de tests. (ajouté %(G`\npour exécuter tous les cas de test en même temps)

Format d'entrée: macchina f sdevient à la 2macchinaplace.

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

Table de conversion grâce à Kevin Lau .

Leaky Nun
la source
4

Python 3.5, 238 235 192 181 178 octets:

( -13 octets grâce aux conseils 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

Une fonction lambda anonyme qui prend des arguments sous la forme de (<String>, <Integer Gender-Plurality mapping>), où le mappage est le suivant:

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

Pour l'appeler, donnez simplement à la fonction un nom valide, puis appelez-la comme une fonction normale enveloppée dans une instruction print. Par conséquent, si la question devait être nommée U, appelez-la simplement comme print(U(<String>, <Integer Gender-Plurality mapping>)).

Essayez-le en ligne! (Ideone)

R. Kap
la source
zzz and yyy or xxxest deux octets plus court que[xxx,yyy][bool(zzz)]
Leaky Nun
@LeakyNun je peux faire ça? Wow, je ne savais même pas. Merci! :)
R. Kap
Cela fonctionne aussi longtemps que yyyc'est vrai.
Leaky Nun
@LeakyNun Oui, bien sûr.
R. Kap
["l'",'gli '][b%2]est 3 octets plus court que["l'",'gli ',"l'"][b]
Leaky Nun
4

Java, 227 208 195 octets

-13 octets grâce à 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;}

Prend votre chaîne et un int basé sur le mappage suivant:

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

Renvoie une chaîne avec le résultat.

Non golfé avec des cas de test et sans opérateurs ternaires (pour de vrai maintenant):

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

Utilise un peu de magie regex et agit en fonction des deux booléens spécifiés. À ma grande surprise, aucune importation n'est nécessaire, ce qui aide avec la taille du code!


la source
1
Le mien est ... plus long que JAVA?! Je dois jouer le mien un peu plus vite! Bon travail! +1
R. Kap
Si je devais prendre mes arguments depuis la ligne de commande ou stdin, croyez-moi, cela aurait été beaucoup plus long: P
Oui, les booléens ont accepté aussi. J'ai édité ça dans
Luis Mendo
Je pense que vous pouvez utiliser 0/1au lieu de false/truecela devrait vous faire économiser quelques octets.
Leaky Nun
Ne pas utiliser vous String e = "[^aeiou]).*";fait économiser 5 octets.
Leaky Nun
3

Rubis, 147 146 octets

L'essayer en ligne?

Il pourrait être possible d'utiliser une meilleure méthode pour déterminer quel article utiliser, mais je n'en connais aucun.

Selon la spécification, l'identifiant est un nombre, comme suit:

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"' ",?'}
Encre de valeur
la source
2

Lot, 446 390 385 380 octets

@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 nouvelle version utilise le même 0-3encodage pour le sexe et le nombre que plusieurs autres réponses. Fonctionne en créant un tableau unidimensionnel %2.. %13de formes, puis en déplaçant les premiers 1+%1éléments pour que les formes d'intérêt deviennent %1, %5et %9(ce qui est heureux car Batch ne va pas au-dessus %9sans se déplacer). Il vérifie ensuite laborieusement les listes de préfixes pour savoir quel formulaire doit être utilisé. _est utilisé comme espace réservé pour représenter un espace jusqu'à la sortie du mot.

Neil
la source
Autant les faire coder en un seul chiffre (ou lettre si nécessaire, car la spécification le permet) pour économiser des octets. Tout est dans l'intérêt des octets!
Value Ink
@ KevinLau-notKenny Passer au codage numérique m'a permis d'économiser 56 octets en réécrivant le genre et la gestion des nombres!
Neil
1

Python 3, 235 octets

J'étais intéressé de voir combien de temps je pouvais obtenir cela en Python sans regex. Il s'avère que ce n'est pas la meilleure option ...

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

Une fonction anonyme qui prend l'entrée via l'argument du mot set le code de genre ccomme un entier, en utilisant le mappage suivant:

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

et renvoie le mot avec l'article correct.

Comment ça marche

Une liste contenant les possibilités pour chacun en ctant que listes distinctes est créée. La liste est ensuite indexée en utilisant la valeur de c, ce qui donne une liste à 3 éléments avec les options pertinentes. Un index de liste est maintenant choisi en indexant dans une autre liste imbriquée avec les résultats des expressions booléennes. Si le premier caractère de sest une voyelle et n'est pas isuivi d'une voyelle, l'option pour vowelest fournie via le retour de l'index 0. Sinon, une expression booléenne renvoyant Truepour cons. Bet Falsepour cons. Aest évaluée, donnant les indices 2et 1respectivement. Enfin, l'index est utilisé pour générer l'article, qui est concaténé avec un espace et la chaîne d'origine avant d'être renvoyé.

Essayez-le sur Ideone

TheBikingViking
la source
1

JavaScript 210 octets

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

Une fonction anonyme prenant deux paramètres s et p où

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

Après avoir assigné la fonction à une variable et un déballage), elle peut être testée comme

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

  • cest une fonction pour tester sune consonne à la position i.
  • r est évalué à 0 pour commencer avec une voyelle, 1 pour commencer avec une consonne de type A et 2 pour commencer avec une consonne de type B (testé dans l'ordre inverse).
  • Le dénigrement de bits dans l'instruction return le rassemble.
traktor53
la source