Tebak bahasanya

23

pengantar

Situs ini dengan cepat membangun kumpulan besar potongan kode, jadi mari kita lakukan sesuatu dengannya!

Ini file data . Ini berisi 9.066 pasangan + potongan bahasa unik untuk 113 bahasa, semua diambil dari situs ini. Formatnya dipisahkan tab (bahasa-TAB-snippet), dengan semua baris baru di snippet diganti <LF>, dan semua tab diganti dengan 4 spasi. Setidaknya ada 5 cuplikan untuk setiap bahasa.

[pembaruan: Saya telah membuat sedikit perubahan pada file data untuk menggabungkan beberapa versi Python & RegExp yang saya lewatkan sebelumnya - tautan di atas telah diperbarui]

Tantangan

Tulis sebuah program atau fungsi yang mengambil potongan kode dan mengeluarkan bahasa yang ditulisnya (lihat di bawah untuk perincian). Ukuran total sumber Anda + data apa pun yang Anda perlukan harus 300 byte atau kurang, dan program Anda harus menampilkan bahasa yang benar ketika diberi kode sumbernya sendiri. Akurasi tertinggi (jawaban paling benar pada dataset di atas) menang.

Aturan

  • Ukuran total kode sumber, sumber daya, dan flag kompilasi / runtime yang diperlukan tidak boleh melebihi 300 byte.
  • Jawaban Anda akan diuji terhadap dataset di atas; itu akan diberikan salah satu dari nilai "Snippet" sebagai input dan outputnya akan dibandingkan dengan output "benar" sesuai dengan dataset. Ini akan diulang untuk semua entri dalam dataset dan jumlah akhir dari jawaban yang benar adalah skor Anda.
  • Anda dapat memilih pengkodean input - Saya akan menganggap UTF-8, jadi jika Anda memerlukan pengkodean lain tentukan dalam jawaban Anda.
  • Anda tidak perlu menggunakan <LF>pengganti untuk baris baru; jika entri Anda mengharapkan untuk menerima baris baru sebagai baris baru literal (char 10), tentukan dalam jawaban Anda.
  • Entri Anda harus menampilkan bahasa yang menurutnya input snipet ditulis. Untuk menghindari perlunya mengompresi banyak string bahasa, saya akan mengizinkan pemetaan (Jika Anda ingin menampilkan 3 untuk "Java", itu bagus); catat saja pemetaan dalam jawaban Anda.
  • Anda hanya dapat memiliki 1 pemetaan output untuk setiap bahasa (yaitu jika 3 berarti "Java", Anda juga tidak dapat memiliki 4 arti "Java").
  • Ketika diberi kode sumbernya sendiri, program Anda harus menghasilkan jawaban yang benar (harus mengeluarkan bahasa yang tertulis di dalamnya).
  • Anda tidak perlu mendukung semua bahasa dalam dataset, dan Anda dapat mendukung bahasa tambahan jika Anda mau (mis. Jika entri Anda tidak dalam salah satu bahasa dalam dataset).
  • Program Anda harus deterministik (memberikan input yang sama dua kali harus menghasilkan output yang sama).

Tie-Breaking

  • Ikatan akan diputuskan dengan mengurangi dataset hingga satu entri menang. Dataset akan dikurangi dengan menghapus semua cuplikan untuk bahasa yang paling populer (mis. Ikatan terputus karena keakuratan pada bahasa yang lebih jarang). Misalnya, jika A dan B mencetak 70% pada dataset lengkap, semua snippet Python akan dihapus. Jika A dan B sekarang sama-sama skor 60%, CJam akan dihapus. Jika A sekarang skor 50% tetapi B skor 55%, B adalah pemenangnya.
  • Jika akurasi 100% tercapai, ikatan akan diputuskan menggunakan dataset kedua (buta) yang berisi lebih banyak sampel untuk bahasa yang sama.

Contoh 1

Skrip Python:

print("python")

Script ini berhasil menghasilkan "python" ketika diberi kode sumbernya sendiri, sehingga valid. Pada dataset, skornya 1008/9066 = 11,1%

Contoh 2

Fungsi JavaScript:

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

Dengan pemetaan 1 → javascript, 2 → python. Sekali lagi itu berhasil menghasilkan 1 ("javascript") untuk sumbernya sendiri, dan pada dataset skornya 1092/9066 = 12,0%


Dari mana data itu berasal?

Saya membuat kueri SEDE untuk menarik sampel dari tantangan [kode-golf] di situs ini. Dari 10.000 jawaban yang dihasilkan, saya menggunakan skrip python yang diretas bersama untuk menemukan kode & nama bahasa untuk masing-masing, kemudian menyaring semua bahasa dengan kurang dari 5 contoh. Data tidak 100% bersih (saya tahu ada beberapa cuplikan non-kode yang ditarik), tetapi harus cukup baik.


