Distingue tra nomi maschili e femminili in francese entro 100 caratteri


21

Devi scrivere un programma molto piccolo di 100 caratteri. Il tuo programma deve distinguere tra sostantivi francesi maschili e femminili. L'output dovrebbe essere unse è maschile e unese è femminile. Spesso ci sono alcune regole statistiche che puoi seguire (es. Se termina con una "e" è più probabile che femminile che maschile).

Input :

Una parola francese; può consistere in lettere minuscole e trattini, comprese lettere minuscole con accenti.

Esempio di input: ami

Uscita :

unse la parola è maschile e unese la parola è femminile.

Esempio di output: un

Non devi avere tutte le parole giuste; il tuo obiettivo è quello di essere il più preciso possibile.

Punteggio : la tua risposta deve contenere un massimo di 100 caratteri. Affermazioni come printo console.logo alertnon non contano come parte del tuo byte totali. È inoltre possibile scrivere una funzione o un metodo che esegue questa attività, nel qual caso i primi byte (ad es. f=x=>) Che fanno parte della dichiarazione della funzione non contano per il totale. Il tuo punteggio totale è il numero di risposte errate. I legami sono interrotti dalla dimensione del codice.

Nomi da testare con:

un ami
un café
un chapeau
un concert
un crayon
un garage
un garçon
un lit
un livre
un mari
un musée
un oncle
un ordinateur
un pantalon
un piano
un pique-nique
un portable
un père
un sandwich
un saxophone
un stade
un stylo
un théâtre
un téléphone
un voisin
une botte
une boum
une chaise
une chaussette
une chemise
une clarinette
une copine
une femme
une fille
une glace
une heure
une lampe
une maison
une montagne
une personne
une piscine
une pizza
une radio
une raquette
une salade
une souris
une sœur
une table
une télé
une voiture

6
Avrei aggiunto un squelette all'elenco solo per rendere le cose difficili.
200_successo

Risposte:


23

CJam, 0 errato, 32 29 byte

Questo codice utilizza alcuni caratteri dispari (alcuni dei quali non stampabili), ma rientrano tutti nell'intervallo ASCII esteso. Quindi, sto contando ogni carattere come un singolo byte.

"un"'el2b"zPB:  ":i+:%2/*

A causa dei caratteri non stampabili, sono sicuro che Stack Exchange ne ingoia alcuni, quindi potresti voler copiare il codice dal contatore dei caratteri (mostra i byte con codifica UTF-8, che non è ottimale per questa sfida; inoltre, il collegamento non sembra funzionare in Firefox, ma funziona in Chrome).

Provalo qui.

Dopo qualche altra discussione in chat, abbiamo pensato che il golf regex non ci avrebbe portato molto oltre. Quindi, seguendo un mio precedente suggerimento (scherzoso), abbiamo iniziato a cercare di manipolare i codici dei caratteri delle parole con determinate funzioni, in modo tale che tutte le parole di un gruppo producessero un numero con alcune proprietà che è facile da controllare. E siamo diventati più fortunati di quanto ci aspettassimo! Ecco cosa fa il codice alle parole:

  • Converti implicitamente i caratteri nella parola nei loro punti di codice.
  • Interpreta quelli come cifre nella base 2 (sì, le cifre saranno molto più grandi di 0 o 1, ma CJam può gestirlo).
  • Ripetutamente prendere il modulo risultato ... i seguenti numeri: [133, 122, 80, 66, 58, 26, 20, 14, 9, 4]. Questa sequenza di numeri è codificata come punti di codice di una stringa (qui entrano in gioco i caratteri strani e non stampabili).
  • Come per magia, tutti e 25 i sostantivi maschili cedono 0o 1, e tutti e 25 i sostantivi femminili cedono 2o 3con questa procedura. Quindi se dividiamo questo per 2(divisione intera) otteniamo zero per i sostantivi maschili e quelli per i sostantivi femminili.

Per concludere, spingiamo "un"sullo stack, spingiamo un singolo e. Quindi leggiamo la parola di input da STDIN ed eseguiamo il calcolo sopra, e infine moltiplichiamo eper il risultato.

Non ho mai piegato il modulo in nessun elenco prima e mi sento come se non lo farò mai più ...

Mille grazie per xnor e Sp3000 per aver lanciato idee e aiutato nella ricerca della catena divisoria.


Non solo più corto, ma 2 minuti più veloce. L'orrore!
Dennis,

@sudo;) ... una delle rare volte in cui riesco a batterti ... Sarei molto interessato a una tua spiegazione :)
Martin Ender,

11
Aspetta, sono confuso. Se la magia esiste, perché la stai sprecando in un sito di sfida di programmazione sciocca e non risolvi la pace nel mondo o qualcosa del genere? (No, ma seriamente, woah . +1)
Maniglia della porta

22

Rubino, 0 errato, 63 56 53 52 51 50 byte

Tutti i caratteri sono in ASCII esteso , in particolare ISO 8859-1 , quindi sto contando ogni carattere come un singolo byte.

f=->s{s[/la|tt|i.e|[égdzœu]..$|^b|^f|so|^ta/]?'une':'un'}

Sembra che il tuo set di test sia stato un po 'troppo corto. Ho generato la regex con il golfista meta regex di Peter Norvig .

È possibile chiamare la funzione sopra come f["ami"]. È possibile utilizzare questo cablaggio di prova per verificare tutti i casi di test:

puts "ami café chapeau concert crayon garage garçon lit livre mari musée 
      oncle ordinateur pantalon piano pique-nique portable père sandwich 
      saxophone stade stylo théâtre téléphone voisin botte boum chaise 
      chaussette chemise clarinette copine femme fille glace heure lampe 
      maison montagne personne piscine pizza radio raquette salade souris 
      sœur table télé voiture".split.map{|s|f[s]+" "+s}

Provalo su Coding Ground.

Modifica: Usando il secondo script di Peter Norvig ho trovato una regex diversa, che in realtà era un byte più lunga, ma che potevo accorciare di due byte a mano.

Modifica: Sp3000 ha impostato il golfista regex che ha scritto per la mia recente sfida regex su di esso e ha trovato un regex 36 35 34 byte per me da usare. Grazie per quello!


2
Rivivere gli incubi del meta regex golf qui perché tableè una sottostringa di portable, e cambiare quale set per abbinare non è molto utile perché il secondo set sembra più facile da abbinare ...
Sp3000

13

CJam, 0 errori ( 36 32 29 28 byte)

{"un"oEb72^"+ÕåWïº"583b2b='e*o}:F;

Questa è una funzione denominata, quindi conto solo il codice interno. Inoltre, oè un'istruzione di stampa, quindi non contribuisce al conteggio dei byte.

Prova i casi di test nell'interprete CJam .

Come funziona

"un"o       " Print 'un'.                                                  ";
Eb          " Consider the input a base 14 number.                        ";
72^         " XOR the result with 72.                                     ";
"+ÕåWïº"    " Push that string.                                           ";
583b2b      " Convert from base 583 to base 2.                            ";
=           " Retrieve the corresponding element (0 or 1) from the array. ";
'e*o        " Print 'e' that many times.                                  ";

Solo una funzione hash e una ricerca tabella.

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.