Вгадайте мову


23

Вступ

Цей сайт швидко збирає величезний набір фрагментів коду, тому давайте щось зробимо з ним!

Ось файл даних . Він містить 9 066 унікальних мов + фрагменти пар для 113 мов, усі взяті з цього сайту. Формат розділений на вкладки (мова-TAB-фрагмент), всі нові рядки у фрагментах замінені на <LF>, а всі вкладки замінені на 4 пробіли. Є щонайменше 5 фрагментів для кожної мови.

[оновлення: я змінив файл даних, щоб об'єднати деякі версії Python & RegExp, які я пропустив раніше - посилання вище було оновлено]

Виклик

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

Правила

  • Загальний розмір вашого вихідного коду, ресурсів та будь-яких потрібних прапорів компіляції / виконання не повинен перевищувати 300 байт.
  • Ваша відповідь буде перевірена на наборі даних вище; йому буде надано одне із значень "Snippet" як вхідне, а його вихід буде порівнюватися з "правильним" висновком відповідно до набору даних. Це повториться для всіх записів у наборі даних, а остаточна кількість правильних відповідей - ваш результат.
  • Ви можете вибрати вхідне кодування - я припускаю UTF-8, тому, якщо вам потрібно інше кодування, вкажіть його у своїй відповіді.
  • Вам не потрібно використовувати <LF>заміну для нових рядків; якщо ваш запис очікує отримання нових рядків у прямому сенсі (графік 10), вкажіть це у своїй відповіді.
  • У вашому записі має бути виведена мова, на яку він вважає написаний фрагмент вводу. Щоб уникнути необхідності стискати багато мовних рядків, я дозволю відображення (Якщо ви хочете вивести 3 для "Java", це добре); просто відзначте відображення у своїй відповіді.
  • Ви можете мати лише 1 вихідне відображення для кожної мови (тобто, якщо 3 означає "Java", ви також не можете мати 4 значення "Java").
  • Якщо вам надано власний вихідний код, ваша програма повинна створити правильну відповідь (повинна виводити мову, на якій вона написана).
  • Вам не потрібно підтримувати всі мови в наборі даних, і ви можете підтримувати додаткові мови, якщо ви хочете (наприклад, якщо ваш запис не є однією з мов набору даних).
  • Ваша програма повинна бути детермінованою (якщо один і той же вхід двічі повинен давати однаковий результат).

Розв'язування

  • Зв'язки будуть вирішені шляхом зменшення набору даних, поки не виграє один запис. Набір даних буде зменшено, видаливши всі фрагменти для найпопулярнішої мови (тобто зв'язки порушені точністю на більш рідкісних мовах). Наприклад, якщо A і B набрати 70% на повний набір даних, всі фрагменти Python будуть видалені. Якщо A і B зараз набрали 60%, CJam буде видалений. Якщо А зараз набирає 50%, а B - 55%, B - переможець.
  • Якщо досягається 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] на цьому сайті. З отриманих 10000 відповідей я використав сценарій зламаного python для пошуку коду та назви мови для кожного, а потім відфільтрував будь-яку мову з менш ніж 5 прикладами. Дані не на 100% чисті (я знаю, що деякі фрагменти, що не кодуються), але вони мають бути досить хорошими.


Натхненний цим викликом з початку року: Хто це сказав? 2016 президентські вибори

Також частково пов’язане з Що таке мова?


3
Здається, це зробити надзвичайно складно в 300 байтах. Можливо, виділіть більше байтів?
Rohan Jhunjhunwala

1
@RohanJhunjhunwala так, я думаю, це буде досить складною проблемою! Я не сподіваюся, що хтось отримає 100% точність; виклик - піднятися якомога вище. У "хто це сказав?" Проблема, з якою я пов'язаний, всі ми досягли точності ~ 30%. Я намагався встановити обмеження в байті так, щоб тут було можливим 50–70%. Сподіваюсь, я отримав баланс правильно. Звичайно, якщо ви знайдете чудове рішення, яке використовує більше байтів, опублікуйте його! Він просто не буде конкурувати (ви можете скоротити його для конкуруючої версії).
Дейв

Ви видалили поліглоти з набору даних, чи це просто "gotchas"?
Геобіт

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% збігається (v2, неперевірене)

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')для перетворення необробленого вхідного байтового масиву в нативну рядок Unicode (utf-16?) Python 3, перш ніж передати його своїй функції.
helloworld922

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