Dili tahmin et


23

Giriş

Bu site hızla büyük bir kod parçacıkları veri seti oluşturuyor, bu yüzden onunla bir şeyler yapalım!

İşte bir veri dosyası . Hepsi bu siteden alınan 113 dil için 9,066 benzersiz dil + snippet çifti içerir. Biçim sekmeyle ayrılmış (dil-TAB pasajı), pasajlardaki tüm yeni satırlar <LF>ve tüm sekmeler 4 boşlukla değiştirilmiş. Her dil için en az 5 snippet var.

[güncelleme: Daha önce kaçırdığım bazı Python ve RegExp sürümlerini birleştirmek için veri dosyasında küçük bir değişiklik yaptım - yukarıdaki bağlantı güncellendi]

Meydan okuma

Kod pasajını alan ve yazıldığı dili çıkaran bir program veya işlev yazın (ayrıntılar için aşağıya bakın). Kaynağınızın toplam boyutu + istediğiniz veri miktarı 300 bayt veya daha az olmalı ve programınız kendi kaynak kodu verildiğinde doğru dili vermelidir . En yüksek doğruluk (yukarıdaki veri setindeki en doğru cevaplar) kazanır.

kurallar

  • Kaynak kodunuzun, kaynaklarınızın ve gerekli derleme / çalışma zamanı bayraklarınızın toplam boyutu 300 baytı geçmemelidir.
  • Cevabınız yukarıdaki veri setine karşı test edilecektir; giriş olarak "Snippet" değerlerinden birine verilecek ve çıktıları veri setine göre "doğru" çıktıyla karşılaştırılacak. Bu, veri setindeki tüm girişler için tekrarlanacak ve doğru cevapların son sayısı sizin puanınız olacaktır.
  • Giriş kodlamasını seçebilirsiniz - UTF-8'i kabul edeceğim, başka bir kodlamaya ihtiyacınız olursa cevabınızı belirtin.
  • Yeni <LF>hatlar için değiştirmeyi kullanmanıza gerek yoktur ; eğer girişiniz yeni satırları değişmez satırlar olarak almak istiyorsa (char 10), cevabınızı belirtiniz.
  • Girişiniz, giriş snippet'inin yazıldığını düşündüğü dili çıkarmalıdır. Çok sayıda dil dizesini sıkıştırmaktan kaçınmak için eşleştirmelere izin vereceğim ("Java" için 3 çıktısı istiyorsanız, sorun değil); Cevabınızdaki eşlemeleri not edin.
  • Her dil için yalnızca 1 çıkış eşlemeniz olabilir (ör. 3 "Java" anlamına gelirse, 4 "Java" anlamına da gelemezsiniz).
  • Kendi kaynak kodunu verdiği zaman, programı gerekir doğru cevabı (zorunluluk çıkışı olarak yazıldığı dili) üretirler.
  • Veri kümesindeki tüm dilleri desteklemeniz gerekmez ve eğer isterseniz ek dilleri destekleyebilirsiniz (örneğin, girişiniz veri kümesindeki dillerden birinde değilse).
  • Programınız deterministik olmalı (aynı girişi iki kez sağlayarak aynı çıktıyı vermelisiniz).

Tie-Breaking

  • Bir giriş kazanana kadar veri setini düşürerek bağlara karar verilecek. En popüler dil için tüm snippet'leri kaldırarak veri kümesi azaltılacaktır (örn. Bağlar daha nadir olan dillerde doğrulukla kesilir). Örneğin, A ve B tam veri kümesinde% 70 puan alırsa, tüm Python snippet'leri kaldırılır. Eğer A ve B şimdi ikisi de% 60 puan alırsa, CJam kaldırılacaktır. Eğer A şimdi% 50, B ise% 55 puan alırsa, B kazanır.
  • % 100 doğruluk elde edilirse, aynı diller için daha fazla örnek içeren ikinci (kör) bir veri kümesi kullanılarak bağlara karar verilecektir.

örnek 1

Python betiği:

print("python")

Bu komut dosyası, kendi kaynak kodu verildiğinde başarıyla "python" üretir, bu nedenle geçerlidir. Veri setinde 1008/9066 = 11.1 puan aldı

Örnek 2

JavaScript işlevi:

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

Eşlemelerle 1 → javascript, 2 → piton. Yine kendi kaynağı için başarılı bir şekilde 1 ("javascript") üretir ve veri setinde 1092/9066 = 12.0% puan aldı


Veriler nereden geldi?

