Đoán ngôn ngữ


23

Giới thiệu

Trang web này đang nhanh chóng xây dựng một bộ dữ liệu khổng lồ về các đoạn mã, vì vậy hãy làm gì đó với nó!

Đây là một tệp dữ liệu . Nó chứa 9.066 cặp ngôn ngữ + đoạn trích duy nhất cho 113 ngôn ngữ, tất cả được lấy từ trang web này. Định dạng được phân tách bằng tab (ngôn ngữ-TAB-đoạn), với tất cả các dòng mới trong đoạn trích được thay thế <LF>và tất cả các tab được thay thế bằng 4 khoảng trắng. Có ít nhất 5 đoạn cho mỗi ngôn ngữ.

[cập nhật: Tôi đã thực hiện một thay đổi nhỏ cho tệp dữ liệu để hợp nhất một số phiên bản Python & RegExp mà tôi đã bỏ lỡ trước đây - liên kết ở trên đã được cập nhật]

Thử thách

Viết chương trình hoặc hàm lấy đoạn mã và xuất ra ngôn ngữ được viết (xem bên dưới để biết chi tiết). Tổng kích thước của nguồn của bạn + mọi dữ liệu bạn yêu cầu phải từ 300 byte trở xuống và chương trình của bạn phải xuất ra ngôn ngữ chính xác khi được cung cấp mã nguồn riêng. Độ chính xác cao nhất (hầu hết các câu trả lời đúng trên tập dữ liệu ở trên) sẽ thắng.

Quy tắc

  • Tổng kích thước của mã nguồn, tài nguyên của bạn và bất kỳ cờ biên dịch / thời gian chạy cần thiết nào không được vượt quá 300 byte.
  • Câu trả lời của bạn sẽ được kiểm tra đối với tập dữ liệu ở trên; nó sẽ được cung cấp một trong các giá trị "Đoạn trích" làm đầu vào và đầu ra của nó sẽ được so sánh với đầu ra "chính xác" theo tập dữ liệu. Điều này sẽ được lặp lại cho tất cả các mục trong bộ dữ liệu và số câu trả lời đúng cuối cùng là điểm của bạn.
  • Bạn có thể chọn mã hóa đầu vào - Tôi sẽ giả sử UTF-8, vì vậy nếu bạn cần mã hóa khác, hãy xác định nó trong câu trả lời của bạn.
  • Bạn không cần phải sử dụng <LF>thay thế cho dòng mới; nếu mục nhập của bạn dự kiến ​​sẽ nhận được dòng mới dưới dạng dòng mới theo nghĩa đen (char 10), hãy chỉ định nó trong câu trả lời của bạn.
  • Mục nhập của bạn phải xuất ra ngôn ngữ mà đoạn mã đầu vào được viết. Để tránh phải nén nhiều chuỗi ngôn ngữ, tôi sẽ cho phép ánh xạ (Nếu bạn muốn xuất 3 cho "Java", điều đó tốt); chỉ cần lưu ý các ánh xạ trong câu trả lời của bạn.
  • Bạn chỉ có thể có 1 ánh xạ đầu ra cho mỗi ngôn ngữ (nghĩa là nếu 3 có nghĩa là "Java", bạn cũng không thể có 4 nghĩa là "Java").
  • Khi được cung cấp mã nguồn riêng, chương trình của bạn phải đưa ra câu trả lời đúng (phải xuất ra ngôn ngữ được viết).
  • Bạn không cần phải hỗ trợ tất cả các ngôn ngữ trong tập dữ liệu và bạn có thể hỗ trợ các ngôn ngữ bổ sung nếu bạn muốn (ví dụ: nếu mục nhập của bạn không thuộc một trong các ngôn ngữ trong tập dữ liệu).
  • Chương trình của bạn phải có tính xác định (cung cấp cùng một đầu vào hai lần phải tạo ra cùng một đầu ra).

Cà vạt

  • Các mối quan hệ sẽ được quyết định bằng cách giảm tập dữ liệu cho đến khi một mục thắng. Bộ dữ liệu sẽ được giảm bằng cách xóa tất cả các đoạn mã cho ngôn ngữ phổ biến nhất (nghĩa là các mối quan hệ bị phá vỡ bởi độ chính xác trên các ngôn ngữ hiếm hơn). Ví dụ: nếu A và B đạt 70% trên toàn bộ dữ liệu, tất cả các đoạn mã Python sẽ bị xóa. Nếu cả A và B bây giờ đều đạt 60%, thì CJam sẽ bị xóa. Nếu A bây giờ đạt 50% nhưng B đạt 55% thì B là người chiến thắng.
  • Nếu đạt được độ chính xác 100%, các mối quan hệ sẽ được quyết định bằng cách sử dụng bộ dữ liệu thứ hai (mù) chứa nhiều mẫu hơn cho cùng một ngôn ngữ.

ví dụ 1

Kịch bản Python:

print("python")

Kịch bản lệnh này tạo thành công "python" khi được cung cấp mã nguồn riêng, vì vậy nó hợp lệ. Trên tập dữ liệu, nó đạt 1008/9066 = 11,1%

Ví dụ 2

Hàm JavaScript:

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

Với ánh xạ 1 → javascript, 2 → python. Một lần nữa, nó tạo thành công 1 ("javascript") cho nguồn riêng của mình và trên tập dữ liệu, nó đạt 1092/9066 = 12,0%


Dữ liệu đến từ đâu?

