Розрізняйте іменники чоловічого і жіночого роду у французькій мові в межах 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
Я б дописав віянку до списку лише для того, щоб зробити важкі речі.
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;) ... один з рідкісних випадків, коли я можу тебе перемогти ... Мені б дуже цікаво пояснити твоє все-таки :)
Мартін Ендер

11
Зачекайте, я розгублений. Якщо магія існує, чому ви витрачаєте її на нерозумному виклику програмування, а не вирішуєте світовий мир чи щось таке? (Ні, але серйозно, ох . +1)
Дверна ручка

22

Ruby, 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}

Тестуйте його на кодування Ground.

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

Редагувати: Sp3000 встановив гольфіст, який він написав для мого останнього виклику на регулярному гене , і знайшов 36 35 34 байт-регекс для мене. Дякую за це!


2
Переживати кошмари мета-регексу гольфу тут, тому що tableце підрядок portable, і переключити якийсь набір, щоб не відповідати, не дуже корисно, тому що другий набір здається простішим для
узгодження

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.