Bu sitede [code-golf] zorluklarından örnekler almak için bir SEDE sorgusu oluşturdum . Elde edilen 10.000 yanıttan, her birinin kod ve dil adını bulmak için bir bilgisayar korsanından oluşan bir python betiği kullandım, daha sonra 5 örnekten daha az olan herhangi bir dili filtreledim. Veriler% 100 temiz değil (çektiği bazı kod dışı snippet'lerin olduğunu biliyorum), ancak yeterince iyi olması gerekir.


Yılın başındaki bu meydan okumadan ilham alan: Bunu kim söyledi? 2016 Cumhurbaşkanlığı seçimi

Ayrıca kısmen Dil Nedir?


3
300 baytta yapmak inanılmaz derecede zor görünüyor. Belki daha fazla bayt ayırın?
— Rohan Jhunjhunwala

1
@RohanJhunjhunwala evet bence oldukça zor olacak! Hiç kimsenin% 100 doğruluk elde etmesini beklemiyorum; Buradaki zorluk mümkün olduğunca yükseğe ulaşmak. "Bunu kim söyledi?" bağlı olduğum meydan okuma, hepimiz ~% 30 doğrulukla zirve yaptı. Bayt sınırını belirlemeye çalıştım, böylece% 50–70 burada mümkün olabilir. Umarım dengeyi sağladım. Elbette daha fazla byte kullanan harika bir çözüm bulursanız, gönderin! Sadece rakip olmayacak (rakip sürüm için kesebilirsiniz).
— Dave,

Polietilenleri veri kümesinden mi çıkardın, yoksa bunlar sadece "gotchas" mı olacak?
— Geobits

9
Golf sahaları arasında ayrım yapmak çok zor olacak ...
— busukxuan

2
İlginç gerçekler: En çok kullanılan 20 (en azından veri setinizde) dilleri veri setinizin% 81'ini, en çok kullanılan 10 dil ise% 61'ini oluşturur. Sadece Javascript, Pyth, CJam ve Python arasındaki farkları tespit etmek bile yaklaşık% 35 elde etmek için yeterlidir.
— helloworld922

Yanıtlar:


17

C, 297 bayt,% 43.194351 eşleşme (v2)

Bu, yarıştığım ilk golf dışı mücadeleydi. Şaşırtıcı bir şekilde, golf dilleri, dil başına yaklaşık% 60'lık eşleştirme doğruluğu ile ayrılması oldukça kolaydır.

Kod, UTF-8 dizesi olarak girdi gerektirir, sonuçta sağlanan veri kümesinin 2. sürümüne dayanır. Bu kodun <LF>gerçek yeni satırlarla değiştirilmesi gerekmez .

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

Haritalama tablosu:

 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

Yüzde isabet / toplam hesaplamaya dayanmaktadır: 3916 isabet / toplam 9066.


Kapalı harika bir başlangıç; Bu hızlı oldu! "Test kodum ve metin düzenleyicim, bir nedenden dolayı 9065 yerine 9068 girişlerine bakın" - sonunda başlıkları ve boş satırı atladınız mı? Bu 2 ekstra satır için hesap olacaktır.
— Dave,

Üzgünüm; bu kural 7'yi geçmiyor (kendi kaynak kodunun doğru cevabını vermeli): şu anda 0 yazıyor: Python
— Dave,

define S(x)Nerede ve nerede olursanız olun 1 ve sonra alanı kaybedebilirsiniz ?1.
— feersum

Teşekkürler! ?1Numarayı bilmiyordum ve diğerini unuttum. ;-)
— owacoder

Vay bu sessizce geliştiriyor! En son 43,19% doğrulandı :)
— Dave

2

Python 3, 271 278 bayt,% 25.049636 eşleşme (v2, doğrulanmamış)

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

map:

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

çok daha iyi golf (muhtemelen hala büyük değil), nihayet% 25 engeli kırdı! Girişler <LF>newline ( \n) ile değiştirildi


execGirişimi severim . Bu arada, girişin <LF>önceden değiştirilmesini isteyip istemediğinize izin verilir \n, bu nedenle potansiyel olarak biraz daha ince ayar eklemek için birkaç bayttan tasarruf edebilirsiniz.
— Dave,

Sonunda bunu doğrulamak için etrafta. Sadece bir sebeple 2103'ü (% 23,19) görüyorum - farkın neden olduğu hakkında bir fikrin var mı?
— Dave,

hmmm ... Emin değilim. Belki de girişi nasıl yaptığınızla ilgili olmalı? decode('utf-8')İşleve vermeden önce ham giriş bayt dizisini yerel bir Python 3 unicode (utf-16?) Dizgisine dönüştürmek için kullanıyorum .
— helloworld922

Ah tamam. Kodlama sorunu olabilir; Sadece başlık altında ne fileinput.input () ne olursa olsun güveniyorum. Ben araştıracağım.
— Dave,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.