เดาภาษา


23

บทนำ

ไซต์นี้กำลังสร้างชุดข้อมูลโค้ดขนาดใหญ่อย่างรวดเร็วดังนั้นลองทำอะไรกับมันสิ!

นี่เป็นแฟ้มข้อมูล มันประกอบไปด้วยภาษาที่ไม่ซ้ำกัน 9,066 คู่ + ตัวอย่างสำหรับ 113 ภาษาทั้งหมดนำมาจากเว็บไซต์นี้ รูปแบบถูกคั่นด้วยแท็บ (language-TAB-snippet) พร้อมบรรทัดใหม่ทั้งหมดในตัวอย่างที่แทนที่ด้วย<LF>และแท็บทั้งหมดถูกแทนที่ด้วยช่องว่าง 4 ช่อง แต่ละตัวอย่างมีอย่างน้อย 5 ตัวอย่าง

[อัปเดต: ฉันได้ทำการเปลี่ยนแปลงเล็กน้อยกับไฟล์ข้อมูลเพื่อรวม Python & RegExp เวอร์ชันที่ฉันพลาดไปก่อนหน้านี้ - ลิงก์ด้านบนได้รับการปรับปรุงแล้ว]

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่รับโค้ดขนาดเล็กและส่งออกภาษาที่ใช้เขียน (ดูรายละเอียดด้านล่าง) ขนาดรวมของแหล่งข้อมูลของคุณ + ข้อมูลใด ๆ ที่คุณต้องการจะต้องมีขนาด 300 ไบต์หรือน้อยกว่าและโปรแกรมของคุณจะต้องแสดงผลภาษาที่ถูกต้องเมื่อได้รับรหัสต้นฉบับของตัวเอง ความแม่นยำสูงสุด (คำตอบที่ถูกต้องที่สุดในชุดข้อมูลด้านบน) ชนะ

กฎระเบียบ

  • ขนาดทั้งหมดของซอร์สโค้ดทรัพยากรและแฟล็กการรวบรวม / รันไทม์ที่จำเป็นใด ๆ ของคุณต้องไม่เกิน 300 ไบต์
  • คำตอบของคุณจะถูกทดสอบกับชุดข้อมูลด้านบน มันจะได้รับหนึ่งในค่า "ตัวอย่าง" เป็นอินพุทและเอาท์พุทของมันจะถูกเปรียบเทียบกับเอาท์พุท "ถูกต้อง" ตามชุดข้อมูล นี้จะถูกทำซ้ำสำหรับรายการทั้งหมดในชุดข้อมูลและจำนวนสุดท้ายของคำตอบที่ถูกต้องคือคะแนนของคุณ
  • คุณสามารถเลือกการเข้ารหัสอินพุต - ฉันจะสมมติว่า UTF-8 ดังนั้นหากคุณต้องการการเข้ารหัสอื่นให้ระบุไว้ในคำตอบของคุณ
  • คุณไม่จำเป็นต้องใช้การ<LF>แทนที่สำหรับการขึ้นบรรทัดใหม่ หากรายการของคุณคาดว่าจะได้รับการขึ้นบรรทัดใหม่เป็นตัวอักษรขึ้นบรรทัดใหม่ (อักขระ 10 ตัว) ให้ระบุไว้ในคำตอบของคุณ
  • รายการของคุณจะต้องแสดงผลภาษาที่คิดว่ามีการเขียนตัวอย่างข้อมูลเข้าเพื่อหลีกเลี่ยงความจำเป็นในการบีบอัดสตริงภาษาจำนวนมากฉันจะอนุญาตการแมป (ถ้าคุณต้องการส่งออก 3 สำหรับ "Java" ก็ใช้ได้) เพียงบันทึกการแมปในคำตอบของคุณ
  • คุณสามารถมีการแมปผลลัพธ์ 1 รายการสำหรับแต่ละภาษาเท่านั้น (เช่นถ้า 3 หมายถึง "Java" คุณไม่สามารถมี 4 ความหมาย "Java")
  • เมื่อได้รับซอร์สโค้ดของตัวเองแล้วโปรแกรมของคุณจะต้องสร้างคำตอบที่ถูกต้อง (ต้องส่งออกภาษาที่เขียน)
  • คุณไม่จำเป็นต้องสนับสนุนทุกภาษาในชุดข้อมูลและคุณสามารถรองรับภาษาเพิ่มเติมได้หากคุณต้องการ (เช่นถ้ารายการของคุณไม่ได้อยู่ในหนึ่งในภาษาในชุดข้อมูล)
  • โปรแกรมของคุณต้องถูกกำหนดไว้ล่วงหน้า (การให้อินพุตเดียวกันสองครั้งจะต้องสร้างเอาต์พุตเดียวกัน)

