อย่างจริงจัง GolfScript, CJam หรือ Pyth?


56

เวลาที่ผ่านมาคำถามต่อไปนี้ถูกถาม: GolfScript, CJam หรือ Pyth? จากชื่อเรื่องเท่านั้นฉันคิดว่ามันจะเป็นความท้าทายที่ดีมาก แต่น่าเสียดายที่มันกลายเป็นคำถามที่ถามถึงเคล็ดลับ นี่คือความท้าทายที่ฉันต้องการอ่าน:

ใครบอกว่าภาษากอล์ฟไม่ได้ใช้ในโลกแห่งความจริง? ตามที่ทุกคนรู้อัตราส่วนของข้อผิดพลาดต่อบรรทัดของรหัสจะเหมือนกันกับภาษาการเขียนโปรแกรมที่ใช้ดังนั้นจึงมีโอกาสที่ชัดเจนในการลดการดีบักและค่าใช้จ่ายในการบำรุงรักษาด้วยภาษาเหล่านั้น ในที่สุด บริษัท ของคุณเห็นแสงสว่างและตัดสินใจใช้ Golfscript, CJam และ Pyth เพื่อพัฒนาผลิตภัณฑ์ของตน

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

คุณต้องเขียนเครื่องมือเพื่อตรวจสอบว่า CJam ใด Golfscript หรือ Pyth เป็นภาษาที่ใช้ในการเขียนโปรแกรม สถานการณ์เป็นสิ่งสำคัญคุณสามารถใช้ภาษาใดก็ได้ที่คุณต้องการ แต่โปรดย่อให้สั้น (การจัดเก็บข้อมูลมีราคาแพง: ยิ่งเราใช้ไบต์มากเท่าใดก็ยิ่งมีค่าใช้จ่ายมากขึ้น)

ทั่วไป

  • รหัสที่สั้นที่สุดชนะ
  • ช่องโหว่มาตรฐาน ฯลฯ
  • อย่าใช้ล่ามออนไลน์
  • คุณสามารถเขียนฟังก์ชั่นหรือโปรแกรม
  • คุณสามารถใช้ eval เพื่อตรวจจับภาษาของคุณเอง

อินพุต

  • ข้อมูลที่คุณป้อนมาจากสตรีมอินพุตมาตรฐานหรือเป็นสตริง
  • อินพุตมีอักขระและบรรทัดที่พิมพ์ได้ ASCII เท่านั้น
  • ขนาดของอินพุตมีความยาวสูงสุด 256 ไบต์

เอาท์พุต

  • เอาต์พุตถูกพิมพ์ไปยังเอาต์พุตสตรีมหรือส่งคืนเป็นลำดับของสตริง / สัญลักษณ์
  • หากอินพุตไม่ต้องสงสัยเลยว่าเป็นโปรแกรมX ที่ถูกต้องให้พิมพ์หรือส่งคืนX , X ∈ {CJam, Pyth, Golfscript}

    หมายเหตุ : "ไม่ต้องสงสัยเลย" ไม่ได้หมายความว่าคุณจะได้รับอนุญาตให้ตอบด้วยเครื่องวิเคราะห์โง่ที่ไม่สามารถตรวจจับภาษาใด ๆ ได้อย่างสม่ำเสมอ สำหรับPythฉันคาดว่าโปรแกรมแบบง่ายจะได้รับการยอมรับ (แต่ไม่มีการเข้ารหัส) เดียวกันจะไปสำหรับCJam ( แผ่นโกง , ตัวอย่าง ) และGolfscript ( ตัวอย่าง ) ลิงก์ก่อนหน้าชี้ไปที่ข้อมูลจำเพาะของแต่ละภาษา หากคุณใช้วิธีฟัซซี / เบย์แบบ "ไม่ต้องสงสัยเลย" หมายถึงความมั่นใจระดับสูง (เช่นคุณได้คะแนน 99% จากการจำแนกประเภทของคุณ) ดูด้านล่างสำหรับชุดทดสอบจริง

  • หากอินพุตถูกต้องในหลายภาษาควรตรวจสอบ / พิมพ์ภาษาที่ตรวจพบแต่ละภาษา เมื่อพิมพ์จะต้องมีตัวคั่นระหว่างเอาต์พุตหลายรายการ (เช่น space, newline, comma ... )

  • ลำดับในการลองภาษาไม่สำคัญ
  • ฉันไม่สนใจกรณี (CJam, cjam, CJAM, SPAM) [1]
  • หากไม่มีภาษาดังกล่าวข้างต้นมีการตรวจพบการพิมพ์"Probably Perl " ขอขอบคุณที่คอมเม้นต์นี้จาก mbomb007ในกรณีข้างต้นคุณสามารถเอาท์พุท " Seriously" เพื่อรับการลงโทษ 4 ไบต์ (ความแตกต่างระหว่างสตริงทั้งสอง)

