ตรวจสอบว่าตัวอย่างข้อมูลภาษาโปรแกรมคืออะไร


23

ความท้าทายของคุณคือการใช้ซอร์สโค้ดเป็นอินพุตและเอาต์พุตซึ่งภาษาการเขียนโปรแกรมนั้นถูกเขียนขึ้น

ตัวอย่างเช่นคุณอาจมีอินพุต

class A{public static void main(String[]a){System.out.println("Hello, World!");}}

และเอาท์พุท

Java

เป้าหมายหลักสองข้อของคุณคือความหลากหลาย (ภาษาการเขียนโปรแกรมที่คุณสามารถตรวจจับได้) และความแม่นยำ (ความสามารถในการตรวจจับภาษาเหล่านี้)

สำหรับหลายภาษา (โปรแกรมที่ใช้ได้มากกว่าหนึ่งภาษา) คุณสามารถตัดสินใจได้ว่าจะทำอย่างไร คุณสามารถเอาท์พุทภาษาที่โปรแกรมของคุณคิดว่าน่าจะเป็นไปได้มากกว่าหรือคุณสามารถส่งออกข้อผิดพลาดหรือคุณสามารถเลือกอาเรย์ที่เป็นไปได้ (ซึ่งอาจจะได้รับ upvotes มากกว่าข้อผิดพลาด!)

นี่คือการเพราะมันจะยากมากที่จะระบุเกณฑ์การชนะวัตถุประสงค์ที่แตกต่างกัน ผู้ลงคะแนนโปรดลงคะแนนว่าสามารถตรวจจับได้กี่ภาษาและมีความแม่นยำเท่าใด


นั่นเป็นไปไม่ได้สาเหตุprint("")สามารถใช้ได้ในหลายภาษา
Ismael Miguel

1
ด้วยการแก้ไขของคุณตอนนี้ดูเหมือนว่าจะเป็นไปได้มากขึ้น
Ismael Miguel

4
ภาษาใดบ้างที่ใช้ได้กับการป้อนข้อมูลทุกครั้ง เหมือนช่องว่าง ประโยคนี้เป็นโปรแกรมช่องว่างที่ถูกต้อง ทั้งหน้านี้เป็นโปรแกรมช่องว่างที่ถูกต้อง
Ismael Miguel

1
อินพุตรับประกันว่าเป็นโปรแกรมที่ถูกต้องหรือไม่? เช่นเดียวกับการป้อนข้อมูลบางอย่างclass A{public static void main(String[]a){System.println.out("Hello, World!");}}ซึ่งอาจไม่ถูกต้อง
Gaurang Tandon

1
หรือในทำนองเดียวกันจะป้อน HTML มักจะเริ่มต้นด้วย<!DOCTYPE html>ตามมาด้วย<html>, <body>และแท็กอื่น ๆ (เช่นmeta) ในลำดับที่ถูกต้องของพวกเขา?
Gaurang Tandon

คำตอบ:


18

รูปแบบข้อความ 234 - Unix Shell

(ไม่ใช่ทุกภาษา - ฉันต้องนับอย่างระมัดระวัง)

file $1

ฉันลังเลที่จะโพสต์คำตอบที่ค่อนข้างฉลาด แต่ฉันไม่เห็นอะไรเลยในกฎห้ามมันและfileเชลล์ยูทิลิตี้ทำงานได้ดีจริงๆ เช่น:

$ file golfscript.rb 
golfscript.rb: Ruby module source, ASCII text
$ file template.c 
template.c: ASCII C program text
$ file adams.sh
adams.sh: Bourne-Again shell script, ASCII text executable
$ 

นอกจากนี้คุณสามารถใช้-kตัวเลือกเพื่อ "ดำเนินต่อไป" เมื่อทดสอบหลายภาษา:

 -k, --keep-going
         Don't stop at the first match, keep going.  Subsequent matches
         will be have the string ‘\012- ’ prepended.  (If you want a new‐
         line, see the -r option.)

นอกจากนี้-lตัวเลือกนี้จะช่วยให้คุณเข้าใจว่าอัลกอริทึมนั้นดีอย่างไรสำหรับภาษาที่แตกต่าง:

$ file -l | เปลือก grep
ไม่ทราบ, 0: คำเตือน: การใช้ไฟล์เวทย์มนตร์ปกติ `/ etc / magic '
Strength = 280: ข้อความที่เก็บเชลล์ [application / octet-stream]
Strength = 250: ข้อความรันสคริปต์เชลล์ Tenex C [text / x-shellscript]
Strength = 250: ข้อความสั่งเชลล์สคริปต์ Bourne-Again [text / x-shellscript]
Strength = 240: ข้อความสคริปต์ zsh ของ Paul Falstad ที่ปฏิบัติการได้ [text / x-shellscript]
Strength = 240: ข้อความเรียกใช้งานสคริปต์ Ash ของ Neil Brown [text / x-shellscript]
Strength = 230: ข้อความปฏิบัติการ ae ของสคริปต์ Neil Brown [text / x-shellscript]
Strength = 210: ข้อความรันสคริปต์เชลล์ Tenex C [text / x-shellscript]
Strength = 210: ข้อความสั่งเชลล์สคริปต์ Bourne-Again [text / x-shellscript]
Strength = 190: ข้อความสั่งเชลล์สคริปต์ Tenex C [text / x-shellscript]
Strength = 190: ข้อความสั่งเชลล์สคริปต์ Bourne-Again [text / x-shellscript]
Strength = 180: ข้อความสคริปต์ zsh ของ Paul Falstad ที่ปฏิบัติการได้ [text / x-shellscript]
Strength = 150: ข้อความรันสคริปต์เชลล์ Tenex C [text / x-shellscript]
Strength = 150: ข้อความเชลล์สคริปต์ Bourne-Again ที่สามารถเรียกทำงานได้ [text / x-shellscript]
Strength = 140: ข้อความสั่งเชลล์สคริปต์ C [text / x-shellscript]
Strength = 140: Korn เชลล์สคริปต์ข้อความที่เรียกทำงานได้ [text / x-shellscript]
Strength = 140: ข้อความสคริปต์ zsh ของ Paul Falstad ที่ปฏิบัติการได้ [text / x-shellscript]
Strength = 130: ข้อความสคริปต์ของเชลล์ POSIX ที่สามารถเรียกทำงานได้ [text / x-shellscript]
Strength = 130: แผนปฏิบัติการ 9 ข้อความเชลล์สคริปต์ rc []
$ 

นี่คือfile-5.09(บน Ubuntu 12.04)


สิ่งนี้ทำได้ค่อนข้างดีในกลุ่มภาษา 16 ภาษา - gist.github.com/riking/9088817
Riking

คุณอาจจะตัดชายกลางออกและหลีกเลี่ยงเปลือกหอยทั้งหมด: ln -s /usr/bin/file /usr/local/bin/myspecialtool. หากคำตอบของคุณนับแล้วก็ไม่นับเช่นกันใช่ไหม (ไม่ต้องกังวลฉันไม่ซีเรียส)
hvd

2
ดูเหมือนว่าช่องโหว่มาตรฐานคือการมอบโซลูชันให้กับโปรแกรมที่มีอยู่
วิ

10

ทุบตี - เกี่ยวกับ 50 35 ไบต์ต่อภาษาที่คอมไพล์ได้

เคล็ดลับคือการคอมไพล์แล้วคุณไม่ต้องกังวลเกี่ยวกับการเชื่อมโยงข้อผิดพลาดจากไลบรารีที่หายไปและมันจะยิ่งให้อภัยมากขึ้นถ้าคุณมีตัวอย่างโค้ด

ขอบคุณ Shahbaz สำหรับแบบฟอร์มที่สั้นลง!

gcc -c $1 && (echo C; exit 0)
g++ -c $1 && (echo C++; exit 0)
gpc -c $1 && (echo Pascal; exit 0)
gfortran -c $1 && (echo Fortran; exit 0)

ฯลฯ ...


เนื่องจากคุณพูดถึงจำนวนไบต์ต่อภาษาที่คอมไพล์คุณอาจสนใจในบรรทัดเช่น:gcc -c $1 && (echo C; exit 0)
Shahbaz

ขอบคุณฉันไม่ดีที่รหัสบีบจริง ๆ !

แน่ใจ &&และ||ในทุบตีมีประโยชน์จริงๆและช่วยทำความสะอาดรหัสเป็นจำนวนมาก พวกมันไม่เคยถูกใช้สำหรับทำให้งงงวยดังนั้นคุณควรเรียนรู้ให้ดี
Shahbaz

2
คุณสามารถส่งผ่าน-fsyntax-onlyเพื่อตรวจสอบไวยากรณ์และข้ามการคอมไพล์จริงเท่านั้น
peppe

7

18 ภาษาโปรแกรม, 1002 ไบต์, ความแม่นยำ: ทดสอบด้วยตัวเอง :)

(ใช่ฉันรู้ว่านี่ไม่ใช่รหัสกอล์ฟ แต่เพื่อความสนุกของมัน)

โปรแกรมจะค้นหาตัวอย่างรหัสสัญลักษณ์การตรวจสอบจะถูกจัดเรียงในลักษณะที่การตรวจสอบที่ชัดเจนที่สุดจะอยู่ที่ด้านบนสุดและภาษาการเขียนโปรแกรมที่ฝังอยู่ในภาษาการเขียนโปรแกรมอื่น ๆ อยู่ด้านล่าง (เช่น HTML ใน PHP)

สิ่งนี้ล้มเหลวอย่างเห็นได้ชัดสำหรับโปรแกรมเช่น System.out.println('<?php');

t = (p) ->
    h = (x) -> -1 != p.indexOf x
    s = (x) -> 0 == p.indexOf x

    if h "⍵" then "APL"
    else if h "<?php" then "PHP"
    else if h("<?xml") and h "<html" then "XHTML"
    else if h "<html" then "HTML"
    else if h "<?xml" then "XML"
    else if h("jQuery") or h "document.get" then "JavaScript"
    else if h "def __init__(self" then "Python"
    else if h "\\documentclass" then "TeX"
    else if h("java.") or h "public class" then "Java"
    else if s("SELE") or s("UPDATE") or s "DELE" then "SQL"
    else if /[-\+\.,\[\]\>\<]{9}/.test p then "Brainfuck"
    else if h "NSString" then "Objective-C"
    else if h "do |" then "Ruby"
    else if h("prototype") or h "$(" then "JavaScript"
    else if h "(defun" then "Common Lisp"
    else if /::\s*[a-z]+\s*->/i.test p then "Haskell"
    else if h "using System" then "C#"
    else if h "#include"
        if h("iostream") or h "using namespace" then "C++"
        else "C"
    else "???"

program = ""
process.stdin.on 'data', (chunk) -> program += chunk
process.stdin.on 'end', -> console.log t program

การใช้งานบนโหนด: coffee timwolla.coffee < Example.java

การสาธิต (สาธิตออนไลน์บน JSFiddle ):

[timwolla@~/workspace/js]coffee puzzle.coffee < ../c/nginx/src/core/nginx.c 
C
[timwolla@~/workspace/js]coffee puzzle.coffee < ../ruby/github-services/lib/service.rb
Ruby
[timwolla@~/workspace/js]coffee puzzle.coffee < ../python/seafile/python/seaserv/api.py
Python

ในคอมพิวเตอร์ของฉันไม่มีอะไรแสดงผลแม้แต่ในอินพุตที่เห็นได้ชัดว่าควรใช้งานได้ จริงอยู่ที่ฉันอาจจะทำสิ่งผิดปกติเพราะฉันไม่เคยใช้ Coffeescript มาก่อน
marinus

@marinus โปรดทราบว่าเมื่อป้อนรหัสด้วยตนเองคุณจะต้องส่ง EOF (STRG + D) เพื่อเริ่มการทำงาน โดยทั่วไป: เครื่องตรวจจับอย่างน้อยควรพ่นเครื่องหมายคำถามสามข้อ
TimWolla

ไม่เลย ฉันต้องผ่านcoffeeการโต้แย้งใด ๆ หรือไม่? ฉันเพิ่งลองเปลี่ยนเส้นทางไฟล์เข้าไป แต่เพียงแค่เรียกใช้และดำเนินการต่อไป^Dจะไม่ทำอะไรเลย
marinus

@marinus ลอง: ในโฟลเดอร์ชั่วคราวนี้ควรคายออกnpm install coffee-script && node_modules/.bin/coffee timwolla.coffee < timwolla.coffee APL(สมมติว่าคุณมีโหนดรุ่นล่าสุดและติดตั้ง npm)
TimWolla

5
ฉันจะเริ่มใช้โอเมก้าตัวพิมพ์เล็กเพิ่มเติมในโปรแกรมที่ไม่ใช่ APL ของฉัน
John Dvorak

4

คำตอบนี้เป็นหลักฐานของแนวคิดที่จะไม่ได้รับงานเพิ่มเติมจากฉันอีก

มันสั้นในหลายวิธี:

  • เอาต์พุตไม่ตรงตามที่คำถามร้องขอ แต่ใกล้เพียงพอและสามารถแก้ไขได้อย่างง่ายดายเพื่อสร้างเอาต์พุตที่ต้องการ
  • มีหลายวิธีในการทำให้โค้ดทำงานได้ดีขึ้นและ / หรือวิธีที่ดีกว่าในการแสดงโครงสร้างข้อมูล
  • และอื่น ๆ

แนวคิดคือการตั้งค่ารายการคำหลัก / ตัวอักษร / วลีที่สามารถระบุภาษาเฉพาะและกำหนดคะแนนให้กับคำหลักนั้นสำหรับแต่ละภาษา จากนั้นตรวจสอบไฟล์ต้นฉบับสำหรับคำหลักเหล่านี้และรวบรวมคะแนนสำหรับแต่ละภาษาที่คุณค้นหาคำหลัก ในที่สุดภาษาที่มีคะแนนสูงสุดจะเป็นผู้ชนะ นอกจากนี้ยังเหมาะสำหรับโปรแกรมพูดได้หลายภาษาเนื่องจากทั้ง (หรือทั้งหมด) ภาษาที่เกี่ยวข้องจะมีคะแนนสูง

สิ่งเดียวที่จะเพิ่มภาษาเพิ่มเติมคือการระบุ "ลายเซ็น" ของพวกเขาและเพิ่มพวกเขาในการทำแผนที่

นอกจากนี้คุณยังสามารถกำหนดคะแนนที่แตกต่างให้กับคำหลักที่แตกต่างกันต่อภาษา ตัวอย่างเช่นหากคุณรู้สึกว่าvolatileถูกใช้ใน Java มากกว่าใน C ให้ตั้งคะแนนสำหรับvolatileคำหลักเป็น 2 สำหรับ Java และ 1 สำหรับ C

public class SourceTest {

  public static void main(String[] args) {
    if (args.length < 1) {
      System.out.println("No file provided.");
      System.exit(0);
    }
    SourceTest sourceTest = new SourceTest();
    for (String fileName : args) {
      try {
        sourceTest.checkFile(fileName);
      } catch (FileNotFoundException e) {
        System.out.println(fileName + " : not found.");
      } catch (IOException e) {
        System.out.println(fileName + " : could not read");
      }
    }
    System.exit(0);
  }

  private Map<String, LanguagePoints> keyWordPoints;
  private Map<LANGUAGES, Integer> scores;

  private enum LANGUAGES {
    C, HTML, JAVA;
  }

  public SourceTest() {
    init();
  }

  public void checkFile(String fileName) throws FileNotFoundException, IOException {
    String fileContent = getFileContent(fileName);
    testFile(fileContent);
    printResults(fileName);
  }

  private void printResults(String fileName) {
    System.out.println(fileName);
    for (LANGUAGES lang : scores.keySet()) {
      System.out.println("\t" + lang + "\t" + scores.get(lang));
    }
  }

  private void testFile(String fileContent) {
    for (String key : keyWordPoints.keySet()) {
      if (fileContent.indexOf(key) != -1) {
        for (LANGUAGES lang : keyWordPoints.get(key).keySet()) {
          scores.put(lang, scores.get(lang) == null ? new Integer(1) : scores.get(lang) + 1);
        }
      }
    }
  }

  private String getFileContent(String fileName) throws FileNotFoundException, IOException {
    File file = new File(fileName);
    FileReader fr = new FileReader(file);// Using 1.6 so no Files
    BufferedReader br = new BufferedReader(fr);
    StringBuilder fileContent = new StringBuilder();
    String line = br.readLine();
    while (line != null) {
      fileContent.append(line);
      line = br.readLine();
    }
    return fileContent.toString();
  }

  private void init() {
    scores = new HashMap<LANGUAGES, Integer>();

    keyWordPoints = new HashMap<String, LanguagePoints>();
    keyWordPoints.put("public class", new LanguagePoints().add(LANGUAGES.JAVA, 1));
    keyWordPoints.put("public static void main", new LanguagePoints().add(LANGUAGES.JAVA, 1));
    keyWordPoints.put("<html", new LanguagePoints().add(LANGUAGES.HTML, 1));
    keyWordPoints.put("<body", new LanguagePoints().add(LANGUAGES.HTML, 1));
    keyWordPoints.put("cout", new LanguagePoints().add(LANGUAGES.C, 1));
    keyWordPoints.put("#include", new LanguagePoints().add(LANGUAGES.C, 1));
    keyWordPoints.put("volatile", new LanguagePoints().add(LANGUAGES.JAVA, 1).add(LANGUAGES.C, 1));
  }

  private class LanguagePoints extends HashMap<LANGUAGES, Integer> {
    public LanguagePoints add(LANGUAGES l, Integer i) {
      this.put(l, i);
      return this;
    }
  }
}

4

ภาพรวมทั่วไปเพียงไม่กี่ภาพเท่านั้น

ฉันคิดว่ามันค่อนข้างแม่นยำ

นี่คือทับทิม btw รับอินพุต (หลายบรรทัด) จาก stdin

puts case $<.read
when /\)\)\)\)\)/
  "Lisp"
when /}\s+}\s+}\s+}/
  "Java"
when /<>/
  "Perl"
when /|\w+|/
  "Ruby"
when /\w+ :- \w+ \./
  "Prolog"
when /^[+-<>\[\],.]+$/
  "brainfuck"
when /\[\[.*\]\]/
  "Bash"
when /~]\.{,/
  "golfscript"
end

ฉันคิดว่า #include เป็นตัวทำนายที่ดีกว่าสำหรับ c แล้ว #! / bin / (ba)? sh สำหรับ bash / shell script?
Digital Trauma

@DigitalTrauma ใช่ฉันคิดว่าคุณถูกต้องเกี่ยวกับ #include ด้วยเหตุผลทางศิลปะฉันจะไม่ไปจับแฮชปังที่ชื่อของภาษานั้นสะกดออกมาอย่างชัดเจน
daniero

#include เป็นความคิดเห็นในiniไฟล์และphp
Ismael Miguel

1
+1 เมื่อมีการเปิดฉาก แต่ไม่มี C :)
SztupY

1
ฉันจะเพิ่ม\$\w+หลังจาก perl หนึ่งในการตรวจสอบ PHP นอกจากนี้(\w+)::~\1มักจะเป็นผู้ทำลายล้าง C ++
SztupY

2

Javascript - 6 ภาษา - ความแม่นยำสูง

ภาษาปัจจุบัน: Java, C, HTML, PHP, CSS, Javascript

ฉันทำงานบนหลักการที่ว่าเมื่อใดก็ตามที่ปัจจัยนำเข้าเป็นไปตามเกณฑ์จะได้รับคะแนนและขึ้นอยู่กับผลคะแนนที่ได้รับ

คุณสมบัติ:

  • ไม่มีฟังก์ชั่นในตัวที่กำหนดประเภทภาษาที่ใช้
  • ไม่ทันทีประกาศข้อความที่ป้อนเป็นxภาษาที่เห็นคำหลัก
  • แนะนำภาษาที่เป็นไปได้อื่น ๆ ด้วย

หากคุณรู้สึกว่าข้อมูลใด ๆ ที่คุณได้รับจากโปรแกรม (ที่ฉันทำมาจนถึงตอนนี้) ไม่ถูกตรวจจับหรือได้ผลลัพธ์ที่ไม่ถูกต้องโปรดรายงานและฉันยินดีที่จะแก้ไข

ตัวอย่างอินพุต 1:

class A{public static void main(String[]a){System.out.println("<?php");}}

ตัวอย่างผลลัพธ์ 1:

My program thinks you have :
Java with a chance of 100%
Php with a chance of 25%
----------------

คำอธิบาย:

สิ่งนี้ควรล้มเหลวในโปรแกรมและฉันจะพิมพ์PHPแต่เนื่องจากโปรแกรมของฉันทำงานบนพื้นฐานของคะแนนจึงไม่มีอะไรล้มเหลวและสามารถระบุ Java ได้อย่างง่ายดายตั้งแต่แรกแล้วตามด้วยผลลัพธ์ที่เป็นไปได้อื่น ๆ

ตัวอย่างอินพุต 2:

class A{public static void main(String[]a){System.out.println("HelloWorld!");}}

ตัวอย่างผลลัพธ์ 2:

Java
----------------

ตัวอย่างอินพุต 3:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

ตัวอย่างผลลัพธ์ 3:

Language not catched! Sorry.
----------------

รหัส:

// Helper functions

String.prototype.m = function(condition){
  return this.match(condition);
};

String.prototype.capitalize = function(){
  return this[0].toUpperCase() + this.substr(1);
};

function getFuncName(func){
  var temp =  func.toString();
  temp = temp.substr( "function ".length);
  temp = temp.substr( 0, temp.indexOf("("));
  return temp.capitalize();
}

// Get input
var lang_input = prompt("Enter programming language");

// Max score of 4 per lang

function java(input){
  var score = 0;
  score += input.m(/class[\s\n]+[\w$]+[\s\n]*\{/) ? 1 : 0;
  score += input.m(/public[\s\n]+static[\s\n]+void[\s\n]+main[\s\n]*/) ? 1 : 0;
  score += input.m(/\}[\s\n]*\}[\s\n]*$/) ? 1 : 0;
  score += input.m(/System[\s\n]*[.][\s\n]*out/) ? 1 : 0;
  return score;
}

function c(input){
  var score = 0;
  // if java has passsed
  if(checks[0][1] >= 3)return 0;

  score += input.m(/^#include\s+<[\w.]+>\s*\n/) ? 1 : 0;
  score += input.m(/main[\s\n]*\([\s\n]*(void)?[\s\n]*\)[\s\n]*\{/) ? 1 : 0;
  score += input.m(/printf[\s\n]+\(/) || input.m(/%d/) ? 1 : 0;
  score += input.m(/#include\s+<[\w.]+>\s*\n/) || input.m(/(%c|%f|%s)/) ? 1 : 0;
  return score;
}

function PHP(input){
  var score = 0;
  score += input.m(/<\?php/) ? 1 : 0;
  score += input.m(/\?>/) ? 1 : 0;
  score += input.m(/echo/) ? 1 : 0;
  score += input.m(/$[\w]+\s*=\s*/) ? 1 : 0;
  return score;
}

function HTML(input){
  var score = 0;
  // if php has passed
  if(checks[2][1] >= 2) return 0;

  score += input.m(/<!DOCTYPE ["' \w:\/\/]*>/) ? 1 : 0;
  score += input.m(/<html>/) && input.m(/<\/html>/) ? 1 : 0;
  score += input.m(/<body>/) && input.m(/<\/body/) ? 1 :  0;
  score += input.m(/<head>/) && input.m(/<\/head>/) ? 1 : 0;
  return score;
}

function javascript(input){
  var score = 0;
  score += input.m(/console[\s\n]*[.][\s\n]*log[\s\n*]\(/) ? 1 : 0;
  score += input.m(/[\s\n]*var[\s\n]+/) ? 1 : 0;
  score += input.m(/[\s\n]*function[\s\n]+[\w]+[\s\n]+\(/) ? 1 : 0;
  score += input.m(/document[\s\n]*[.]/) || 
           ( input.m(/\/\*/) && input.m(/\*\//) ) ||
           ( input.m(/\/\/.*\n/) )? 1 : 0;
  return score;
}

function CSS(input){
  var score = 0;
  score += input.m(/[a-zA-Z]+[\s\n]*\{[\w\n]*[a-zA-Z\-]+[\s\n]*:/) ? 1 : 0;
  // since color is more common, I give it a separate place
  score += input.m(/color/) ? 1 : 0;          
  score += input.m(/height/) || input.m(/width/) ? 1 : 0;
  score += input.m(/#[a-zA-Z]+[\s\n]*\{[\w\n]*[a-zA-Z\-]+[\s\n]*:/) ||
           input.m(/[.][a-zA-Z]+[\s\n]*\{[\w\n]*[a-zA-Z\-]+[\s\n]*:/) ||
           ( input.m(/\/\*/) && input.m(/\*\//) ) ? 1 : 0;
  return score;
}

// [Langs to check, scores]
var checks = [[java, 0], [c, 0], [PHP, 0], [HTML, 0], [javascript, 0], [CSS, 0]];
//Their scores

// Assign scores
for(var i = 0; i < checks.length; i++){
  var func = checks[i][0];
  checks[i][1] = func(lang_input);
}

// Sort the scores
checks.sort(function(a,b){ return b[1] - a[1]; });

var all_zero = true;

function check_all_zero(index){
  if(checks[index][1] > 0){ all_zero = false; return 0; } // someone is above zero

  // check next index only if it defined, else return zero
  if(checks[index + 1])
    check_all_zero(index + 1);
}

check_all_zero(0);

if(all_zero){
  console.log("Language not catched! Sorry.");
}else {
  var new_arr = [];                   // temp

  checks.map(function(value, index){
    if(value[1] > 0){
      var temp = [getFuncName(value[0]), value[1]];
      new_arr.push(temp);
    }
  });

  checks = new_arr.slice(0);          // array copy, because of mutation

  if(checks.length === 1){
    console.log(checks[0][0]);
  }else{
    console.log("My program thinks you have :");
    checks.map(function(value){
      var prob = (value[1]/4 * 100);
      console.log(value[0] + " with a chance of " + prob + "%");
    });
  }

} // Main else block finish

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