Угадай язык


23

Введение

Этот сайт быстро создает огромный набор фрагментов кода, поэтому давайте с этим что-нибудь сделаем!

Вот файл данных . Он содержит 9 066 уникальных пар «язык + фрагмент» для 113 языков, взятых с этого сайта. Формат разделен табуляцией (language-TAB-snippet), все новые строки в фрагментах заменены на <LF>, а все вкладки заменены на 4 пробела. Для каждого языка есть как минимум 5 фрагментов.

[обновление: я внес небольшое изменение в файл данных, чтобы объединить некоторые версии Python и RegExp, которые я пропустил раньше - ссылка выше была обновлена]

Вызов

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

правила

  • Общий размер вашего исходного кода, ресурсов и любых необходимых флагов компиляции / времени выполнения не должен превышать 300 байт.
  • Ваш ответ будет проверен на соответствие указанному выше набору данных; ему будет дано одно из значений «фрагмента» в качестве входных данных, и его выходные данные будут сравниваться с «правильными» выходными данными в соответствии с набором данных. Это будет повторяться для всех записей в наборе данных, и последним числом правильных ответов будет ваш счет.
  • Вы можете выбрать входную кодировку - я предполагаю UTF-8, поэтому, если вам нужна другая кодировка, укажите ее в своем ответе.
  • Вам не нужно использовать <LF>замену для новых строк; если ваша запись ожидает получения новых строк в виде буквальных новых строк (символ 10), укажите это в своем ответе.
  • Ваша запись должна выводить язык, на котором она думает, что входной фрагмент написан. Чтобы избежать необходимости сжимать множество языковых строк, я разрешу сопоставления (если вы хотите вывести 3 для «Java», это нормально); просто отметьте соответствия в своем ответе.
  • Вы можете иметь только 1 выходное отображение для каждого языка (то есть, если 3 означает «Java», вы также не можете иметь 4, означающее «Java»).
  • Когда у вас есть собственный исходный код, ваша программа должна дать правильный ответ (вывести язык, на котором она написана).
  • Вам не нужно поддерживать все языки в наборе данных, и вы можете поддерживать дополнительные языки, если хотите (например, если ваша запись не на одном из языков в наборе данных).
  • Ваша программа должна быть детерминированной (при условии, что один и тот же ввод дважды должен давать один и тот же вывод).

Ничьи

  • Связи будут решаться путем уменьшения набора данных до тех пор, пока не победит одна запись. Набор данных будет сокращен путем удаления всех фрагментов для самого популярного языка (т. Е. Связи на более редких языках прерываются). Например, если A и B набрали 70% для полного набора данных, все фрагменты Python будут удалены. Если A и B теперь набрали 60%, CJam будет удален. Если теперь А набирает 50%, а В набирает 55%, победителем становится В.
  • Если достигается 100% -ная точность, связи будут решаться с использованием второго (слепого) набора данных, содержащего больше образцов для тех же языков.

Пример 1

Скрипт Python:

print("python")

Этот скрипт успешно создает «python», когда ему присваивается собственный исходный код, поэтому он действителен. В наборе данных он набрал 1008/9066 = 11,1%

Пример 2

Функция JavaScript:

function f(s){return /function/.test(s)?1:2}

С отображениями 1 → javascript, 2 → python. Опять же, он успешно производит 1 («javascript») для своего собственного источника, и в наборе данных он набирает 1092/9066 = 12,0%


Откуда поступили данные?

Я создал запрос SEDE, чтобы извлечь примеры из задач [code-golf] на этом сайте. Из полученных 10 000 ответов я использовал взломанный скрипт Python, чтобы найти код и название языка для каждого, а затем отфильтровал любой язык с менее чем 5 примерами. Данные не на 100% чистые (я знаю, что есть некоторые фрагменты без кода), но они должны быть достаточно хорошими.


Вдохновленный этим вызовом в начале года: кто это сказал? Президентские выборы 2016

Также частично связано с тем , что язык?


3
Кажется невероятно сложным сделать в 300 байтов. Возможно выделить больше байтов?
Рохан Джунджхунвала

1
@RohanJhunjhunwala да, я думаю, это будет довольно сложно! Я не ожидаю, что кто-то получит 100% точность; задача состоит в том, чтобы подняться как можно выше. В "кто это сказал?" Задача, с которой я столкнулся, достигла максимума с точностью ~ 30%. Я пытался установить ограничение байтов, чтобы здесь было возможно 50–70%. Надеюсь, я получил правильный баланс. Конечно, если вы найдете отличное решение, которое использует больше байтов, опубликуйте его! Это просто не будет конкурировать (вы можете сократить его для конкурирующей версии).
Дейв