[1] เพื่อความชัดเจน SPAM นั้นไม่ถูกต้อง

ตัวอย่าง

  • อินพุต

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • เอาท์พุท (ตัวอย่างของค่าตอบแทนหลาย ๆ )

    ["Golfscript", "Cjam"]
    
  • อินพุต

    3
    
  • เอาต์พุต (ตัวอย่างบนเอาต์พุตมาตรฐาน)

    golfscript
    cjam
    pyth
    
  • อินพุต

    if {} aazd
    
  • เอาท์พุต

    Probably Perl
    

ในกรณีสุดท้ายโปรแกรมอินพุตสร้างข้อผิดพลาดกับ All Online Threeล่าม

เกณฑ์การให้คะแนนชนะ

รหัสที่สั้นที่สุดชนะ เพิ่ม 4 ไบต์ถ้าคุณส่งออก "อย่างจริงจัง" จากนั้นใช้โบนัส

การทดสอบล้มเหลว

ข้อมูลต่อไปนี้เป็นตัวอย่างที่ต้องไม่รับรู้ว่าเป็นหนึ่งในสามภาษาข้างต้น

หนึ่งสมุทร (เช่นหนึ่งรายการต่อบรรทัด)
$^X=~/([a-z]+)[^\/]+$/;print$1,$/
<>;map($s-=(-1)**$_/(2*$_-1),1..$_),$s=!print$s,$/for<>
((THIS IS LISP HAIKU) (TRULY THIS IS LISP HAIKU) (THIS IS LISP HAIKU))
(format t"~@(~{~R~^, ~}~).~%~:*~@(~{~:R~^, ~}~)."(loop for i to 99 collect(1+ i)))
print sum(ord(c) for c in 'Happy new year to you!')
brainfuck
>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++++++++++++++++++++++++++++++++++++++++++++.
-----------------.
++++++++.
+++++.
--------.
+++++++++++++++.
------------------.
++++++++.
Perl
@list=( "aaaa", 
        "aaaaaaaa", 
        "aaaaaaaaaaaaaaa", 
        "aaaaaaaaaaaaaaaa", 
        "aaaaaaaaaaaaaaaaaaaaaaa", 
        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

while (@list) {
    for($i=0;$i<6;$i++){
        print length($list[$i])." ";
    }
    print "\n";
}
ปลา
#ifndef __linux
#include "x.h"
#define X/*\
a=1 set -e
+++++++++++++++++++++_+++++++++++++....Hello World!?:Q:
#endif
    echo "Hello, World!"
    int m(){}

ชุดทดสอบพื้นฐาน

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

Pyth

*2Q
FNrZTN
FNrZhTN
FNUhTN
VhTN
FNr1hQN
=N5N
K5K
K1FNr1hQ=K*KN
K1FNr1hQ=K*KNK
K1FNr1hQ=K*KN;K
DhZK*3ZRK
L?b*bytb1yQ
A(Z1)VQHA(H+HG

Golfscript

;'2706 410'~{.@\%.}do;
;''6666,-2%{2+.2/@*\/10.3??2*+}*`50<~\;
'Hello, world!'
1 2 [\]

CJam

"Hello, world"
{`"_~"}_~
"`_~"`_~
T1{_2$+}A*]`
{__'`>\'x>26*2-*-}/
Y38#
N/s:X,8-,{X>9<__{'a<},,\4%{'Z>},,*I={4=}{;}?}/

โบนัสเงิน: จำนวนไบต์ * 0.6

การทดสอบก่อนหน้านี้ทั้งหมดจะต้องผ่านเช่นเดียวกับสมุทรต่อไปนี้ ตัวอย่างทั้งหมดนั้นมาจากคำตอบของ CodeGolf ที่เกิดขึ้นจริง

Pyth

VzJ:zZhZpkJ~Zhy}rJ0-G"aeoui
Vzjdm?@zd}N,dt-lzd\ Uz
jd.iSQs*RtQ,\?":0
rsXOtQmO*-GJ"aeiou"J/Q2*%Q2O"hy"4
VhQIq`N_`NN
s["$$\\varphi=1+"*Q"\cfrac1{1+"\\<\dQ"dots"*Q\}"$$
@c"weak trick fair"d-!JlfhT-M.:us_cG.u+NYtKrH7-52hK.zU52 2>J26

