Bu kelime hangi dil?


16

Belirli bir kelimenin dilini belirleyen bir program veya işlev yazmalısınız.

Görev, 4 dilde en yaygın 5000 kelimeden bazılarını tanımaktır:

  • ingilizce
  • Almanca
  • İtalyan
  • Macarca

Kelime listeleri bu GitHub deposunda bulunabilir.

Verilen test vakalarının% 40'ında hata yapma izniniz var . Yani 20000 girdinin 8000'ini yanlış kategorize edebilirsiniz.

ayrıntılar

  • Listeleri yalnızca küçük harfler ile kelimeleri içeren a-zörneğin bu yüzden won'tve möchtedahil değildir.
  • Birden çok dilde birkaç kelime görünür; bu, kodunuzun beklenen çıktıyı her zaman doğru tahmin edemeyeceği anlamına gelir.
  • Kolaylık sağlamak için tüm test senaryolarını tek bir liste olarak indirebilirsiniz . Her satırda bir sayı kelimenin dilini gösterir. ( 1İngilizce, 2Almanca, 3İtalyanca ve 4Macarca için.)
  • Standart boşluklara izin verilmez.
  • Kelime listelerinin kullanılması, programlama diliniz tarafından sağlanan benzer verilerimizi listelemek yasaktır.

Giriş

  • Yalnızca küçük İngilizce harfleri içeren bir dize (az).
  • Sondaki satır başı isteğe bağlıdır.

Çıktı

  • Her dil için farklı ve tutarlı (her zaman aynı) çıktılar sağlayarak kelimeleri kategorilere ayırabilirsiniz. (Örneğin 1İngilizce, 2Almanca, 3İtalyanca ve 4Macarca için.)

Bu kod golf bu yüzden en kısa program veya işlev kazanır.

İlgili kod golf soru: Bu bir kelime mi?

Kelime listeleri wiktionary.org ve 101languages.net adreslerinden alınmıştır.


listelerin doğru olduğundan emin misin? Almanca hiç duymadım eminim. Bir dizinin tüm olası dillerle çıktısı sayılır mı? örneğin görünüşte tüm dillerde olduğu için {1,2,3,4}
Eumel

@Eumel İlk birkaç İngilizce kelime diğer listelerde bir yerde bulunabilir, çünkü kelime listelerini oluşturmak için kullanılan dil metinlerinde İngilizce ifadeler olabilir. Bir girdiyi yalnızca bir dile kategorize edebilirsiniz. (Whihch, "kodunuz her zaman beklenen çıktıyı doğru tahmin edemez" sorusunda belirtildiği anlamına gelir.)
randomra

Listeler yalnızca küçük harfli kelimeler içeriyor ... Bu tamamen doğru değil. all_languagesDosya harfle kelimelerin onlarca (içerir Mr, Gutenberg"- | vs.) ve non-kelimeleri ""(boş dize) ve"]]. Birincisini küçük harfle yazmayı ve ikincisini silmenin sorun olmadığını düşünüyorum.
r3mainer

@squeamishossifrage Yakaladığınız için teşekkürler. İngilizce listeler güncellendi. (~ 60 büyük harf ve 2 kelimesiz kelime vardı.)
randomra

Neden aksanları kaldırmalıyım? Amaç, aksan içermeyen dilleri ayırt etmekse, neden aksan içermeyen dilleri kullanmıyorsunuz?
pat

Yanıtlar:


9

Retina , 51 bayt

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

Regexes geldi ve @ MartinBüttner Retina için / golf dönüşümü yaptı ... takım çabası için acele?

Eşleme, 1 -> Italian, 2 -> German, (empty) -> Hungarian, 4 -> Englishher bir kategoride sınıflandırılan miktar olmak üzere yapılır 4506 + 1852 + 2092 + 3560 = 12010.

Çevrimiçi deneyin! | Değiştirilmiş çok satırlı sürüm

açıklama

Öncelikle, eşdeğer Python şuna benzer:

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

Bana sadece diyelim o$bir olan mükemmel İtalyanca göstergesi.

Retina versiyonu benzerdir, değiştirme aşamaları oluşturan çizgi çiftleri. Örneğin, ilk iki satır

.*[aeio]$
1

ilk satırın eşleşmelerini ikinci satırın içeriğiyle değiştirir.

Sonraki üç satır da aynı şeyi yapıyor, ancak Retina'nın anti-grep modunu kullanarak - anti-grep (ile belirtilir A`), verilen normal ifadeyle eşleşirse satırı kaldırır ve aşağıdaki iki satır, boş bir satırdan istenen çıktının yerine geçer.

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

Aşağıdaki satır tekrar anti-grep kullanır, ancak boş satırın yerini almaz ve Macarca için sabit çıktı verir.

A`[jkz]|gy|m$

Son olarak, son iki satır

\D+
4

boş olmayan, rakam olmayan bir satırı ile değiştirir 4. Tüm ikameler ancak önceden bir ikame etkin değilse, bir if/else ifzinciri simüle ederse gerçekleşebilir .


1

LabVIEW, 29 LabVIEW Temel Öğeleri ve 148.950 Bayt

diller arasında dolaşır ve kelime varsa yineleyiciyi bir diziye koyar. Bu, iç döngü tarafından kontrol edilir, i. Çizgiyi seçer ve yapar =. LabVIEW'da yalnızca Dizeler tamamen aynı olduğunda bir doğruluk verir.

Şimdi çıkış dizisinin ilk elemanını alın, böylece geri kalanı üzerinde englishgoes.

Şimdilik çıktı 0İngilizce, 1Almanca, 2İtalyanca ve 3Macarca içindir.


LabView ile tanışmıyorum, ancak değerleri (kelime listeleri) nasıl saklıyorsunuz ve LabView Primitives'a nasıl yansıyor? Meta giriş şöyle der: " Sabitler: dizeler 1 LabVIEW İlkel karakterdir ". Bu, İlkel sayımı büyük ölçüde arttırmaz mı?
insertusernameburada

Ben dizin dizin + dosya yolunu string + load dosyası olan bir dosyadan yükleyin. Depolama dahili olarak yapılır ve teller tarafından geçirilir.
Eumel

5
Yanılıyor olabilirim, ancak bence zorluğun özü, kelime listelerinin nasıl sıkıştırılacağı / saklanacağı ile ilgili. Bu nedenle harici bir dosyadan yüklemeye izin verilmeyebilir. OP'ye bunu soracak. :)
insertusernameburada

2
Harici bir dosya kullanırsanız, boyut çözümünüzün bir parçası olduğu için kod boyutunuza eklenmelidir.
randomra

Ben bu olması gerekiyordu izlenimi altındaydı ama hasta onları np eklemek
Eumel

1

Java, 3416 bayt,% 62

bu benim çözümüm, verilen kelimelerin listesini analiz ediyorum ve her dil için en çok 60 ortak bigram ve trigram buluyorum. Şimdi n-gramlarımı kelimeye göre kontrol ediyorum ve kelimeyi çoğu n-gram ile seçiyorum.

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;
    }
}

ve bu benim test kılıfım

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()));

    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.