언어를 맞춰


23

소개

이 사이트는 코드 스 니펫의 거대한 데이터 세트를 빠르게 구축하고 있으므로 무언가를 해보자!

다음은 데이터 파일 입니다. 이 사이트에서 가져온 113 개 언어에 대한 9,066 개의 고유 한 언어 + 스 니펫 쌍이 포함되어 있습니다. 형식은 탭으로 구분되며 (언어 -TAB- 스 니펫) 스 니펫의 모든 줄 바꿈이로 바뀌고 <LF>모든 탭이 4 개의 공백으로 바뀝니다. 각 언어마다 5 개 이상의 스 니펫이 있습니다.

[업데이트 : 이전에 놓친 일부 Python & RegExp 버전을 병합하기 위해 데이터 파일을 약간 변경했습니다. 위의 링크가 업데이트되었습니다.]

도전

코드 스 니펫을 작성하고 작성된 언어를 출력하는 프로그램 또는 함수를 작성하십시오 (자세한 내용은 아래 참조). 소스의 전체 크기 + 필요한 데이터는 300 바이트 이하 여야하며, 자체 소스 코드가 제공되면 프로그램 에서 올바른 언어를 출력 해야합니다 . 최고 정확도 (위의 데이터 세트에서 가장 정확한 답변)가 이깁니다.

규칙

  • 소스 코드, 리소스 및 필요한 컴파일 / 런타임 플래그의 총 크기는 300 바이트를 초과하지 않아야합니다.
  • 귀하의 답변은 위의 데이터 세트에 대해 테스트됩니다. "스 니펫"값 중 하나가 입력으로 제공되고 출력이 데이터 세트에 따라 "올바른"출력과 비교됩니다. 이는 데이터 세트의 모든 항목에 대해 반복되며 정답의 최종 수는 점수입니다.
  • 입력 인코딩을 선택할 수 있습니다-UTF-8이라고 가정하므로 다른 인코딩이 필요한 경우 답변에 지정하십시오.
  • <LF>바꿈을 위해 대체 를 사용할 필요는 없습니다 . 항목이 개행을 리터럴 개행 (문자 10)으로 수신 할 것으로 예상되는 경우 답변에 지정하십시오.
  • 입력 스 니펫이 작성되었다고 생각되는 언어를 입력해야합니다. 많은 언어 문자열을 압축 할 필요가 없도록 맵핑을 허용합니다 ( "Java"에 대해 3을 출력하려면 괜찮습니다). 답변에서 매핑을 확인하십시오.
  • 각 언어에 대해 하나의 출력 맵핑 만 가질 수 있습니다 (즉, 3이 "Java"를 의미하는 경우 "Java"를 의미하는 4도 가질 수 없음).
  • 자신의 소스 코드를 제공하는 경우, 프로그램이 있어야 정답 (반드시 출력가 작성된 언어)를 생산하고 있습니다.
  • 데이터 세트에서 모든 언어를 지원할 필요는 없으며 원하는 경우 추가 언어를 지원할 수 있습니다 (예 : 항목이 데이터 세트의 언어 중 하나에없는 경우).
  • 프로그램은 결정 론적이어야합니다 (같은 입력을 두 번 제공하면 동일한 출력을 생성해야 함).

타이 브레이킹

  • 동점은 한 항목이 이길 때까지 데이터 집합을 줄여 결정됩니다. 가장 많이 사용되는 언어의 스 니펫을 모두 제거하면 데이터 세트가 줄어 듭니다 (예 : 희귀 언어의 경우 정확도가 저하됨). 예를 들어, 전체 데이터 세트에서 A와 B의 점수가 70 %이면 모든 Python 스 니펫이 제거됩니다. A와 B의 점수가 모두 60 %이면 CJam이 제거됩니다. A가 현재 50 %이지만 B가 55 %이면 B가 승자입니다.
  • 100 % 정확도가 달성되면 동일한 언어에 대해 더 많은 샘플을 포함하는 두 번째 (블라인드) 데이터 집합을 사용하여 연결이 결정됩니다.

실시 예 1

파이썬 스크립트 :

print("python")

이 스크립트는 자체 소스 코드가 제공되면 "python"을 성공적으로 생성하므로 유효합니다. 데이터 세트에서 점수는 1008/9066 = 11.1 %입니다.

실시 예 2

자바 스크립트 기능 :

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

