Определите, какой язык программирования является фрагментом


23

Ваша задача - взять исходный код и вывести на каком языке программирования он написан.

Например, вы могли бы иметь вход

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

И вывод

Java

Ваши две основные цели - это разнообразие (сколько языков программирования вы можете обнаружить) и точность (насколько вы хороши в обнаружении этих языков).

Для полиглотов (программ, работающих на нескольких языках), вы можете решить, что делать. Вы могли бы просто вывести язык, который ваша программа считает более вероятным, или вы могли бы вывести ошибку, или вы могли бы вывести массив возможных вариантов (который, вероятно, получил бы больше голосов, чем просто ошибка!).

Это , потому что было бы очень трудно определить другой объективный критерий выигрыша. Избиратели, пожалуйста, оцените, сколько языков он может определить и насколько он точен.


Это невозможно, причина print("")может быть использована во многих языках.
Исмаэль Мигель

1
С вашим редактированием, теперь это кажется более возможным.
Исмаэль Мигель

4
А как насчет языков, которые действительны для КАЖДОГО ввода? Как пробел. Это предложение является допустимой программой для пробелов. Вся эта страница является действительной программой для пробелов.
Исмаэль Мигель

1
Гарантируется, что ввод является действительной программой? Как некоторые входные данные могут быть class A{public static void main(String[]a){System.println.out("Hello, World!");}}недействительными.
Гауранг Тандон

1
Или также будет вводить HTML всегда начинается с <!DOCTYPE html>сопровождаемой <html>, <body>и другими тегами (как meta) в правильном порядке?
Гауранг Тандон

Ответы:


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 shell
unknown, 0: Внимание: используется обычный магический файл `/ etc / magic '
Сила = 280: текст архива оболочки [application / octet-stream]
Сила = 250: Текстовый исполняемый файл сценария оболочки Tenex C [text / x-shellscript]
Сила = 250: Исполняемый текст сценария оболочки Bourne-Again [text / x-shellscript]
Сила = 240: Исполняемый текст сценария zsh Пола Фальстада [text / x-shellscript]
Сила = 240: Исполняемый текст сценария пепла Нила Брауна [text / x-shellscript]
Сила = 230: Текстовый исполняемый файл сценария Нила Брауна [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: Исполняемый файл сценария 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: Исполняемый текст сценария zsh Пола Фальстада [text / x-shellscript]
Сила = 130: Текстовый исполняемый файл сценария оболочки POSIX [text / x-shellscript]
Сила = 130: Plan 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 байт на компилируемый язык

Хитрость заключается в том, чтобы просто скомпилировать, тогда вам не нужно беспокоиться о связывании ошибок из отсутствующих библиотек, и это более простительно, если у вас просто есть фрагменты кода.

Спасибо Шахбазу за короткие формы!

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

Спасибо, я не очень хорошо умею сжимать код!

Конечно. &&И ||в Баш действительно полезны и помочь Cleanup код много. Они ни в коем случае не используются для запутывания, поэтому вы бы хорошо их выучили.
Шахбаз

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.
Джон Дворжак

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

Всего несколько широких обобщений.

Я думаю, что это довольно точно.

Это Руби, кстати. Принимает (многострочный) ввод со стандартного ввода.

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?
Цифровая травма

@DigitalTrauma Да, я думаю, ты прав насчет #include. По художественным соображениям я не собираюсь просто поймать хэш-бэнг, где название языка четко прописано.
Даниеро

#include - это комментарий в iniфайлах иphp
Исмаэль Мигель

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("----------------");
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.