คำนี้เป็นภาษาอะไร


16

คุณควรเขียนโปรแกรมหรือฟังก์ชั่นที่กำหนดภาษาของคำที่กำหนด

ภารกิจคือจดจำคำศัพท์ที่พบบ่อยที่สุด 5,000 คำใน 4 ภาษา:

  • อังกฤษ
  • เยอรมัน
  • อิตาลี
  • ฮังการี

รายการคำสามารถพบได้ในที่เก็บ GitHub นี้

คุณได้รับอนุญาตให้ทำผิดใน 40% ของกรณีทดสอบที่ให้ไว้ นั่นคือคุณสามารถแยกหมวดหมู่ 8000 ของอินพุต 20000

รายละเอียด

  • รายการมีเพียงคำที่มีตัวอักษรตัวเล็กa-zเช่นwon'tและmöchteจะไม่รวม
  • มีคำไม่กี่คำที่ปรากฏในหลายภาษาซึ่งหมายความว่ารหัสของคุณไม่สามารถคาดเดาผลลัพธ์ได้อย่างถูกต้อง
  • เพื่อความสะดวกคุณสามารถดาวน์โหลดกรณีทดสอบทั้งหมดเป็นรายการเดียว ในแต่ละบรรทัดตัวเลขจะระบุภาษาของคำนั้น ( 1สำหรับภาษาอังกฤษภาษา2เยอรมันภาษา3อิตาลีและ4ภาษาฮังการี)
  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
  • การใช้คำจะแสดงข้อมูลที่คล้ายกันซึ่งเราจัดเตรียมให้โดยภาษาการเขียนโปรแกรมของคุณ

อินพุต

  • สตริงที่มีตัวอักษรภาษาอังกฤษตัวพิมพ์เล็กเท่านั้น (az)
  • ขึ้นบรรทัดใหม่ต่อท้ายเป็นตัวเลือก

เอาท์พุต

  • คุณสามารถจัดหมวดหมู่คำต่าง ๆ ได้ด้วยการให้ผลลัพธ์ที่แตกต่างและสม่ำเสมอ (เหมือนกันเสมอ) สำหรับแต่ละภาษา (เช่น1ภาษาอังกฤษภาษา2เยอรมันภาษา3อิตาลีและ4ภาษาฮังการี)

นี่คือรหัสกอล์ฟเพื่อให้โปรแกรมหรือฟังก์ชันที่สั้นที่สุดชนะ

รหัสคำถามกอล์ฟที่เกี่ยวข้อง: นี่เป็นคำศัพท์หรือไม่?

รายการคำถูกนำมาจาก wiktionary.org และ 101languages.net


คุณแน่ใจหรือว่ารายการถูกต้อง? ฉันค่อนข้างแน่ใจว่าฉันไม่เคยได้ยินภาษาเยอรมันเลย การส่งออกอาร์เรย์ด้วยภาษาที่เป็นไปได้ทั้งหมดจะถูกนับหรือไม่ เช่นที่เห็นได้ชัดคือในทุกภาษาจึง woul ใส่ {1,2,3,4}
Eumel

@Eumel คำภาษาอังกฤษคู่แรกอาจปรากฏที่ใดที่หนึ่งในรายการอื่น ๆ เนื่องจากอาจมีวลีภาษาอังกฤษในข้อความของภาษาที่ใช้ในการสร้างรายการคำ คุณสามารถจัดหมวดหมู่ข้อมูลเข้าเป็นภาษาเดียวเท่านั้น (หมายถึง Whihch เป็นที่กล่าวถึงในคำถามที่ว่า "รหัสของคุณไม่สามารถคาดเดาการส่งออกที่คาดว่าจะได้อย่างถูกต้อง".)
randomra

รายการมีเพียงคำที่มีตัวอักษรตัวเล็ก ... นั่นไม่จริงทั้งหมด all_languagesไฟล์รวมถึงหลายสิบคำนิยาม ( Mr, Gutenbergฯลฯ ) และไม่ใช่คำว่า "" (สตริงว่าง) และ "]] | -" ฉันคิดว่ามันโอเคที่จะใช้ตัวพิมพ์เล็กก่อน
ossifrage คลื่นไส้

@squeamishossifrage ขอบคุณสำหรับการจับ อัปเดตรายการภาษาอังกฤษ (มีคำตัวพิมพ์ใหญ่ประมาณ 60 คำและไม่ใช่คำ 2 คำ)
Randomra