ผูกทำลาย

  • ความสัมพันธ์จะถูกตัดสินโดยการลดชุดข้อมูลจนกว่าจะมีหนึ่งรายการชนะ ชุดข้อมูลจะลดลงโดยการลบตัวอย่างทั้งหมดสำหรับภาษาที่ได้รับความนิยมมากที่สุด (เช่นความสัมพันธ์จะถูกทำลายโดยความถูกต้องในภาษาที่หายาก) ตัวอย่างเช่นถ้า A และ B ให้คะแนน 70% กับชุดข้อมูลแบบเต็มข้อมูลโค้ด Python ทั้งหมดจะถูกลบ หาก A และ B ทั้งคู่ทำคะแนนได้ 60% CJam จะถูกลบออก หาก A ตอนนี้ทำคะแนน 50% แต่ B ทำคะแนน 55% B จะเป็นผู้ชนะ
  • หากบรรลุความแม่นยำ 100% ความสัมพันธ์จะถูกตัดสินใจโดยใช้ชุดข้อมูลชุดที่สอง (ตาบอด) ซึ่งมีตัวอย่างเพิ่มเติมสำหรับภาษาเดียวกัน

ตัวอย่างที่ 1

สคริปต์ Python:

print("python")

สคริปต์นี้สร้าง "python" สำเร็จเมื่อได้รับซอร์สโค้ดของตัวเองดังนั้นจึงถูกต้อง บนชุดข้อมูลนั้นให้คะแนน 1008/9066 = 11.1%

ตัวอย่างที่ 2

ฟังก์ชั่น JavaScript:

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

ด้วยการแม็พ 1 → javascript, 2 → python อีกครั้งมันประสบความสำเร็จในการผลิต 1 ("javascript") สำหรับแหล่งที่มาของตัวเองและในชุดข้อมูลนั้นคะแนน 1092/9066 = 12.0%


ข้อมูลมาจากไหน

ฉันสร้างแบบสอบถาม SEDEเพื่อดึงตัวอย่างจากความท้าทาย [code-golf] ในเว็บไซต์นี้ จากผลลัพธ์ 10,000 คำตอบฉันใช้สคริปต์ python แบบแฮ็กเข้าด้วยกันเพื่อค้นหาชื่อรหัสและภาษาสำหรับแต่ละรายการจากนั้นกรองภาษาใด ๆ ที่มีตัวอย่างน้อยกว่า 5 ตัว ข้อมูลไม่สะอาด 100% (ฉันรู้ว่ามีบางตัวอย่างที่ไม่ใช่รหัสที่ดึงมา) แต่ควรดีพอ


แรงบันดาลใจจากความท้าทายนี้เมื่อต้นปี: ใครบอกว่า? 2559 การเลือกตั้งประธานาธิบดี

ส่วนหนึ่งเกี่ยวข้องกับภาษาอะไรบ้าง


3
ดูเหมือนจะท้าทายอย่างไม่น่าเชื่อใน 300 ไบต์ อาจจัดสรรไบต์เพิ่มเติมหรือไม่
Rohan Jhunjhunwala

