스 니펫이 어떤 프로그래밍 언어인지 감지


23

문제는 일부 소스 코드를 입력으로 사용하여 작성된 프로그래밍 언어를 출력하는 것입니다.

예를 들어, 입력을 가질 수 있습니다

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

그리고 출력

Java

두 가지 주요 목표는 다양성 (감지 할 수있는 프로그래밍 언어 수)과 정확성 (이러한 언어 감지 수준)입니다.

폴리 글 로트 (여러 언어로 유효한 프로그램)의 경우 수행 할 작업을 결정할 수 있습니다. 프로그램이 생각하는 언어를 더 많이 출력하거나 오류를 출력하거나 가능한 선택 항목을 출력 할 수 있습니다 (아마도 오류보다 더 많은지지를받을 수 있습니다).

이것은 다른 객관적인 승리 기준을 지정하기가 매우 어렵 기 때문에 입니다. 유권자들은 얼마나 많은 언어를 감지하고 정확한지 투표하십시오.


그것은 불가능합니다. 원인 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 텍스트 형식-유닉스 쉘

(모든 언어가 아님-신중하게 계산해야 함)

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옵션을 사용하면 언어가 다른 언어에 대해 알고리즘이 얼마나 유용한 지 알 수 있습니다.

$ 파일 -l | grep shell
unknown, 0 : 경고 : 일반 매직 파일`/ etc / magic '사용
강도 = 280 : 쉘 아카이브 텍스트 [application / octet-stream]
강도 = 250 : Tenex C 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 250 : Bourne-Again 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 240 : Paul Falstad의 zsh 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 240 : Neil Brown 's ash 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 230 : Neil Brown의 ae 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 210 : Tenex C 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 210 : Bourne-Again 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 190 : Tenex C 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 190 : Bourne-Again 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 180 : Paul Falstad의 zsh 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 150 : Tenex C 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 150 : Bourne-Again 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 140 : C 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 140 : Korn 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 140 : Paul Falstad의 zsh 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 130 : POSIX 쉘 스크립트 텍스트 실행 파일 [text / x-shellscript]
강도 = 130 : 계획 9 rc 쉘 스크립트 텍스트 실행 파일 []
$ 

이것은 file-5.09(우분투 12.04에)


이것은 실제로 16- 언어 폴리 글 로트
Riking

중간 사람을 잘라내어 껍질을 완전히 피할 수도 있습니다 ln -s /usr/bin/file /usr/local/bin/myspecialtool. 당신의 대답이 중요하다면 이것도 중요하지 않습니까? (걱정하지 마십시오, 난 심각하지 않습니다.)
hvd

2
표준 허점, 즉 기존 프로그램에 솔루션을 위임하는 것처럼 보입니다.
Vi.

10

배쉬 — 50 컴파일 가능한 언어 당 35 바이트

Trick은 컴파일 만하면 누락 된 라이브러리로 인한 링크 오류에 대해 걱정할 필요가 없으며 코드 스 니펫 만 있으면 더 용서할 수 있습니다.

짧은 형식의 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

고마워요, 나는 코드를 짜내는 데별로 좋지 않습니다!

확실한. &&||bash는 코드 많은 정말 유용하고 도움을 정리에게 있습니다. 그것들은 난독 화에 결코 사용되지 않으므로 배우는 것이 좋습니다.
Shahbaz

2
-fsyntax-only구문 만 확인하고 실제 컴파일을 건너 뛰 도록 전달할 수도 있습니다 .
peppe

7

18 개의 프로그래밍 언어, 1002 바이트, 정확성 : 직접 테스트 :)

(그래도 이것이 코드 골프가 아니라는 것을 알고 있습니다.)

이 프로그램은 상징적 코드 스 니펫을 검색하며, 가장 명확한 검사가 최상위에 있고 다른 프로그래밍 언어에 포함 된 프로그래밍 언어는 다음과 같습니다 (예 : PHP의 HTML).

이것은 분명히 다음과 같은 프로그램에서 실패합니다. 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 February

@marinus 코드를 수동으로 입력 할 때는 EOF (STRG + D)를 보내 실행을 트리거해야합니다. 일반적으로 : 검출기는 최소한 3 개의 물음표를 뱉어야합니다.
TimWolla

아뇨. coffee인수 를 전달해야 합니까? 방금 파일을 리디렉션하려고 시도했지만 파일을 실행하고 ^D아무것도하지 않습니다.
marinus February

@marinus Try : npm install coffee-script && node_modules/.bin/coffee timwolla.coffee < timwolla.coffee임시 폴더에 뱉어 져야합니다 APL. (최신 버전의 노드와 npm이 설치되어 있다고 가정)
TimWolla

5
APL이 아닌 프로그램에서 소문자 오메가를 더 많이 사용하기 시작합니다.
John Dvorak

4

이 답변은 개념 증명이며 더 이상 나 자신으로부터 더 이상의 작업을받지 못할 것입니다.

여러 가지면에서 부족합니다.

  • 결과는 질문이 요구하는 것과 정확히 일치하지 않지만 충분히 가깝고 필요한 정확한 출력을 생성하도록 쉽게 수정할 수 있습니다.
  • 코드가 데이터 구조를 나타내는 더 나은 방법 및 / 또는 더 나은 방법으로 만드는 몇 가지 방법이 있습니다.
  • 그리고 더

아이디어는 특정 언어를 식별하고 각 언어에 대해 해당 키워드에 점수를 할당 할 수있는 키워드 / 문자 / 구문 목록을 설정하는 것입니다. 그런 다음 해당 키워드의 소스 파일을 확인하고 키워드를 찾은 각 언어의 점수를 집계하십시오. 결국 가장 높은 점수를받은 언어가 승자가 될 것입니다. 또한 관련 언어가 모두 높은 점수를 주므로 폴리 글롯 프로그램을 제공합니다.

더 많은 언어를 추가 할 수있는 유일한 것은 "서명"을 식별하고 매핑에 추가하는 것입니다.

언어별로 다른 키워드에 다른 점수를 지정할 수도 있습니다. 예를 들어, volatileC보다 Java에서 더 많이 사용 된다고 생각되면 volatile키워드 점수를 Java의 경우 2, C의 경우 1로 설정하십시오 .

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에 대한 더 나은 예측 자라고 생각합니다. bash / shell 스크립트의 경우 #! / bin / (ba)? sh는 어떻습니까?
Digital Trauma

@DigitalTrauma Yea, 당신이 #include에 대해 맞다고 생각합니다. 예술적인 이유로 나는 언어의 이름이 명쾌하게 쓰여진 해시 뱅을 잡을 생각이 없다.
daniero

#include는 ini파일에 대한 주석 이며php
Ismael Miguel

1
프롤로그가 있지만 +1이 아닌 +1 :
SztupY

1
\$\w+PHP를 감지하기 위해 perl을 추가 합니다. 또한 (\w+)::~\1보통 C ++ 소멸자입니다
SztupY

2

자바 스크립트-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.