Phát hiện ngôn ngữ lập trình một đoạn mã là gì


23

Thách thức của bạn là lấy một số mã nguồn làm đầu vào và xuất ra ngôn ngữ lập trình mà nó được viết.

Ví dụ: bạn có thể có đầu vào

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

Và đầu ra

Java

Hai mục tiêu chính của bạn là sự đa dạng (có bao nhiêu ngôn ngữ lập trình bạn có thể phát hiện) và độ chính xác (mức độ tốt của bạn trong việc phát hiện các ngôn ngữ này).

Đối với đa âm (chương trình hợp lệ bằng nhiều ngôn ngữ), bạn có thể quyết định phải làm gì. Bạn chỉ có thể xuất ra ngôn ngữ mà chương trình của bạn nghĩ là có khả năng hơn hoặc bạn có thể xuất ra lỗi hoặc bạn có thể xuất ra một loạt các lựa chọn có thể (có thể sẽ nhận được nhiều upvote hơn là lỗi!).

Đây là một , bởi vì sẽ rất khó để xác định một tiêu chí chiến thắng khách quan khác. Cử tri, vui lòng bỏ phiếu về số lượng ngôn ngữ có thể phát hiện và độ chính xác của nó.


Điều đó là không thể, nguyên nhân print("")có thể được sử dụng trong nhiều ngôn ngữ.
Ismael Miguel

1
Với chỉnh sửa của bạn, bây giờ có vẻ nhiều khả năng hơn.
Ismael Miguel

4
Điều gì về các ngôn ngữ hợp lệ cho MỌI đầu vào? Giống như khoảng trắng. Câu này là một chương trình khoảng trắng hợp lệ. Toàn bộ trang này là một chương trình khoảng trắng hợp lệ.
Ismael Miguel

1
Là đầu vào được đảm bảo là một chương trình hợp lệ? Giống như một số đầu vào có thể class A{public static void main(String[]a){System.println.out("Hello, World!");}}không hợp lệ.
Gaurang Tandon

1
Hoặc tương tự như vậy sẽ nhập HTML luôn bắt đầu với <!DOCTYPE html>tiếp theo là <html>, <body>và các thẻ khác (như meta) theo đúng thứ tự của họ?
Gaurang Tandon

Câu trả lời:


18

Định dạng văn bản 234 - Unix Shell

(không phải tất cả ngôn ngữ trong số chúng - tôi cần đếm chúng cẩn thận)

file $1

Tôi ngần ngại đăng câu trả lời hơi thông minh này - nhưng tôi không thấy bất cứ điều gì trong các quy tắc cấm nó và filetiện ích shell thực sự làm tốt công việc này. ví dụ:

$ 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
$ 

Hơn nữa, bạn có thể sử dụng -ktùy chọn để "tiếp tục" khi kiểm tra một polyglot:

 -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.)

Ngoài ra, -l tùy chọn sẽ cung cấp cho bạn ý tưởng về thuật toán tốt như thế nào đối với các ngôn ngữ khác nhau:

