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.