1
@RohanJhunjhunwala ใช่ฉันคิดว่ามันจะค่อนข้างท้าทาย! ฉันไม่ได้คาดหวังให้ใครได้รับความแม่นยำ 100% ความท้าทายคือการได้สูงที่สุด ใน "ใครบอกว่า?" ความท้าทายที่ฉันเชื่อมโยงกับเราทุกคนถึงจุดสูงสุดที่ความแม่นยำ ~ 30% ฉันพยายามตั้งค่าขีด จำกัด ไบต์เพื่อให้ได้ 50–70% ที่นี่ หวังว่าฉันจะมีความสมดุล แน่นอนถ้าคุณพบทางออกที่ยอดเยี่ยมซึ่งใช้จำนวนไบต์มากขึ้นโพสต์มัน! มันจะไม่เป็นการแข่งขัน (คุณสามารถลดรุ่นการแข่งขันลงได้)
เดฟ

คุณลบรูปหลายภาษาออกจากชุดข้อมูลหรือว่าจะเป็น "gotchas" หรือไม่
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 ผลรวม


ออกไปเพื่อเริ่มต้นที่ดี มันเร็วมาก! สำหรับ "รหัสทดสอบและตัวแก้ไขข้อความของฉันเห็นรายการ 9068 แทนที่จะเป็น 9065 ด้วยเหตุผลบางอย่าง" - คุณข้ามส่วนหัวและบรรทัดว่างในตอนท้ายหรือไม่? ที่จะบัญชีสำหรับ 2 บรรทัดพิเศษ
เดฟ

ขออภัย; สิ่งนี้ไม่ผ่านกฎ # 7 (ต้องส่งคำตอบที่ถูกต้องสำหรับซอร์สโค้ดของตัวเอง): ตอนนี้มันบอกว่า 0 ซึ่งเป็น Python (ฉันเดาว่ามันจะไม่ทำงานมากเกินไปในการสั่งเช็คอีกครั้งเพื่อแก้ไข)
เดฟ

คุณจะสูญเสียพื้นที่หลังdefine S(x)และ 1 ?1ที่ใดก็ตามที่คุณมี
feersum

ขอบคุณ! ฉันไม่รู้เกี่ยวกับ?1กลอุบายและลืมเกี่ยวกับสิ่งอื่น ;-)
owacoder

ว้าวสิ่งนี้ได้รับการปรับปรุงอย่างเงียบ ๆ ! ตรวจสอบล่าสุด 43.19% :)
เดฟ

2

Python 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

golfed ที่ดีขึ้นมาก (อาจจะยังไม่ดี) ในที่สุดก็พังกำแพง 25%! อินพุตได้<LF>ถูกแทนที่ด้วยขึ้นบรรทัดใหม่ ( \n)


ฉันชอบexecความพยายาม โดยวิธีการที่คุณได้รับอนุญาตให้ขอให้ป้อนข้อมูลเพื่อ<LF>แทนที่ด้วยล่วงหน้า\nเพื่อให้คุณสามารถบันทึกไม่กี่ไบต์ที่นั่นเพื่อเพิ่มการปรับแต่งเพิ่มเติมบางอย่าง
เดฟ

ในที่สุดก็มีการตรวจสอบเรื่องนี้ ฉันเห็นเพียง 2103 (23.19%) ด้วยเหตุผลบางอย่างความคิดใดที่ว่าทำไมถึงแตกต่าง
เดฟ

อืม ... ฉันไม่แน่ใจ บางทีมันอาจจะเกี่ยวข้องกับวิธีที่คุณให้อินพุต? ฉันใช้decode('utf-8')ในการแปลงอาเรย์อินพุตดิบเป็นสตริงดั้งเดิมของ Python 3 unicode (utf-16?) ก่อนที่จะมอบให้กับฟังก์ชั่นของฉัน
helloworld922

อาโอเค. อาจเป็นปัญหาการเข้ารหัส ฉันแค่พึ่ง fileinput.input () อะไรก็ตามที่อยู่ภายใต้ประทุน ฉันจะตรวจสอบ
เดฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.