Визначте, якою мовою програмування є фрагмент


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!");}}недійсними.
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опція дасть вам уявлення про те, наскільки хороший алгоритм для різних мов:

$ файл -l | греп-шкаралупа
невідомо, 0: Попередження: використання звичайного магічного файлу `/ etc / magic '
Сила = 280: текст архіву оболонки [додаток / октет-потік]
Сила = 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: Виконаний текст сценарію оболонки 9 оболонок плану []
$ 

Це file-5.09(на Ubuntu 12.04)


Це насправді добре працює на 16-мовному поліглоті - gist.github.com/riking/9088817
Рікінг

Ви могли б також вирізати середньої людини і уникнути оболонки повністю: 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)
Шахбаз

Дякую, я не дуже добре кодуюся!

Звичайно. &&І ||в Баш дійсно корисні і допомогти 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 Спробуйте: 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

Всього кілька широких узагальнень.

Я думаю, що це досить точно.

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

@DigitalTrauma Так, я думаю, ти маєш рацію щодо #include. З художніх міркувань я не збираюся просто ловити хеш-баг, де назва мови чітко прописана Тхо.
daniero

#include - коментар до iniфайлів іphp
Ісмаель Мігель

1
+1 за те, що у вас є пролог, але немає С :)
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.