Вы удалили полиглоты из набора данных, или это будут просто "ошибки"?
Geobits

9
Будет так сложно отличить гольф-клубы ...
busukxuan

2
Интересные факты: 20 наиболее часто используемых (по крайней мере, в вашем наборе данных) языков составляют 81% вашего набора данных, а 10 наиболее часто используемых - 61%. Даже для выявления различий между Javascript, Pyth, CJam и Python достаточно получить около 35%.
helloworld922

Ответы:


17

C, 297 байтов, 43,194351% соответствия (v2)

Это первая задача, не связанная с игрой в гольф, в которой я участвовал. Удивительно, но языки игры в гольф на самом деле довольно легко разделить, с точностью совпадения около 60% на язык.

Код требует ввода в виде строки UTF-8, результаты основаны на версии 2 предоставленного набора данных. Этот код не требует <LF>замены реальными символами новой строки.

#define S(x)!!strstr(p,#x)
f(char*p){return S(#d)?:S(voi)?0:S(mai)|S(utc)?:S(mbd)|S(impor)|S(input)|S(def)|S(rang)?2:S(log)|S(fun)|S(=>)|S(lert)?3:S(<?)?4:S(echo)|S(sed)?5:S(+++)?6:S(<-)?7:S($_)|S(say)?8:S(\342)|S(\303)?9:S(->)|S(map)?10:S(@#)|S(]])|S([#)?11:S(V)|S(Q)?12:S(Z)|S(Y)?13:S(.)?14:15;}

Картографическая таблица:

 0. java
 1. c
 2. python
 3. javascript
 4. php
 5. bash
 6. brainf*
 7. haskell
 8. perl
 9. apl
10. ruby
11. wolfram
12. pyth
13. matl
14. golfscript
15. cjam

Процент основан на моих расчетах / общем подсчете: 3916 просмотров / 9066 всего.


Отличное начало; это было быстро! Что касается «Моего тестового кода и текстового редактора, то по какой-то причине посмотрите 9068 записей вместо 9065» - вы пропустили заголовки и пустую строку в конце? Это будет составлять 2 дополнительные строки.
Дейв

Сожалею; это не соответствует правилу № 7 (должен выводить правильный ответ для собственного исходного кода): сейчас он говорит 0, что является Python (я предполагаю, что не было бы слишком много работы, чтобы переупорядочить проверки, чтобы это исправить)
Дейв

Вы можете потерять место после define S(x)и 1, где у вас есть ?1.
feersum

Благодарность! Я не знал об этом ?1трюке и забыл о другом. ;-)
owacoder

Ничего себе, это спокойно улучшается! Проверено последние 43,19% :)
Дейв

2

Python 3, 271 278 байт, сопоставлено 25,049636% (версия 2, непроверенная)

def f(c):
 try:compile(c,'','exec');return 5
 except:
  for j in range(9):
   if any(l in c for l in [['echo'],['require'],['Main','string'],['document','alert','var ','function'],['String'],['def ','lambda','print '],['main','int','char'],['+++','<<<'],[]][j]):break
 return j

карта:

0 = bash
1 = ruby
2 = c#
3 = javascript
4 = java
5 = python
6 = c
7 = brainf*
8 = cjam

намного лучше в гольфе (вероятно, все еще не очень), наконец преодолел 25% барьер! Входы <LF>заменили на новую строку ( \n)


Мне нравится execпопытка. Кстати, вам разрешено запрашивать <LF>предварительную замену входных данных \n, поэтому вы можете сохранить там несколько байтов, чтобы потенциально добавить дополнительную настройку.
Дейв

Наконец дошли руки до проверки этого. Я только вижу 2103 (23,19%) по какой-то причине - есть идеи, почему разница?
Дейв

хммм ... я не уверен. Возможно, это связано с тем, как вы вносите свой вклад? Я использую decode('utf-8')для преобразования необработанного входного байтового массива в собственную строку Python 3 unicode (utf-16?) Перед передачей его в мою функцию.
helloworld922

Ах хорошо. Может быть проблема с кодировкой; Я просто полагаюсь на то, что fileinput.input () делает скрытно. Я буду расследовать.
Дейв
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.