言語を推測する


23

前書き

このサイトはコードスニペットの巨大なデータセットを急速に構築しているので、それで何かをしましょう!

これがデータファイルです。このサイトから取得した113言語の9,066の一意の言語とスニペットのペアが含まれています。形式はタブで区切られ(language-TAB-snippet)、スニペットのすべての改行がに置き換えられ<LF>、すべてのタブが4つのスペースに置き換えられます。各言語には少なくとも5つのスニペットがあります。

[更新:以前見逃していたPythonとRegExpのいくつかのバージョンをマージするために、データファイルに小さな変更を加えました-上記のリンクが更新されました]

チャレンジ

コードスニペットを取得し、記述された言語を出力するプログラムまたは関数を作成します(詳細については以下を参照)。ソース+必要なデータの合計サイズは300バイト以下である必要があり、プログラム独自のソースコードが与えられたときに正しい言語を出力する必要があります。最高の精度(上記のデータセットで最も正解)が優先されます。

ルール

  • ソースコード、リソース、および必要なコンパイル/ランタイムフラグの合計サイズは300バイトを超えてはなりません。
  • 回答は上記のデータセットに対してテストされます。入力として「スニペット」値の1つが与えられ、その出力がデータセットに従って「正しい」出力と比較されます。これはデータセット内のすべてのエントリに対して繰り返され、正解の最終的な数がスコアになります。
  • 入力エンコーディングを選択できます。UTF-8を想定していますので、別のエンコーディングが必要な場合は回答で指定してください。
  • <LF>改行に代わるものを使用する必要はありません。エントリがリテラル改行(char 10)として改行を受け取ることを期待している場合は、回答でそれを指定します。
  • エントリは、入力スニペットが記述されていると思われる言語を出力する必要があります。多くの言語文字列を圧縮する必要を避けるため、マッピングを許可します(「Java」の3を出力する場合は問題ありません)。回答のマッピングに注意してください。
  • 各言語に対して1つの出力マッピングのみを使用できます(つまり、3が「Java」を意味する場合、4は「Java」を意味することもできません)。
  • 独自のソースコードを与えられたとき、あなたのプログラムがなければなりません正解(必須出力は、記述されている言語)を生成します。
  • データセット内のすべての言語をサポートする必要はありません。必要に応じて、追加の言語をサポートできます(たとえば、エントリがデータセット内の言語のいずれでもない場合)。
  • プログラムは確定的である必要があります(同じ入力を2回提供すると、同じ出力が生成される必要があります)。

タイブレーク

  • 関係は、1つのエントリが勝つまでデータセットを減らすことによって決定されます。データセットは、最も一般的な言語のすべてのスニペットを削除することで削減されます(つまり、まれな言語の精度によって関係が壊れます)。たとえば、完全なデータセットでAとBのスコアが70%の場合、すべてのPythonスニペットが削除されます。AとBの両方が60%を獲得した場合、CJamは削除されます。Aのスコアが50%で、Bのスコアが55%の場合、Bが勝者です。
  • 100%の精度が達成された場合、同じ言語のより多くのサンプルを含む2番目の(ブラインド)データセットを使用して、同順位が決定されます。

例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%のスコアが付けられます。


データはどこから来たのですか?

このサイトの[code-golf]チャレンジからサンプルを取得するSEDEクエリを作成しました。結果の10,000件の回答から、ハッキングされたpythonスクリプトを使用してそれぞれのコードと言語名を見つけ、5つ未満の例ですべての言語を除外しました。データは100%クリーンではありませんが(プルしたコード以外のスニペットがあることは知っています)、十分に良いはずです。


今年の初めからこの課題に触発された:誰が言ったの?2016年大統領選挙

一部は言語とは何か?


3
300バイトで行うのは非常に難しいようです。おそらくより多くのバイトを割り当てますか?
ローハンジュンジュンワラ

1
@RohanJhunjhunwalaはい、それはかなりの挑戦になると思います!ただし、100%の精度が得られるとは期待していません。課題は、可能な限り高くすることです。「誰が言ったの?」私がリンクした課題は、すべてピーク時で最大30%の精度でした。ここで50〜70%が可能になるように、バイト制限を設定しようとしました。うまくいけば、バランスが取れた。もちろん、より多くのバイトを使用する優れたソリューションを見つけた場合は、投稿してください!競合することはありません(競合するバージョンに切り詰めることができます)。
デイブ

データセットからポリグロットを削除しましたか、それとも単に「落とし穴」になりますか?
ジオビット

9
Golflangsを区別するのはとても難しいだろう
...-busukxuan

2
興味深い事実:(少なくともデータセットで)最もよく使用される20の言語がデータセットの81%を占め、最も一般的に使用される10の言語が61%を占めています。Javascript、Pyth、CJam、およびPythonの違いを検出するだけでも、約35%を取得できます。
helloworld922

回答:


17

C、297バイト、43.194351%一致(v2)

これは私が競技した最初のゴルフ以外のチャレンジです。驚くべきことに、ゴルフ言語は実際には言語ごとに約60%の一致精度で分離するのがかなり簡単です。

コードには、提供されるデータセットのバージョン2に基づく結果であるUTF-8文字列としての入力が必要です。このコード<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合計。


素晴らしいスタートを切りましょう。早かった!「テストコードとテキストエディターには、何らかの理由で9065ではなく9068のエントリが表示されます」については、ヘッダーと最後の空白行をスキップしましたか?それは2行余分になります。
デイブ

ごめんなさい; これはルール#7を通過していません(独自のソースコードに対して正しい答えを出力する必要があります):今はPythonである0と表示されます
デイブ

後のスペース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')未処理の入力バイト配列を、関数に渡す前にネイティブのPython 3ユニコード(utf-16?)文字列に変換するために使用します。
helloworld922

ああ エンコードの問題である可能性があります。fileinput.input()が内部で行うものに依存しています。調査します。
デイブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.