I puzzle di programmazione, il codice golf


21

sfondo

L'articolo determinativo italiano (corrispondente all'inglese del ) ha sette forme diverse: l' , il , lo , Gli , i , la , Le . Quale usare dipende da tre variabili:

  • Genere: maschile / femminile.
  • Numero: singolare / plurale.
  • Lettera iniziale della parola successiva: vocale / consonante tipo A / consonante tipo B.
    • La vocale è una di queste: aeiou .
    • La consonante di tipo B è uno di questi casi: s- seguito da un'altra consonante, z- , gn- , pn- , ps- , x- , i- seguita da vocale (questo i funge da semivowel).
    • La consonante di tipo A è una consonante che non è di tipo B.

La tabella mostra il modulo dell'articolo da utilizzare in ciascuna delle dodici combinazioni delle tre variabili precedenti. Notare che il l' modulo è fissato alla parola seguente con un'unica preventivo e senza uno spazio.

inserisci qui la descrizione dell'immagine

La sfida

Inserisci una parola e una o due stringhe, numeri o valori booleani che indicano sesso e numero . (Le lettere iniziali dovranno essere ottenute dalla parola di input).

La parola di input sarà una sequenza di lettere ASCII minuscole. Le vocali accentate saranno sostituite dalle loro versioni non accentate (ad esempio, la realtà verrà inserita come realta ).

Gli input di genere e numero possono essere numeri separati, booleani o stringhe o un numero combinato di stringhe (ad esempio, 1 per singolare maschile, 2 per singolare femminile, ecc.).

È possibile utilizzare qualsiasi formato e separatore ragionevoli, purché sia ​​specificato nella risposta.

Stampa la parola preceduta dalla forma appropriata dell'articolo , con spazio o virgolette singole, se necessario. L'output dovrebbe anche essere in minuscolo. È consentito il trascinamento o lo spazio vuoto iniziale.

Codice golf, vittorie più brevi.

Casi test

Di seguito uso le lettere di input m, fper specificare il genere e s, pper il numero (questo è solo un possibile formato di input).

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

Potresti anche voler fare una sfida sulla coniugazione dei verbi regolari.
user6245072,

@ user6245072 Bene, c'è già questo ... la differenza sarebbe probabilmente troppo piccola
Luis Mendo

1
Un piccolo inconveniente tecnico: / j / è normalmente chiamato semivowel in inglese, non semiconsonente . Mi chiedo quali sarebbero le soluzioni se dovessero tener conto di casi limite come ⟨ch⟩ che rappresenta [ʃ] anziché [k] ( lo chef , lo chardonnay ), la variazione con i nomi francesi ( l'Havet ma lo Hugo ), forme fossilizzate ( gli dei , per lo meno ), donne a cui si fa riferimento con il loro cognome ( l'Antonia ma la Antonini ), ecc. Sarebbe piuttosto formidabile il codice golf.
Janus Bahs Jacquet,

1
Come italiano ti chiedo di toglierti il ieritest perché è un avverbio e non un sostantivo! (A proposito era formalmente corretto) Per favore!
Giacomo Garabello,

1
Di solito diciamo: "Non pensare a ieri, Pensa a Domani"
Giacomo Garabello,

Risposte:


7

Retina, 138 133 129 113 byte