Tôi đã tạo một truy vấn SEDE để lấy các mẫu từ các thử thách [code-golf] trên trang web này. Từ 10.000 câu trả lời, tôi đã sử dụng tập lệnh python đã hack để tìm mã và tên ngôn ngữ cho từng ngôn ngữ, sau đó lọc ra bất kỳ ngôn ngữ nào có ít hơn 5 ví dụ. Dữ liệu không sạch 100% (tôi biết có một số đoạn mã không được mã hóa), nhưng phải đủ tốt.


Lấy cảm hứng từ thử thách này từ đầu năm: Ai nói vậy? Bầu cử tổng thống năm 2016

Cũng một phần liên quan đến Ngôn ngữ là gì?


3
Có vẻ cực kỳ khó khăn để làm trong 300 byte. Có lẽ phân bổ nhiều byte hơn?
Rohan Jhunjhunwala

1
@RohanJhunjhunwala vâng tôi tưởng tượng nó sẽ là một thử thách khá lớn! Tôi không mong đợi bất cứ ai có được độ chính xác 100%; thách thức là để có được càng cao càng tốt. Trong "ai nói vậy?" Thử thách tôi liên kết đến, tất cả chúng tôi đều đạt đến độ chính xác ~ 30%. Tôi đã cố gắng đặt giới hạn byte để có thể có 50 507070% tại đây. Hy vọng tôi có được sự cân bằng ngay. Tất nhiên nếu bạn tìm thấy một giải pháp tuyệt vời sử dụng nhiều byte hơn, hãy đăng nó! Nó sẽ không cạnh tranh (bạn có thể cắt nó xuống cho phiên bản cạnh tranh).
Dave

Bạn đã loại bỏ các polyglots khỏi bộ dữ liệu, hoặc chúng sẽ chỉ là "gotchas"?
Geobits

9
Sẽ rất khó để phân biệt giữa các golflang ...
busukxuan

2
Sự thật thú vị: 20 ngôn ngữ được sử dụng phổ biến nhất (ít nhất là trong tập dữ liệu của bạn) chiếm 81% dữ liệu của bạn và 10 ngôn ngữ được sử dụng phổ biến nhất chiếm tới 61%. Thậm chí chỉ cần phát hiện sự khác biệt giữa Javascript, Pyth, CJam và Python là đủ để có được khoảng 35%.
hellowworld922

Câu trả lời:


17

C, 297 byte, khớp 43.194351% (v2)

Đây là thử thách không chơi gôn đầu tiên tôi từng tham gia. Đáng ngạc nhiên, các ngôn ngữ chơi gôn thực sự khá dễ tách biệt, với độ chính xác phù hợp với khoảng 60% cho mỗi ngôn ngữ.

Mã yêu cầu đầu vào dưới dạng chuỗi UTF-8, kết quả dựa trên phiên bản 2 của bộ dữ liệu được cung cấp. Mã này không yêu cầu <LF>phải được thay thế bằng các dòng mới thực tế.

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

Bảng ánh xạ:

 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

Tỷ lệ phần trăm dựa trên số lần truy cập / tổng tính toán của tôi: 3916 lần truy cập / tổng số 9066.


Khởi đầu tuyệt vời; nó thật nhanh! Đối với "Mã kiểm tra và trình soạn thảo văn bản của tôi, hãy xem 9068 mục thay vì 9065 vì một số lý do" - bạn có bỏ qua các tiêu đề và dòng trống ở cuối không? Điều đó sẽ chiếm 2 dòng thêm.
Dave

Lấy làm tiếc; đây không phải là quy tắc số 7 (phải đưa ra câu trả lời đúng cho mã nguồn riêng): ngay bây giờ nó nói 0 là Python (Tôi đoán rằng sẽ không quá nhiều việc phải sắp xếp lại các kiểm tra để sửa lỗi đó)
Dave

Bạn có thể mất không gian sau define S(x)và 1 bất cứ nơi nào bạn có ?1.
frageum

Cảm ơn! Tôi không biết về ?1mánh khóe và quên mất chuyện kia. ;-)
owacoder

Wow điều này đã được âm thầm cải thiện! Đã xác minh 43,19% mới nhất :)
Dave

2

Python 3, 271 278 byte, khớp 25.049636% (v2, chưa được xác minh)

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

bản đồ:

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

chơi golf tốt hơn nhiều (có lẽ vẫn không tuyệt vời), cuối cùng đã phá vỡ rào cản 25%! Các đầu vào đã <LF>thay thế bằng dòng mới ( \n)


Tôi thích sự execcố gắng. Nhân tiện, bạn được phép yêu cầu đầu vào được <LF>thay thế trước \n, vì vậy bạn có thể lưu một vài byte ở đó để có khả năng thêm một số tinh chỉnh.
Dave

Cuối cùng có xung quanh để xác minh điều này. Tôi chỉ thấy 2103 (23,19%) vì một số lý do - bất kỳ ý tưởng tại sao sự khác biệt?
Dave

hmmm ... tôi không chắc Có lẽ nó liên quan đến cách bạn đưa ra đầu vào? Tôi sử dụng decode('utf-8')để chuyển đổi mảng byte đầu vào thô thành chuỗi unicode Python 3 (utf-16?) Trước khi đưa nó vào hàm của tôi.
hellowworld922

À. Có thể là một vấn đề mã hóa; Tôi chỉ dựa vào bất cứ thứ gì fileinput.input () thực hiện. Tôi sẽ điều tra.
Dave
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.