Якою мовою є це слово?


16

Вам слід написати програму або функцію, яка визначає мову певного слова.

Завдання - розпізнати деякі з 5000 найпоширеніших слів на 4 мовах:

  • Англійська
  • Німецька
  • Італійська
  • Угорська

Списки слів можна знайти в цьому сховищі GitHub.

Ви допускаєте помилки в 40% наданих тестових випадків . Тобто ви можете неправильно класифікувати 8000 з 20000 входів.

Деталі

  • Списки містять тільки слова з прописними буквами a-zтак , наприклад , won'tі möchteне включені.
  • Кілька слів з’являються на декількох мовах, тобто ваш код не завжди може правильно відгадати очікуваний вихід.
  • Для зручності ви можете завантажити всі тестові справи як один список . У кожному рядку число позначає мову слова. ( 1для англійської, 2для німецької, 3для італійської та 4для угорської.)
  • Стандартні лазівки заборонені.
  • Використовуючи списки слів, наші подібні дані, надані вашою мовою програмування, заборонені.

Вхідні дані

  • Рядок, що містить лише малі англійські літери (az).
  • Новий рядок не є обов'язковим.

Вихідні дані

  • Можна класифікувати слова, надаючи чіткий та послідовний (завжди однаковий) вихід для кожної мови. (Наприклад, 1для англійської, 2для німецької, 3для італійської та 4для угорської.)

Це кодовий гольф, тому виграє найкоротша програма чи функція.

Питання про гольф, пов'язаний з кодом: це навіть слово?

Списки слів взяли з wiktionary.org та 101languages.net.


ви впевнені, що списки правильні? Я досить впевнений, що ніколи не чув німецької. Чи враховується вихід масиву з усіма можливими мовами? наприклад, мабуть, є на всіх мовах, тому він поставив би {1,2,3,4}
Eumel

@Eumel Перша пара англійських слів може бути десь в інших списках, оскільки в текстах мов можуть бути англійські фрази, які використовувались для створення списків слів. Ви можете класифікувати вхід лише однією мовою. (Whihch означає, як згадується у запитанні, що "ваш код не завжди може правильно відгадати очікуваний вихід".)
randomra

У списках є лише слова з малих літер ... Це не зовсім вірно. У all_languagesфайл входять десятки слів з великої літери ( Mr, Gutenbergтощо) та неслов "" (порожній рядок) та "]] | -". Я припускаю, що це нормально, щоб прописати перший і вилучити останній?
писклива косточка