Terinspirasi oleh tantangan ini dari awal tahun: Siapa yang mengatakan itu? Pemilihan Presiden 2016

Juga sebagian yang terkait dengan What's the Language?

Dave
sumber
3
Tampaknya sangat menantang untuk dilakukan dalam 300 byte. Mungkin membagikan lebih banyak byte?
Rohan Jhunjhunwala
1
@RohanJhunjhunwala ya saya membayangkan itu akan menjadi tantangan yang cukup! Saya tidak mengharapkan siapa pun untuk mendapatkan akurasi 100%; tantangannya adalah untuk mendapatkan setinggi mungkin. Dalam "siapa yang mengatakan itu?" Tantangan yang saya tautkan, kita semua memuncak pada akurasi ~ 30%. Saya sudah mencoba untuk menetapkan batas byte sehingga 50-70% harus dimungkinkan di sini. Semoga keseimbangan saya benar. Tentu saja jika Anda menemukan solusi hebat yang menggunakan lebih banyak byte, kirimkan! Itu tidak akan bersaing (Anda dapat mengurangi itu untuk versi yang bersaing).
Dave
Sudahkah Anda menghapus polyglots dari dataset, atau apakah itu hanya akan menjadi "gotcha"?
Geobits
9
Ini akan sangat sulit untuk membedakan antara golflangs ...
busukxuan
2
Fakta menarik: 20 bahasa yang paling umum digunakan (setidaknya dalam dataset Anda) membentuk 81% dari dataset Anda, dan 10 bahasa yang paling umum digunakan adalah 61%. Bahkan hanya mendeteksi perbedaan antara Javascript, Pyth, CJam, dan Python sudah cukup untuk mendapatkan sekitar 35%.
helloworld922

Jawaban:

17

C, 297 byte, 43.194351% cocok (v2)

Ini adalah tantangan non-golf pertama yang saya ikuti. Secara mengejutkan, bahasa golf sebenarnya agak mudah dipisahkan, dengan akurasi pencocokan sekitar 60% per bahasa.

Kode membutuhkan input sebagai string UTF-8, hasil berdasarkan versi 2 dari dataset yang disediakan. Kode ini tidak perlu <LF>diganti dengan baris baru yang sebenarnya.

#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;}

Tabel pemetaan:

 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

Persentase ini didasarkan pada perhitungan hit / total saya: total 3916 hit / 9066.

owacoder
sumber
Awal yang baik; itu tadi cepat! Adapun "Kode pengujian dan editor teks saya melihat 9068 entri bukan 9065 karena beberapa alasan" - apakah Anda melewatkan header dan baris kosong di akhir? Itu akan menjelaskan 2 baris tambahan.
Dave
Maaf; ini tidak melewati aturan # 7 (harus menampilkan jawaban yang benar untuk kode sumbernya sendiri): saat ini dikatakan 0 yang merupakan Python (Saya rasa tidak akan terlalu banyak pekerjaan untuk memesan ulang pemeriksaan untuk memperbaikinya)
Dave
Anda dapat kehilangan ruang setelah define S(x)dan 1 di mana pun Anda miliki ?1.
feersum
Terima kasih! Saya tidak tahu tentang ?1triknya, dan lupa tentang yang lain. ;-)
owacoder
Wow ini telah diam-diam membaik! Memverifikasi 43,19% terbaru :)
Dave
2

Python 3, 271 278 byte, 25.049636% cocok (v2, tidak diverifikasi)

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

peta:

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

golf jauh lebih baik (mungkin masih tidak bagus), akhirnya menembus penghalang 25%! Input telah <LF>diganti dengan baris baru ( \n)

helloworld922
sumber
Saya suka execusahanya. Ngomong-ngomong, Anda diizinkan untuk meminta input yang sudah <LF>diganti sebelumnya \n, sehingga Anda dapat menyimpan beberapa byte di sana untuk berpotensi menambahkan beberapa penyesuaian lebih lanjut.
Dave
Akhirnya sempat memverifikasi ini. Saya hanya melihat 2103 (23,19%) karena beberapa alasan - tahu mengapa bedanya?
Dave
hmmm ... saya tidak yakin. Mungkin itu ada hubungannya dengan bagaimana Anda memberikan input? Saya menggunakan decode('utf-8')untuk mengkonversi array byte input mentah ke asli Python 3 unicode (utf-16?) String sebelum memberikannya ke fungsi saya.
helloworld922
Ah baiklah. Bisa jadi masalah penyandian; Saya hanya mengandalkan fileinput.input () apa pun yang dilakukan di bawah tenda. Saya akan selidiki.
Dave