Golfscript

);:|;{0):0;|$:§-1%" - "§" = ""0"4$~§~-+-4>:|n|6174`=!}do"Iterations: "0"."
'-+,/'{)))))}%
4:echo(2+2);
#undef X;A!"$%&'()*+-[,.]/0123456789:<=>?@BCDEFGHIJKLMNOPQRSTUVWYZ\^_`abcghijklmopqrstvwxyz{|}~
{`),32>^.}.~
"126,32>''+".~\-'.~\-"'-
"),@`^^32>#.~".~
...[[]]{{}}&%%++++5i
  *++..0011125::::;;;?bbbbcccc{}
"This program wasn't written in "o"GolfScript"", it was built for ""CJam"oo"!"

CJam

"Q"c("ASSW"1$("aRD"(((T1
%\@_@){;_0}*__*)\15
"This program wasn't written in "o"GolfScript"", it was built for ""CJam"oo"!"
"P2"1e3K51_,1>K*$K*~]N*
li__,\mf:i2m1+:*/fb:+
ri:B__(^2/):G/,{_BBG/@-(#G@*G(B2/*+*}/]:+
{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~
[S'-26*N]:Z[S'|:PS24*PN]:RR'(PS5*qi:XD=X0<-X2%2*+:Y[" ^ "_" > ""(O)"" - "__]=S8*Y[" ^ ""   "" < ""(O)"" - "__]=S5*P')NRRXD=[SPS7*'oA*S7*PN]:QR?Y[[SPS5*'oSC*'oS5*PN]:T_R[SPS7*'oS8*'oS7*PN]RRR]=QY2=TR?RRZ
li4H#+2bW%32<2b
q~:R100:H*\d:T/i){R-H*HT-/m]}6*_H)<*
"JamesBdo,"YZ+/)BA*c+Y*Y%:BS@SB)))[JW:Z____)ci+*]U*

โบนัสทอง: คะแนนก่อนหน้านี้ * 0.8

Pyth