@squeamishossifrage Дякую за улов. Оновлено списки англійської мови. (Було ~ 60 прописних слів і 2
неслов

Навіщо знімати діакритику? Якщо метою є розрізнення мов, які не мають діакритики, то чому б не використовувати мови, які не мають діакритики?
пат

Відповіді:


9

Сітківка , 51 байт

.*[aeio]$
1
A`en$|ch|ei|au
^$
2
A`[jkz]|gy|m$
\D+
4

Я придумав реджекси і @ MartinBüttner зробив перетворення на / гольф у Retina, так що ... ура для командних зусиль?

Відображення відображається 1 -> Italian, 2 -> German, (empty) -> Hungarian, 4 -> Englishіз сумою, класифікованою у кожній категорії 4506 + 1852 + 2092 + 3560 = 12010.

Спробуйте в Інтернеті! | Змінена багаторядкова версія

Пояснення

По-перше, еквівалент Python - це приблизно такий:

import re
def f(s):
  if re.search("[aeio]$", s):
    return 1
  if re.search("en$|ch|ei|au", s):
    return 2
  if re.search("[jkz]|gy|m$", s):
    return ""
  return 4

Дозвольте сказати, що o$це відмінний показник італійської мови.

Версія Retina схожа, пари ліній утворюють етапи заміни. Наприклад, перші два рядки

.*[aeio]$
1

замінює відповідність першого рядка змістом другого.

Наступні три рядки роблять те ж саме, але за допомогою режиму анти-grep Retina - anti-grep (вказано з A`) видаляє рядок, якщо вона відповідає заданому регулярному вираженню, а наступні два рядки - це заміна з порожнього рядка на потрібний вихід.

A`en$|ch|ei|au
^$
2

У наступному рядку знову використовується anti-grep, але він не замінює порожній рядок, даючи фіксований вихід для угорської мови.

A`[jkz]|gy|m$

Нарешті, останні два рядки

\D+
4

замінює не порожній нецифровий рядок на 4. Усі заміни можуть відбутися лише в тому випадку, якщо попередня заміна не активована, імітуючи if/else ifланцюг.


1

LabVIEW, 29 примітивів LabVIEW та 148,950 байт

цикли по мовах і додає ітератор до масиву, якщо слово є. Це перевіряється внутрішньою петлею, підбираючи i-ту лінію і робимо =. У LabVIEW це відповідає дійсності лише в тому випадку, якщо рядки абсолютно однакові.

Тепер візьміть перший елемент вихідного масиву, щоб englishgoes над рештою.

Наразі висновок призначений 0для англійської, 1німецької, 2італійської та 3угорської.


Я не знайомий з LabView, але як ви зберігаєте значення (списки слів) і як вони відображаються в LabView Primitive? Мета-запис говорить: " Константи: рядки - 1 примітка LabVIEW на символ ". Хіба це не сильно збільшить кількість первісних?
insertusernamehere

Я завантажую файл з файлу, який є шлях до каталогу + шлях збірки з рядком + файл завантаження. Зберігання здійснюється внутрішньо і передається проводами.
Eumel

5
Я можу помилятися, але я думаю, що основна задача полягає в тому, як стискати / зберігати списки слів. Тому завантаження із зовнішнього файлу може бути заборонено. Попросимо ОП про це. :)
insertusernamehere

2
Якщо ви використовуєте зовнішній файл, його розмір слід додати до розміру коду, оскільки це є частиною вашого рішення.
randomra

я був під враженням, що їх потрібно було дати, але погано додати їх np
Eumel

1

Java, 3416 байт, 62%

це моє рішення, я аналізую список заданих слів і знаходжу 60 найбільш загальних биграм і триграм для кожної мови. Тепер я перевіряю свої n-грами проти слова і вибираю мову з більшою кількістю n-грамів у слові.

public class Classificator {

    String[][] triGr = {
            {"ing","ion","ent","tio","ted","nce","ter","res","ati","con","ess","ate","pro","ain","est","ons","men","ect","red","rea","com","ere","ers","nte","ine","her","ble","ist","tin","for","per","der","ear","str","ght","pre","ver","int","nde","the","igh","ive","sta","ure","end","enc","ned","ste","dis","ous","all","and","anc","ant","oun","ten","tra","are","sed","cti"},
            {"sch","che","ver","gen","ten","cht","ich","ein","ste","ter","hen","nde","nge","ach","ere","ung","den","sse","ers","and","eit","ier","ren","sen","ges","ang","ben","rei","est","nen","nte","men","aus","der","ent","hei","her","lle","ern","ert","uch","ine","ehe","auf","lie","tte","ige","ing","hte","mme","end","wei","len","hre","rau","ite","bes","ken","cha","ebe"},
            {"ent","are","ato","nte","ett","ere","ion","chi","con","one","men","nti","gli","pre","ess","att","tto","par","per","sta","tra","zio","and","iam","end","ter","res","est","nto","tta","acc","sci","cia","ver","ndo","amo","ant","str","tro","ssi","pro","era","eri","nta","der","ate","ort","com","man","tor","rat","ell","ale","gio","ont","col","tti","ano","ore","ist"},
            {"sze","ere","meg","ett","gye","ele","ond","egy","enn","ott","tte","ete","unk","ban","tem","agy","zer","esz","tet","ara","nek","hal","dol","mon","art","ala","ato","szt","len","men","ben","kap","ent","min","ndo","eze","sza","isz","fog","kez","ind","ten","tam","nak","fel","ene","all","asz","gon","mar","zem","szo","tek","zet","elm","het","eve","ssz","hat","ell"}

                    };
    static String[][] biGr = {
        {"in","ed","re","er","es","en","on","te","ng","st","nt","ti","ar","le","an","se","de","at","ea","co","ri","ce","or","io","al","is","it","ne","ra","ro","ou","ve","me","nd","el","li","he","ly","si","pr","ur","th","di","pe","la","ta","ss","ns","nc","ll","ec","tr","as","ai","ic","il","us","ch","un","ct"},
        {"en","er","ch","te","ge","ei","st","an","re","in","he","ie","be","sc","de","es","le","au","se","ne","el","ng","nd","un","ra","ar","nt","ve","ic","et","me","ri","li","ss","it","ht","ha","la","is","al","eh","ll","we","or","ke","fe","us","rt","ig","on","ma","ti","nn","ac","rs","at","eg","ta","ck","ol"},
        {"re","er","to","ar","en","te","ta","at","an","nt","ra","ri","co","on","ti","ia","or","io","in","st","tt","ca","es","ro","ci","di","li","no","ma","al","am","ne","me","le","sc","ve","sa","si","tr","nd","se","pa","ss","et","ic","na","pe","de","pr","ol","mo","do","so","it","la","ce","ie","is","mi","cc"},
        {"el","en","sz","te","et","er","an","me","ta","on","al","ar","ha","le","gy","eg","re","ze","em","ol","at","ek","es","tt","ke","ni","la","ra","ne","ve","nd","ak","ka","in","am","ad","ye","is","ok","ba","na","ma","ed","to","mi","do","om","be","se","ag","as","ez","ot","ko","or","cs","he","ll","nn","ny"}

                    };

    public int guess(String word) {

        if (word.length() < 3) {
            return 4; // most words below 2 characters on list are hungarians
        }
        int score[] = { 0, 0, 0, 0 };
        for (int i = 0; i < 4; i++) {
            for (String s : triGr[i]) {
                if (word.contains(s)) {
                    score[i] = score[i] + 2;
                }
            }
            for (String s : biGr[i]) {
                if (word.contains(s)) {
                    score[i] = score[i] + 1;
                }
            }
        }
        int v = -1;
        int max = 0;
        for (int i = 0; i < 4; i++) {
            if (score[i] > max) {
                max = score[i];
                v = i;
            }
        }
        v++;
        return v==0?Math.round(4)+1:v;
    }
}

і це моя перевірка

public class Test {

    Map<String, List<Integer>> words = new HashMap<String, List<Integer>>();

    boolean validate(String word, Integer lang) {
        List<Integer> langs = words.get(word);
        return langs.contains(lang);
    }

    public static void main(String[] args) throws FileNotFoundException {

        FileReader reader = new FileReader("list.txt");
        BufferedReader buf = new BufferedReader(reader);
        Classificator cl = new Classificator();
        Test test = new Test();
        buf.lines().forEach(x -> test.process(x));
        int guess = 0, words = 0;
        for (String word : test.words.keySet()) {
            int lang = cl.guess(word);
            if (lang==0){
                continue;
            }
            boolean result = test.validate(word, lang);
            words++;
            if (result) {
                guess++;
            }
        }
        System.out.println(guess+ " "+words+ "    "+(guess*100f/words));
    }

    private void process(String x) {
        String arr[] = x.split("\\s+");
        String word = arr[0].trim();
        List<Integer> langs = words.get(word);
        if (langs == null) {
            langs = new ArrayList<Integer>();
            words.put(word, langs);
        }
        langs.add(Integer.parseInt(arr[1].trim()));

    }

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.