ทำไมต้องถอดกำกับออกเสียง? หากเป้าหมายคือการแยกแยะภาษาที่ไม่มีการออกเสียงดังนั้นทำไมไม่ใช้ภาษาที่ไม่มีการออกเสียง
pat

คำตอบ:


9

เรติน่า 51 ไบต์

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

ฉันมากับ regexes และ @ MartinBüttnerทำการแปลงเป็น / golfing ใน Retina ดังนั้น ... hurray สำหรับความพยายามของทีม?

การทำแผนที่เป็นกับจำนวนเงินที่จัดอยู่ในหมวดหมู่แต่ละคน1 -> Italian, 2 -> German, (empty) -> Hungarian, 4 -> English4506 + 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

แทนที่การจับคู่ของบรรทัดแรกด้วยเนื้อหาของวินาที

สามบรรทัดถัดไปทำแบบเดียวกัน แต่การใช้โหมด anti-grep ของ Retina - anti-grep (ระบุด้วยA`) จะลบบรรทัดถ้าตรงกับ regex ที่กำหนดและสองบรรทัดต่อไปนี้แทนจากบรรทัดว่างไปยังเอาต์พุตที่ต้องการ

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

บรรทัดต่อไปนี้ใช้ anti-grep อีกครั้ง แต่ไม่ได้แทนที่บรรทัดว่างให้เอาต์พุตถาวรสำหรับฮังการี

A`[jkz]|gy|m$

ในที่สุดสองบรรทัดสุดท้าย

\D+
4

4แทนที่สายไม่ว่างเปล่าไม่ใช่หลักด้วย การทดแทนทั้งหมดสามารถเกิดขึ้นได้หากไม่มีการแทนที่ก่อนหน้านี้เปิดใช้งานจำลองif/else ifห่วงโซ่


1

LabVIEW, 29 LabVIEW Primitivesและ 148.950 Bytes

วนรอบภาษาต่างๆและวางตัววนซ้ำในอาร์เรย์หากคำนั้นอยู่ที่นั่น นี้ได้รับการตรวจสอบโดยภายในวงยกบรรทัดที่ i =และการทำ ใน LabVIEW จะให้ค่าจริงถ้า Strings เหมือนกันทุกประการเท่านั้น

ตอนนี้ใช้องค์ประกอบแรกของอาร์เรย์ผลลัพธ์เพื่อให้ภาษาอังกฤษครอบคลุมส่วนที่เหลือ

ผลลัพธ์สำหรับตอนนี้0สำหรับภาษาอังกฤษ1สำหรับภาษาเยอรมัน2สำหรับภาษาอิตาลีและ3ภาษาฮังการี


ฉันไม่คุ้นเคยกับ LabView แต่คุณจะเก็บค่า (รายการคำศัพท์) ได้อย่างไรและจะสะท้อนให้เห็นอย่างไรใน LabView Primitives รายการ meta พูดว่า: "ค่าคงที่: สตริงคือ 1 LabVIEW Primitive ต่ออักขระ " นั่นจะไม่เพิ่มจำนวนดั้งเดิมหรือไม่
insertusernamehere

ฉันโหลดจากไฟล์ซึ่งเป็นเส้นทางไดเรกทอรี + สร้างเส้นทางด้วยสตริง + ไฟล์โหลด การจัดเก็บข้อมูลจะกระทำภายในและผ่านสายไฟ
Eumel

5
ฉันอาจจะผิด แต่ฉันคิดว่าหลักของความท้าทายคือการบีบอัด / จัดเก็บรายการคำศัพท์ ดังนั้นการโหลดจากไฟล์ภายนอกอาจไม่ได้รับอนุญาต จะถาม OP เกี่ยวกับเรื่องนั้น :)
insertusernamehere

2
หากคุณใช้ไฟล์ภายนอกขนาดของไฟล์นั้นควรเพิ่มเป็นขนาดรหัสของคุณเนื่องจากเป็นส่วนหนึ่งของโซลูชันของคุณ
randomra

ฉันอยู่ภายใต้ความประทับใจที่ควรจะได้รับ แต่ไม่ดีเพิ่มพวกเขา np
Eumel

1

Java, 3416 ไบต์, 62%

นี่คือวิธีการแก้ปัญหาของฉันฉันวิเคราะห์รายการคำที่กำหนดและค้นหา bigrams และ trigrams ที่ใหญ่ที่สุดสำหรับแต่ละภาษา 60 ตอนนี้ฉันกำลังตรวจสอบคำศัพท์ของฉันต่อกรัมและเลือกภาษาที่มีคำเป็นส่วนใหญ่

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

    }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.