매핑 1 → javascript, 2 → python으로. 다시 한 번 성공적으로 자체 소스에 대해 1 ( "자바 스크립트")을 생성하고 데이터 세트에서 1092/9066 = 12.0 %를 얻습니다.


데이터는 어디에서 왔습니까?

이 사이트의 [code-golf] 과제에서 샘플을 가져 오기 위해 SEDE 쿼리 를 만들었습니다 . 결과적으로 10,000 개의 답변에서 해킹 된 파이썬 스크립트를 사용하여 각각의 코드 및 언어 이름을 찾은 다음 5 개 미만의 예제로 모든 언어를 필터링했습니다. 데이터가 100 % 깨끗하지는 않지만 (코드 조각이 아닌 스 니펫이 있음을 알고 있습니다) 충분해야합니다.


올해 초이 도전에서 영감을 얻은 것 : 누가 말했습니까? 2016 년 대통령 선거

또한 언어 란 무엇입니까?


3
300 바이트에서 수행하기가 엄청나게 어려운 것 같습니다. 아마도 더 많은 바이트를 할당합니까?
Rohan Jhunjhunwala

1
@RohanJhunjhunwala 그래, 나는 그것이 매우 도전이 될 것이라고 상상! 그래도 아무도 100 %의 정확성을 기대하지는 않습니다. 도전은 가능한 한 높이 얻는 것입니다. "누가 그렇게 했어?" 내가 연결 한 과제는 ~ 30 %의 정확도로 정점에 도달했습니다. 나는 여기서 50–70 %가 가능하도록 바이트 제한을 설정하려고했습니다. 잘만되면 나는 균형을 맞췄다. 물론 더 많은 바이트를 사용하는 훌륭한 솔루션을 찾으면 게시하십시오! 그것은 단지 경쟁하지 않을 것입니다 (경쟁 버전을 위해 그것을 줄일 수 있습니다).
Dave

데이터 세트에서 폴리 글 로트를 제거 했습니까?
Geobits

9
golflangs를 구별하기가 너무 어려울 것입니다 ...
busukxuan

2
흥미로운 사실 ​​: 가장 많이 사용되는 20 개 언어 (최소한 데이터 세트에서)는 데이터 세트의 81 %를 구성하고 가장 일반적으로 사용되는 10 개 언어는 61 %를 구성합니다. Javascript, Pyth, CJam 및 Python의 차이점 만 감지해도 약 35 %를 얻을 수 있습니다.
helloworld922

답변:


17

C, 297 바이트, 43.194351 % 일치 (v2)

이것은 내가 경쟁 한 최초의 비 골프 도전입니다. 놀랍게도 골프 언어는 실제로 언어별로 약 60 % 일치하는 정확도로 분리하기가 다소 쉽습니다.

이 코드에는 UTF-8 문자열로 입력해야합니다. 결과는 제공된 데이터 세트의 버전 2를 기반으로합니다. 이 코드는 <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 개의 추가 라인을 설명합니다.
Dave

죄송합니다; 이것은 규칙 # 7을 통과하지 못합니다 (자신의 소스 코드에 대한 정답을 출력해야 함). 지금은 0입니다 (파이썬 임).
Dave

당신은 define S(x)어디서나 후 공간을 잃을 수 있습니다 ?1.
feersum

감사! 나는 그 ?1트릭 에 대해 몰랐고 다른 것에 대해서는 잊었다. ;-)
owacoder

와우, 이것은 조용히 개선되었습니다! 최근 43.19 %를 확인 함 :)
Dave

2

파이썬 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수 있으므로 몇 바이트를 절약하여 더 미세한 조정을 추가 할 수 있습니다.
Dave

마침내 이것을 확인하기 위해 돌아 왔습니다. 나는 어떤 이유로 2103 (23.19 %) 만 볼 수 있습니다-왜 차이점이 있습니까?
Dave

흠 ... 확실하지 않습니다. 아마도 그것은 당신이 입력을하는 방법과 관련이 있습니까? decode('utf-8')원시 입력 바이트 배열을 함수에 제공하기 전에 원시 Python 3 유니 코드 (utf-16?) 문자열로 변환하는 데 사용 합니다.
helloworld922

그래. 인코딩 문제 일 수 있습니다. 나는 fileinput.input ()이 무엇을하는지에 의존하고 있습니다. 조사하겠습니다.
Dave
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.