$ tập tin -l | vỏ grep
không xác định, 0: Cảnh báo: sử dụng tệp ma thuật thông thường `/ etc / magic '
Sức mạnh = 280: văn bản lưu trữ shell [application / octet-stream]
Sức mạnh = 250: Tập lệnh shell Tenex C có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 250: Tập lệnh shell Bourne-Again có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 240: Tập lệnh zsh của Paul Falstad có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 240: Tập lệnh tro của Neil Brown có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 230: Tập lệnh ae của Neil Brown có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 210: Tập lệnh shell Tenex C có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 210: Bourne-Again shell script có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 190: Tập lệnh shell Tenex C có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 190: Bourne-Again shell script có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 180: Tập lệnh zsh của Paul Falstad có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 150: Tập lệnh shell Tenex C có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 150: Tập lệnh shell Bourne-Again thực thi văn bản [text / x-shellscript]
Sức mạnh = 140: Tập lệnh shell C thực thi văn bản [text / x-shellscript]
Sức mạnh = 140: Tập lệnh shell Korn có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 140: Tập lệnh zsh của Paul Falstad có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 130: Tập lệnh shell POSIX có thể thực thi văn bản [text / x-shellscript]
Sức mạnh = 130: Kế hoạch 9 tập lệnh shell shell RC thực thi văn bản []
$ 

Đây là file-5.09(trên Ubuntu 12.04)


Điều này thực sự làm khá tốt trên một polyglot 16 ngôn ngữ - gist.github.com/riking/9088817
Đi xe đạp

Bạn cũng có thể cắt bỏ người trung gian và tránh hoàn toàn vỏ : ln -s /usr/bin/file /usr/local/bin/myspecialtool. Nếu câu trả lời của bạn được tính, thì điều này cũng không đúng? (Đừng lo lắng, tôi không nghiêm túc.)
hvd

2
Trông giống như một lỗ hổng tiêu chuẩn, tức là ủy thác giải pháp cho chương trình hiện có.
Vi.

10

Bash - về 50 35 byte cho mỗi ngôn ngữ có thể biên dịch

Thủ thuật là chỉ biên dịch, sau đó bạn không phải lo lắng về việc liên kết các lỗi từ các thư viện bị thiếu và sẽ dễ tha thứ hơn nếu bạn chỉ có đoạn mã.

Cảm ơn Shahbaz cho các hình thức ngắn hơn!

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)

v.v ...


Vì bạn đề cập đến số byte trên mỗi ngôn ngữ có thể biên dịch, bạn có thể quan tâm đến các dòng như:gcc -c $1 && (echo C; exit 0)
Shahbaz

Cảm ơn bạn, tôi không giỏi lắm trong việc ép mã!

Chắc chắn rồi. Các &&||trong bash là thực sự hữu ích và giúp đỡ dọn dẹp mã rất nhiều. Chúng không có nghĩa là được sử dụng để che giấu, vì vậy bạn sẽ học tốt chúng.
Shahbaz

2
Bạn cũng có thể vượt qua -fsyntax-onlyđể chỉ kiểm tra cú pháp và bỏ qua quá trình biên dịch thực tế.
peppe

7

18 ngôn ngữ lập trình, 1002 byte, độ chính xác: tự kiểm tra :)

(vâng tôi biết đây không phải là môn đánh gôn, nhưng vì sự thú vị của nó)

Chương trình tìm kiếm các đoạn mã biểu tượng, các kiểm tra được sắp xếp theo cách kiểm tra rõ ràng nhất ở trên cùng và các ngôn ngữ lập trình được nhúng trong các ngôn ngữ lập trình khác ở bên dưới (ví dụ HTML trong PHP).

Điều này rõ ràng là thất bại cho các chương trình như 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

Sử dụng trên nút: coffee timwolla.coffee < Example.java

Bản trình diễn (Bản trình diễn trực tuyến trên 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

Trên máy tính của tôi, kết quả này không có gì, ngay cả trên đầu vào rõ ràng sẽ hoạt động. Cấp, tôi có thể làm điều gì đó sai vì tôi chưa bao giờ sử dụng Coffeescript trước đây.
bến tàu

@marinus Lưu ý rằng khi nhập mã thủ công, bạn cần gửi EOF (STRG + D) để kích hoạt thực thi. Nói chung: Máy dò ít nhất nên nhổ ra ba dấu hỏi.
TimWolla

Không có gì. Tôi có cần phải vượt qua coffeebất kỳ đối số? Tôi vừa thử chuyển hướng các tập tin vào nó, nhưng chỉ chạy nó và sẽ ^Dkhông làm gì cả.
bến tàu

@marinus Hãy thử: npm install coffee-script && node_modules/.bin/coffee timwolla.coffee < timwolla.coffeetrong một thư mục tạm thời, điều này sẽ nhổ ra APL. (giả sử bạn đã cài đặt phiên bản nút và
npm

5
Tôi sẽ bắt đầu sử dụng omega chữ thường nhiều hơn trong các chương trình không phải APL của mình.
John Dvorak

4

Câu trả lời này là một bằng chứng về khái niệm, mà sẽ không có khả năng nhận thêm bất kỳ công việc nào từ bản thân tôi.

Nó rơi ngắn theo nhiều cách:

  • Đầu ra không chính xác như các yêu cầu câu hỏi, nhưng đủ gần và có thể dễ dàng được sửa đổi để tạo ra đầu ra chính xác cần thiết.
  • Có một số cách để làm cho mã hoạt động tốt hơn và / hoặc tốt hơn để biểu diễn các cấu trúc dữ liệu.
  • và hơn thế nữa

Ý tưởng là thiết lập một danh sách các từ khóa / ký tự / cụm từ có thể xác định một ngôn ngữ cụ thể và gán điểm cho từ khóa đó cho mỗi ngôn ngữ. Sau đó kiểm tra (các) tệp nguồn cho các từ khóa này và kiểm tra điểm số cho từng ngôn ngữ mà bạn tìm thấy từ khóa. Cuối cùng, ngôn ngữ có số điểm cao nhất là người chiến thắng. Điều này cũng phục vụ cho các chương trình polyglot vì cả hai (hoặc tất cả) các ngôn ngữ có liên quan sẽ đạt điểm cao.

Điều duy nhất để thêm nhiều ngôn ngữ là xác định "chữ ký" của chúng và thêm chúng vào ánh xạ.

Bạn cũng có thể chỉ định các điểm khác nhau cho các từ khóa khác nhau cho mỗi ngôn ngữ. Ví dụ: nếu bạn cảm thấy volatileđược sử dụng nhiều hơn trong Java so với C, hãy đặt điểm cho volatiletừ khóa thành 2 cho Java và 1 cho 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

Chỉ cần một vài khái quát rộng rãi.

Tôi nghĩ nó khá chính xác.

Đây là Ruby btw. Đưa đầu vào (multiline) từ 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

Tôi sẽ nghĩ rằng #include là một công cụ dự đoán tốt hơn cho c. Còn #! / Bin / (ba)? Sh cho các tập lệnh bash / shell thì sao?
Chấn thương kỹ thuật số

@DigitalTrauma Yea, tôi nghĩ bạn đúng về #include. Vì lý do nghệ thuật, tôi sẽ không chỉ bắt băm trong đó tên của ngôn ngữ được viết rõ ràng tho.
daniero

#include là một nhận xét trong inicác tệp vàphp
Ismael Miguel

1
+1 để có prolog, nhưng không có C :)
SztupY

1
Tôi sẽ thêm \$\w+vào sau một perl để phát hiện PHP. Cũng (\w+)::~\1thường là một kẻ hủy diệt C ++
SztupY

2

Javascript - 6 ngôn ngữ - độ chính xác cao

Ngôn ngữ hiện tại: Java, C, HTML, PHP, CSS, Javascript

Tôi làm việc theo nguyên tắc rằng bất cứ khi nào một đầu vào thỏa mãn một tiêu chí, nó sẽ được cho điểm và dựa trên kết quả điểm số đó được đưa ra.

Tính năng, đặc điểm:

  • Không có chức năng tích hợp xác định loại ngôn ngữ được sử dụng.
  • Không ngay lập tức tuyên bố văn bản đầu vào là xngôn ngữ khi nhìn thấy một từ khóa.
  • Đề xuất các ngôn ngữ có thể khác cũng có.

Nếu bạn cảm thấy rằng bất kỳ đầu vào nào của chương trình (mà tôi đã thực hiện cho đến bây giờ) không bị bắt hoặc nhận kết quả không hợp lệ, vui lòng báo cáo và tôi rất vui lòng sửa chúng.

Mẫu đầu vào 1:

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

Mẫu đầu ra 1:

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

Giải trình:

Điều này đáng lẽ đã làm chương trình thất bại và tôi đã in PHP, nhưng vì chương trình của tôi hoạt động dựa trên điểm số, không có gì thất bại và nó dễ dàng xác định Java ngay từ đầu, sau đó là các kết quả có thể khác.

Mẫu đầu vào 2:

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

Mẫu đầu ra 2:

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

Mẫu đầu vào 3:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

Mẫu đầu ra 3:

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

Mật mã:

// 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("----------------");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.