เปรียบเทียบ
jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb
มนุษย์หิมะ
M@GCHgc"  ___

  ___
   _"bhzgc" (_*_)
 _===_
 .....
  /_\\"bhzs[g"  \ "@z4\(g"-.oO"@z2g" ,._"@z1g"-.oO"@z3\)g"  / "@z5)s[g" < /"@z4\(gc"   
 : 
] [
> <"b@z6\)g" > \\"@z5)++" ("gc"   
 : 
\" \"
___"bez\)

CJam

ใหญ่
rri:Hri:Vri:Q[q~]3/_Qa3*a+_|$W%:Pf{\a#}:AH/:B0ff*
P,,[AHAW%HBz:+_W%V\V]2/
ff{~@@f=/::|1#}0Ua4*t:R;
P0f<
V{H{BI=J=_2$=
0R{"I>! I+V<J>! J+H<"4/+4/z{~~}%:&1$*\)}%);2$-|t
}fJ}fI
[P,{_La#\1$0t1$f-}*;;]
{:TR=2/~\~V\-,>\f{\_3$=@~H\-,>{Tt}/t}~}/
:~Pf=:~
~]S*N
มนุษย์หิมะ
q:Q;SS"
 _===_,___
 ....., _
  /_\,___
 (_*_)"',/0{Q=~(=}:G~N" \ "4G'(".oO-"_2G",._ "1G@3G')" / "5GN"< / "4G'(" : ] [> <   "3/6G')"> \ "5GNS'(" : \" \"___   "3/7G')

Golfscript

Lorem Ipsum
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet est ut sem commodo scelerisque. Sed ut ultricies enim. Nam eget lectus suscipit, gravida turpis a, volutpat tellus. Cras efficitur luctus neque, at semper massa condimentum at posuere.
นาฬิกาดิจิตอล
:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
สุขสันต์วันเกิด
4,{"Happy Birthday "["To You""Dear GolfScript"]@2==n}%
ลำดับ Farey
~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'

54
จากชื่อฉันหวังว่านี้รวมถึงภาษาลึกลับใหม่ที่เรียกว่า "จริงจัง"
mbomb007

17
@ mbomb007 อย่างจริงจัง: ภาษาที่เรียกใช้ผลลัพธ์ของแหล่งที่มาตีความใน Golfscript เป็น Pyth จากนั้นจะผลักดันค่าการขึ้นบรรทัดใหม่ที่แยกไปยังสแต็ก CJam และในที่สุดก็ส่งออกไปยัง STDOUT จากที่นั่น ใช้งานง่ายขึ้นสองเท่าเท่า perl: ^)
FryAmTheEggman

3
@ mbomb007 ฉันรู้สึกผิดหวังของคุณ ฉันขอแนะนำให้ถามคำถามของคุณเองได้ไหม "เมื่อไม่นานมานี้คำถามต่อไปนี้ถูกถาม ... "
coredump

31
และนี่คือเหตุผลว่าทำไมเพื่อนสาวของฉันจึงถูกคิดค้น
primo

6
ฉันจะมอบ 150 repount ให้กับโซลูชันแรกที่มีสิทธิ์ได้รับโบนัสทองคำและตรวจสอบอินพุตตามการจับคู่รูปแบบมากกว่าโซลูชันที่ใช้งานง่ายของฉันในการรันโปรแกรมผ่านล่าม
Mego

คำตอบ:


2

ทับทิม, (135 + 4) * 0.6 * 0.8 = 66.72

สิ่งนี้รันบน Windows และฉันเหนื่อยเกินกว่าที่จะย่อให้สั้นลงได้ด้วยการทำงานบน Unix

(a=[%w(javaw -jar cjam),%w(python pyth),%w(rubyw golfscript)].map{|c|c[-1]if system(*c,?f,'> NUL','2>','NUL')}-[nil])==[]?'Seriously':a

ฉันทำสิ่งเหล่านี้ แต่ฉันไม่แน่ใจว่าพวกเขาได้รับอนุญาตหรือไม่:

  • เปลี่ยนชื่อcjam-[version].jarไปcjam, pyth.pyไปpyth, ไปgolfscript.rbgolfscript
  • อ่านจากไฟล์fแทนที่จะรับอินพุต (เพิ่มIO.write(?f,gets);ไปยังจุดเริ่มต้นเพื่อแก้ไขปัญหานั้นและความยาวใหม่คือ (153 + 4) * 0.6 * 0.8 = 75.36)

น่าเสียดายที่ฉันไม่สามารถทดสอบได้ (ใช้งานร่วมกับ Windows และไม่มีเวลา) มันดูดีและคะแนนของคุณต่ำกว่าดังนั้นฉันกำลังย้ายเครื่องหมาย
coredump

39

Python 2, 332 * 0.6 * 0.8 = 159.36

import os
from subprocess import*
from tempfile import*
f,n,a=NamedTemporaryFile(delete=0),open(os.devnull,'w'),''
f.write(os.read(0,256))
f.close()
for l in["CJam","java","-jar","cjam.jar"],["Pyth","./pyth.py"],["Golfscript","./golfscript.rb"]:a+=(l[0]+' ')*(call(args=l[1:]+[f.name],stdout=n,stderr=n)>0)
print a or'Probably Perl'

เท่าที่ฉันทราบนี่เป็นกฎ ต้องการล่าม Pyth, CJam และ Golfscript ( pyth.py, cjam.jarและgolfscript.rb) ในไดเรกทอรีปัจจุบันและติดตั้ง Python 3, Java และ Ruby ทดสอบอย่างง่าย: ลองเรียกใช้โปรแกรม ถ้ามันกลับมาพร้อมกับ0เราเราดี ถ้าไม่เป็นเช่นนั้น ไฟล์ชั่วคราวที่มีชื่อ (เช่นไฟล์ที่สร้างขึ้นใน$TMP) ถูกสร้างขึ้นเพื่อเก็บโปรแกรมเนื่องจาก CJam ไม่มีตัวเลือกสคริปต์ การdelete=Falseตั้งค่าสถานะเป็นสิ่งที่จำเป็นเพื่อป้องกันไม่ให้ไฟล์ถูกลบเมื่อปิด (ระบบปฏิบัติการจะจัดการกับเรา) ไฟล์จะต้องปิดก่อนที่จะพยายามอ่านจากมัน (แม้ว่าการล้างไฟล์ด้วยตนเองควรทำงานได้เช่นกัน แต่วิธีนี้ง่ายกว่า) stdoutและstderrถูกเปลี่ยนเส้นทางไปยัง/dev/null เพื่อระงับเอาต์พุต / ข้อผิดพลาด (โปรดทราบว่าสิ่งนี้ทำให้ใช้งานได้กับระบบ * NIX เท่านั้น)

ความสนุกเป็นพิเศษ: ลองเรียกใช้รหัสที่ระบุในทั้ง 4 ภาษาเพื่อดูว่าเราได้รับอะไรบ้าง:

import sys
from subprocess import*
from tempfile import*
c=["Cjam","java","-jar","cjam.jar"]
p=["Pyth","./pyth.py"]
g=["Golfscript","./golfscript.rb"]
e=["Perl","perl"]
f=NamedTemporaryFile(delete=False)
s=sys.stdin.read()
f.write(s)
f.close()
n=open('/dev/null','w+')
a=''
for l in [c,p,g,e]:
    try:
        print '%s: %s'%(l[0],check_output(args=l[1:]+[f.name],stderr=n))
    except:
        continue
n.close()

11
+1 คำตอบที่ดี และต้องใช้ล่ามเพียง 6 ตัวจึงทำได้ดี ;-)
coredump

1
bash, Python 2, Python 3, Ruby, Java, CJam, Pyth, Golfscript - ฉันนับ 8
Mego

2
ถูกตัอง. และด้วยไฟล์อินพุตที่ถูกต้องมันยังสามารถล้างโฮมไดเรกทอรีของคุณ อย่างไรก็ตามนี่เป็นแนวทางที่ถูกต้องฉันไม่รังเกียจ
coredump

เพียงแค่หวังว่าคุณจะไม่ได้รับรายการที่มีลูปไม่สิ้นสุดหรือไม่กลับมาเป็นศูนย์
Paŭlo Ebermann

@ ถ้าโปรแกรมตัวเองล้มเหลวด้วยเหตุผลบางอย่าง (เช่นเมื่อเปิดไฟล์ที่ไม่มีอยู่ - หรือเมื่อมันคาดว่าจะมีข้อโต้แย้งซึ่งฉันสงสัยว่าอาจเกิดขึ้นบ่อยขึ้นสำหรับโปรแกรมที่ใช้งานจริง) ควรคืนค่าที่ไม่เป็นศูนย์ ตามมาตรฐานทศวรรษเก่านั้น นี่ไม่ได้หมายความว่ามันไม่ได้เป็นของภาษานั้น (อาจเป็นเพราะไม่มีกรณีทดสอบประเภทนี้จริง ๆ ) กรณีอื่นอาจรออินพุตเช่นcatโปรแกรม ... อย่างน้อยคุณควรลองเปลี่ยนเส้นทาง / dev / null ไปยังอินพุตด้วยหรือไม่
Paŭlo Ebermann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.