Rozróżnij rzeczowniki rodzaju męskiego od rodzaju żeńskiego w języku francuskim w obrębie 100 znaków


21

Masz napisać bardzo mały program o długości do 100 znaków. Twój program musi rozróżniać rzeczowniki francuskie od rodzaju męskiego i żeńskiego. Wynik powinien być taki, unjeśli jest męski i unekobiecy. Często istnieją pewne reguły statystyczne, których można przestrzegać (np. Jeśli kończy się na „e”, jest bardziej prawdopodobne żeńskie niż męskie).

Wejście :

Francuskie słowo; może zawierać dowolne małe litery i myślniki, w tym małe litery z akcentami.

Przykładowe dane wejściowe: ami

Wyjście :

unjeśli słowo jest męskie i unejeśli słowo jest żeńskie.

Przykładowe dane wyjściowe: un

Nie musisz poprawnie dopasowywać każdego słowa; Twoim celem jest jak najdokładniejsze.

Punktacja : Twoja odpowiedź nie może przekraczać 100 znaków. Oświadczenia takie jak printlub console.logczy alertnie nie liczyć jako część całkowitych bajtów. Możesz także napisać funkcję lub metodę, która wykonuje to zadanie, w którym to przypadku kilka pierwszych bajtów (np. f=x=>), Które są częścią deklaracji funkcji, nie liczą się do sumy całkowitej. Twój łączny wynik to liczba nieprawidłowych odpowiedzi. Więzy są zerwane według rozmiaru kodu.

Rzeczowniki do testowania z:

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
Ja bym dodał un squelette do listy tylko do rzeczy trudne.
200_sukces

Odpowiedzi:


23

CJam, 0 niepoprawne, 32 29 bajtów

W kodzie tym użyto kilku nieparzystych znaków (niektórych z nich nie można wydrukować), ale wszystkie znajdują się w rozszerzonym zakresie ASCII. Więc znowu liczę każdy znak jako pojedynczy bajt.

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

Ze względu na niedrukowalne znaki jestem pewien, że Stack Exchange połyka niektóre, więc możesz chcieć skopiować kod z licznika znaków (pokazuje bajty z kodowaniem UTF-8, co jest nieoptymalne dla tego wyzwania; również link nie „ wydaje się, że działa w przeglądarce Firefox, ale działa w przeglądarce Chrome).

Sprawdź to tutaj.

Po dłuższej dyskusji na czacie doszliśmy do wniosku, że regex golf nie przyniesie nam wiele więcej. Więc po mojej wcześniejszej (żartującej) sugestii zaczęliśmy manipulować kodami znaków słów za pomocą pewnych funkcji, tak aby wszystkie słowa z jednej grupy dawały liczbę z pewną właściwością, która jest łatwa do sprawdzenia. I mieliśmy więcej szczęścia, niż się spodziewaliśmy! Oto, co kod robi ze słowami:

  • Niejawnie przekonwertuj znaki w słowie na ich punkty kodowe.
  • Interpretuj je jako cyfry w bazie 2 (tak, cyfry będą znacznie większe niż 0 lub 1, ale CJam sobie z tym poradzi).
  • Wielokrotnie brać wynik modulo ... następującymi numerami: [133, 122, 80, 66, 58, 26, 20, 14, 9, 4]. Ta sekwencja liczb jest sama w sobie zakodowana jako punkty kodowe łańcucha (w tym miejscu pojawiają się dziwne i niedrukowalne znaki).
  • Jak za pomocą magii, wszystkie 25 rzeczowników rodzaju męskiego ustępuje 0lub 1, i wszystkie 25 rzeczowników rodzaju żeńskiego ustępuje 2lub za 3pomocą tej procedury. Więc jeśli podzielimy to przez 2(dzielenie całkowite), otrzymamy zera dla rzeczowników rodzaju męskiego i dla rodzaju rodzaju żeńskiego.

Aby zakończyć, pchamy "un"na stosie, a my pchamy jeden e. Następnie odczytujemy słowo wejściowe ze STDIN i wykonujemy powyższe obliczenia, a na końcu mnożymy ewynik.

Nigdy wcześniej nie składałem modulo na żadnej liście i wydaje mi się, że już nigdy więcej ...

Wielkie dzięki za xnor i Sp3000 za rozpowszechnianie pomysłów i pomoc w poszukiwaniu łańcucha dzielników.


Nie tylko krótszy, ale 2 minuty szybszy. Horror!
Dennis,

@sudo;) ... jeden z rzadkich przypadków, w którym mogę cię pokonać ... Byłbym bardzo zainteresowany twoim wyjaśnieniem :)
Martin Ender

11
Czekaj, jestem zdezorientowany. Jeśli magia istnieje, dlaczego marnujesz ją na głupią stronę z wyzwaniami programistycznymi i nie rozwiązujesz pokoju na świecie czy coś takiego? (Nie, ale serio, woah . +1)
Klamka

22

Rubinowy, 0 niepoprawny, 63 56 53 52 51 50 bajtów

Wszystkie znaki są w rozszerzonym ASCII , a konkretnie ISO 8859-1 , więc liczę każdy znak jako pojedynczy bajt.

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

Wygląda na to, że twój zestaw testowy był trochę za krótki. Wygenerowałem regex z golfistą meta regex Petera Norviga .

Możesz wywołać powyższą funkcję jak f["ami"]. Za pomocą tej uprzęży testowej można sprawdzić wszystkie przypadki testowe:

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}

Przetestuj na Coding Ground.

Edycja: Korzystając z drugiego skryptu Petera Norviga, znalazłem inny regex, który faktycznie był o jeden bajt dłuższy, ale który mogłem skrócić ręcznie o dwa bajty.

Edit: SP3000 ustawić regex golfa pisał do mojej ostatniej prowokacji regex na nim, i znaleźli 36 35 34 bajtów regex dla mnie do użytku. Dziękuję za to!


2
Przeżywanie koszmarów meta regex golfa tutaj, ponieważ tablejest to podłańcuch portable, a przełączanie zestawu do dopasowania nie jest bardzo przydatne, ponieważ drugi zestaw wydaje się łatwiejszy do dopasowania ...
Sp3000

13

CJam, 0 błędów ( 36 32 29 28 bajtów)

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

Jest to nazwana funkcja, więc liczę tylko wewnętrzny kod. Ponadto ojest instrukcją drukowaną, więc nie wpływa na liczbę bajtów.

Wypróbuj przypadki testowe w interpretatorze CJam .

Jak to działa

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

Tylko funkcja skrótu i ​​wyszukiwanie w tabeli.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.