Unterscheiden Sie innerhalb von 100 Zeichen zwischen männlichen und weiblichen Substantiven in Französisch


21

Sie müssen ein sehr kleines Programm mit 100 Zeichen schreiben. Ihr Programm muss zwischen männlichen und weiblichen französischen Substantiven unterscheiden. Die Ausgabe sollte sein, unwenn es männlich ist und unewenn es weiblich ist. Oft gibt es bestimmte statistische Regeln, denen Sie folgen können (zB wenn es mit einem "e" endet, ist es eher weiblich als männlich).

Eingabe :

Ein französisches Wort; Es kann aus Kleinbuchstaben und Bindestrichen bestehen, einschließlich Kleinbuchstaben mit Akzenten.

Beispiel Eingabe: ami

Ausgabe :

unwenn das Wort männlich ist und unewenn das Wort weiblich ist.

Beispielausgabe: un

Sie müssen nicht jedes Wort richtig verstehen. Ihr Ziel ist es, so genau wie möglich zu sein.

Wertung : Ihre Antwort muss aus maximal 100 Zeichen bestehen. Anweisungen wie printoder console.logoder alertzählen nicht zu Ihren Gesamtbytes. Sie können auch eine Funktion oder Methode schreiben, die diese Aufgabe ausführt. In diesem Fall zählen die ersten paar Bytes (z. B. f=x=>), die Teil der Funktionsdeklaration sind, nicht zu Ihrer Gesamtsumme. Ihre Gesamtpunktzahl ist die Anzahl der falschen Antworten. Krawatten werden nach Codegröße getrennt.

Nomen zum Testen mit:

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
Ich hätte un squelette zur Liste hinzugefügt , nur um die Sache zu erschweren.
200_erfolg

Antworten:


23

CJam, 0 falsch, 32 29 Bytes

Dieser Code verwendet einige ungerade Zeichen (von denen einige nicht druckbar sind), die sich jedoch alle im erweiterten ASCII-Bereich befinden. Also zähle ich jedes Zeichen als ein einzelnes Byte.

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

Aufgrund der nicht druckbaren Zeichen kann es vorkommen, dass Stack Exchange einige verschluckt. Daher möchten Sie möglicherweise den Code aus dem Zeichenzähler kopieren (er zeigt Bytes mit UTF-8-Codierung an, was für diese Herausforderung nicht optimal ist. Außerdem funktioniert der Link nicht.) scheint nicht in Firefox zu funktionieren, funktioniert aber in Chrome).

Teste es hier.

Nach einigen weiteren Diskussionen im Chat stellten wir fest, dass das Regex-Golfen uns nicht viel weiter bringen würde. Nach einem früheren (scherzhaften) Vorschlag von mir haben wir begonnen, die Zeichencodes der Wörter mit bestimmten Funktionen so zu manipulieren, dass alle Wörter aus einer Gruppe eine Zahl mit einer leicht zu überprüfenden Eigenschaft ergeben. Und wir hatten mehr Glück als wir erwartet hatten! Hier ist, was der Code mit den Wörtern macht:

  • Wandeln Sie die Zeichen im Wort implizit in ihre Codepunkte um.
  • Interpretieren Sie diese als Ziffern in Basis 2 (ja, die Ziffern sind viel größer als 0 oder 1, aber CJam kann damit umgehen).
  • Immer wieder nimmt das Ergebnis Modulo ... die folgenden Zahlen: [133, 122, 80, 66, 58, 26, 20, 14, 9, 4]. Diese Folge von Zahlen wird selbst als Codepunkte einer Zeichenfolge codiert (hier kommen die seltsamen und nicht druckbaren Zeichen ins Spiel).
  • Wie von Zauberhand ergeben alle 25 männlichen Substantive 0oder 1, und alle 25 weiblichen Substantive ergeben 2oder 3mit diesem Verfahren. Wenn wir dies durch 2(ganzzahlige Division) teilen, erhalten wir Nullen für männliche Substantive und Einsen für weibliche Substantive.

Um "un"das Ganze abzurunden, schieben wir auf den Stapel, dann schieben wir eine einzelne e. Dann lesen wir das Eingabewort aus STDIN, führen die obige Berechnung durch und multiplizieren sie schließlich emit dem Ergebnis.

Ich habe Modulo noch nie auf eine Liste gesetzt und ich habe das Gefühl, dass ich es nie wieder tun werde ...

Vielen Dank für xnor und Sp3000, die uns bei der Suche nach einer Teilerkette unterstützt haben.


Nicht nur kürzer, sondern 2 Minuten schneller. Der Horror!
Dennis

@sudo;) ... eines der seltenen Male, in denen ich dich besiegen kann ... Ich wäre sehr an einer Erklärung von dir interessiert :)
Martin Ender

11
Warten Sie, ich bin verwirrt. Wenn Magie existiert, warum verschwendest du sie auf einer albernen Programmier-Herausforderungsseite und löst nicht den Weltfrieden oder so? (Nein, aber im Ernst, woah . +1)
Türknauf

22

Ruby, 0 falsch, 63 56 53 52 51 50 Bytes

Alle Zeichen sind in erweitertem ASCII-Format , insbesondere ISO 8859-1 . Daher zähle ich jedes Zeichen als ein einzelnes Byte.

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

Es sieht so aus, als wäre Ihr Test-Set etwas zu kurz. Ich habe den Regex mit Peter Norvigs Meta-Regex-Golfer generiert .

Sie können die obige Funktion wie folgt aufrufen f["ami"]. Mit diesem Testgeschirr können Sie alle Testfälle prüfen:

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}

Testen Sie es auf Coding Ground.

Edit: Mit Peter Norvigs zweitem Skript fand ich einen anderen regulären Ausdruck, der eigentlich ein Byte länger war, den ich aber per Hand um zwei Bytes kürzen konnte .

Edit: Sp3000 hat den Regex-Golfer, den er für meine kürzlich durchgeführte Regex-Herausforderung geschrieben hat, darauf eingestellt und einen Regex mit 36 bis 35 Byte gefunden, den ich verwenden kann. Dank dafür!


2
Die Alpträume des Meta-Regex-Golfs hier noch einmal zu erleben, tableist eine Teilzeichenfolge von portableund das Umschalten des passenden Sets ist nicht sehr nützlich, da das zweite Set einfacher zu passen scheint ...
Sp3000

13

CJam, 0 Fehler ( 36 32 29 28 Bytes)

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

Dies ist eine benannte Funktion, daher zähle ich nur den inneren Code. Außerdem oist es eine print-Anweisung, sodass sie nicht zur Byteanzahl beiträgt.

Probieren Sie die Testfälle im CJam-Interpreter aus .

Wie es funktioniert

"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.                                  ";

Nur eine Hash-Funktion und eine Tabellensuche.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.