Различают мужские и женские существительные на французском языке в пределах 100 символов


21

Вы должны написать очень маленькую программу в пределах 100 символов. Ваша программа должна различать мужские и женские французские существительные. Вывод должен быть, unесли он мужской и uneженский. Зачастую существуют определенные статистические правила, которым вы можете следовать (например, если оно оканчивается на «е», оно скорее женское, чем мужское).

Вход :

Французское слово; он может состоять из любых строчных букв и тире, в том числе строчных букв с акцентами.

Пример ввода: ami

Выход :

unесли слово мужское и uneесли слово женское.

Пример вывода: un

Вам не нужно правильно понимать каждое слово; Ваша цель - быть максимально точным.

Оценка : Ваш ответ должен быть в пределах 100 символов. Такие заявления, как printи console.logили alertже не считаются частью ваших общих байт. Вы также можете написать функцию или метод, который выполняет эту задачу, и в этом случае первые несколько байтов (например f=x=>), которые являются частью объявления функции, не учитываются в вашем общем объеме. Ваш общий балл - это количество неправильных ответов. Галстуки разбиты по размеру кода.

Существительные для тестирования с:

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
Я бы добавил un squelette в список, чтобы все было сложно.
200

Ответы:


23

CJam, 0 неверно, 32 29 байт

Этот код использует несколько нечетных символов (некоторые из них непечатаемые), но все они находятся в расширенном диапазоне ASCII. Опять же, я считаю каждый символ одним байтом.

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

Из-за непечатаемых символов, я уверен, что Stack Exchange проглатывает некоторые из них, так что вы можете скопировать код из счетчика символов (он показывает байты с кодировкой UTF-8, что неоптимально для этой задачи; также ссылка не ' Кажется, что работает в Firefox, но работает в Chrome).

Проверьте это здесь.

После некоторого обсуждения в чате, мы решили, что регулярное гольф не принесет нам гораздо большего. Поэтому, следуя моему более раннему (шутливому) предложению, мы начали изучать манипулирование кодами слов для определенных функций, чтобы все слова из одной группы давали число с некоторым свойством, которое легко проверить. И нам повезло больше, чем мы ожидали! Вот что код делает со словами:

  • Неявно преобразуйте символы в слове в их кодовые точки.
  • Интерпретируйте их как цифры в базе 2 (да, цифры будут намного больше 0 или 1, но CJam может справиться с этим).
  • Многократно взять результат по модулю ... следующие цифры: [133, 122, 80, 66, 58, 26, 20, 14, 9, 4]. Эта последовательность чисел сама закодирована как кодовые точки строки (вот где появляются странные и непечатные символы).
  • Как по волшебству, все 25 существительных мужского рода дают 0или 1, и все 25 женских существительных дают 2или 3с этой процедурой. Поэтому, если мы разделим это на 2(целочисленное деление), мы получим нули для существительных мужского рода и нули для существительных женского рода.

Чтобы округлить его, мы нажимаем "un"на стек, мы толкаем один e. Затем мы читаем входное слово из STDIN и выполняем вышеприведенные вычисления и, наконец, умножаем eрезультат на результат.

Я никогда не складывал по модулю ни в один список раньше, и я чувствую, что никогда не буду снова ...

Большое спасибо за xnor и Sp3000 за то, что они бросили идеи и помогли с поиском цепочки делителей.


Не только короче, но и на 2 минуты быстрее. Ужас!
Деннис

@sudo;) ... один из редких случаев, когда я могу тебя победить ... хотя мне было бы очень интересно узнать твои объяснения :)
Martin Ender

11
Подожди, я в замешательстве. Если магия существует, почему вы тратите ее на глупый сайт, посвященный программированию, а не решаете мир во всем мире или что-то в этом роде? (Нет, но серьезно, вау . +1)
Ручка двери

22

Рубин, 0 неверно, 63 56 53 52 51 50 байт

Все символы в расширенном ASCII , в частности, ISO 8859-1 , поэтому я считаю каждый символ одним байтом.

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

Похоже, ваш тестовый набор был слишком коротким. Я сгенерировал регулярное выражение с помощью мета-регулярного гольфиста Питера Норвига .

Вы можете вызвать вышеуказанную функцию, как f["ami"]. Вы можете использовать этот тестовый комплект для проверки всех тестовых случаев:

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}

Проверьте это на полигоне.

Редактировать: Используя второй сценарий Питера Норвига, я нашел другое регулярное выражение, которое на самом деле было на один байт длиннее, но которое я мог сократить на два байта вручную.

Редактировать: Sp3000 установил гольфиста регулярных выражений, который он написал для моего недавнего вызова регулярных выражений, и нашел регулярное выражение 36 35 34 байтов для меня, чтобы использовать. Спасибо за это!


2
Пережить ночные кошмары игры в мета-регулярных играх здесь, потому что tableона является подстрокой portable, и переключение, для которого установлено соответствие, не очень полезно, потому что второй набор кажется легче сопоставить ...
Sp3000

13

CJam, 0 ошибок ( 36 32 29 28 байт)

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

Это именованная функция, поэтому я считаю только внутренний код. Кроме того, oэто оператор печати, поэтому он не влияет на количество байтов.

Попробуйте тестовые случаи в интерпретаторе CJam .

Как это устроено

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

Просто хэш-функция и поиск по таблице.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.