^.(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 di test. (pronto %(G`\nper eseguire tutti i casi di test contemporaneamente)

Formato di input: macchina f sdiventa 2macchinainvece.

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

Tabella di conversione grazie a Kevin Lau .


4

Python 3.5, 238 235 192 181 178 byte:

( -13 byte grazie ai suggerimenti di 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 funzione lambda anonima che accetta argomenti sotto forma di (<String>, <Integer Gender-Plurality mapping>), in cui la mappatura è la seguente:

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

Per chiamarlo, è sufficiente assegnare alla funzione un nome valido, quindi chiamarla come una normale funzione racchiusa in un'istruzione print. Pertanto, se la domanda dovesse essere nominata U, chiamala semplicemente così print(U(<String>, <Integer Gender-Plurality mapping>)).

Provalo online! (Ideone)


zzz and yyy or xxxè due byte più breve di[xxx,yyy][bool(zzz)]
Leaky Nun,

@LeakyNun Posso farlo? Wow, non lo sapevo nemmeno. Grazie! :)
R. Kap

Funziona finché yyyè vero.
Leaky Nun,

@LeakyNun Sì, certo.
R. Kap,

["l'",'gli '][b%2]è di 3 byte più breve di["l'",'gli ',"l'"][b]
Leaky Nun il

4

Java, 227 208 195 byte

-13 byte grazie 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;}

Prende la stringa e un int in base al seguente mapping:

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

Restituisce una stringa con il risultato.

Non rigato con casi di test e senza operatori ternari (per davvero ora):

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 un po 'di magia regex e agisce in base ai due booleani specificati. Con mia sorpresa, non sono necessarie importazioni, il che aiuta con le dimensioni del codice!


1
Il mio è ... più lungo di JAVA ?! Devo giocare a golf un po 'più presto! Ottimo lavoro però! +1
R. Kap

Se dovessi prendere i miei argomenti dalla riga di comando o stdin, credimi, sarebbe stato molto più lungo: P

Sì, anche i booleani hanno accettato. L'ho modificato in
Luis Mendo il

Penso che puoi usare al 0/1posto del false/truequale dovrebbe farti risparmiare qualche byte.
Leaky Nun,

Non usare String e = "[^aeiou]).*";effettivamente ti fa risparmiare 5 byte.
Leaky Nun,

3

Rubino, 147 146 byte

Provalo online?

Potrebbe essere possibile utilizzare un metodo migliore per determinare quale articolo utilizzare, ma non ne sono a conoscenza.

Secondo la specifica, l'identificatore è un numero, come segue:

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

Lotto, 446 390 385 380 byte

@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 nuova versione utilizza la stessa 0-3codifica per genere e numero di molte altre risposte. Funziona creando una matrice 1-dimensionale %2.. %13di forme, quindi spostando i primi 1+%1elementi in modo che le forme di interesse diventano %1, %5e %9(che è fortunato Batch non andrà sopra %9senza spostamento). Quindi controlla faticosamente gli elenchi dei prefissi per scoprire quale modulo deve essere utilizzato. _viene utilizzato come segnaposto per rappresentare uno spazio fino all'output della parola.


Potrebbe anche averli codificati in una singola cifra (o lettera se necessario, poiché le specifiche lo consentono) per salvare byte. Tutto è per il bene dei byte!
Valore inchiostro

@ KevinLau-notKenny Passare alla codifica digitale mi ha permesso di salvare ben 56 byte riscrivendo il genere e la gestione dei numeri!
Neil,

1

Python 3, 235 byte

Mi interessava vedere quanto avrei potuto ottenere in Python senza regex. Si scopre che questa non è l'opzione migliore ...

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 funzione anonima che accetta input tramite argomento della parola se il codice numerico di genere ccome numero intero, utilizzando la seguente mappatura:

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

e restituisce la parola con l'articolo corretto.

Come funziona

Viene ccreato un elenco contenente le possibilità per ciascuno come elenchi separati. L'elenco viene quindi indicizzato utilizzando il valore di c, producendo un elenco di 3 elementi con le opzioni pertinenti. Un indice di elenco viene ora scelto indicizzando un altro elenco nidificato con i risultati delle espressioni booleane. Se il primo carattere di sè una vocale e non è iseguito da una vocale, l'opzione per vowelviene prodotta tramite la restituzione dell'indice 0. Altrimenti, viene valutata un'espressione booleana che ritorna Trueper cons. Be Falseper cons. A, producendo gli indici 2e 1rispettivamente. Infine, l'indice viene utilizzato per restituire l'articolo, che viene concatenato con uno spazio e la stringa originale prima di essere restituito.

Provalo su Ideone


1

JavaScript 210 byte

(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 funzione anonima che prende due parametri se pe

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

Dopo aver assegnato la funzione a una variabile e un po 'di decompressione), può essere testata come

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

dove

  • cè una funzione per testare suna consonante in posizione i.
  • r valuta 0 per iniziare con una vocale, 1 per iniziare con una consonante di tipo A e 2 per iniziare con una consonante di tipo B (testato in ordine inverso).
  • Il bit bashing nell'istruzione return lo mette insieme.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.