Nghiêm túc, GolfScript, CJam, hay Pyth?


56

Cách đây một thời gian, câu hỏi sau đây đã được hỏi: GolfScript, CJam hay Pyth? Chỉ dựa trên tiêu đề, tôi nghĩ rằng nó sẽ là một thử thách rất hay, nhưng thật không may, hóa ra đó là một câu hỏi yêu cầu lời khuyên. Đây là thử thách tôi muốn đọc:

Ai nói ngôn ngữ chơi gôn không được sử dụng trong thế giới thực? Như mọi người đều biết, tỷ lệ lỗi trên mỗi dòng mã là độc lập với ngôn ngữ lập trình đang được sử dụng, do đó có một cơ hội rõ ràng để giảm chi phí sửa lỗi và bảo trì với các ngôn ngữ đó. Công ty của bạn cuối cùng đã nhìn thấy ánh sáng và quyết định sử dụng Golfscript, CJam và Pyth để phát triển sản phẩm của mình.

Thật không may, sau một vài tháng, các ổ đĩa cứng của bạn bị lộn xộn với các đoạn mã và bạn thậm chí không biết những ngôn ngữ nào được viết bằng ngôn ngữ nào (thậm chí bạn còn nghi ngờ một số lập trình viên của mình sử dụng Perl).

Bạn phải viết một công cụ để phát hiện ra CJam, Golfscript hoặc Pyth là ngôn ngữ mà chương trình được viết. Tình hình rất quan trọng, bạn có thể sử dụng bất kỳ ngôn ngữ nào bạn muốn, nhưng vui lòng giữ cho nó ngắn gọn (lưu trữ dữ liệu đắt tiền: chúng tôi sử dụng càng nhiều byte, chi phí càng nhiều).

Chung

  • Mã ngắn nhất giành chiến thắng
  • Lỗ hổng tiêu chuẩn, vv
  • Không sử dụng trình thông dịch trực tuyến
  • Bạn có thể viết một chức năng hoặc một chương trình
  • Bạn có thể sử dụng eval để phát hiện ngôn ngữ của riêng bạn

Đầu vào

  • Đầu vào của bạn được lấy từ luồng đầu vào tiêu chuẩn hoặc dưới dạng chuỗi
  • Đầu vào chỉ chứa các ký tự và nguồn cấp dữ liệu có thể in ASCII
  • Kích thước của đầu vào dài tới 256 byte

Đầu ra

  • Đầu ra được in ra luồng đầu ra hoặc được trả về dưới dạng một chuỗi các chuỗi / ký hiệu
  • Nếu đầu vào chắc chắn là một chương trình X hợp lệ , hãy in hoặc trả về X , X ∈ {CJam, Pyth, Golfscript}

    Lưu ý : "không nghi ngờ gì" không có nghĩa là bạn được phép trả lời bằng máy phân tích câm mà không phát hiện ra bất kỳ ngôn ngữ nào. Đối với Pyth , tôi hy vọng các Chương trình đơn giản sẽ được công nhận (nhưng không có mã hóa cứng). Điều tương tự cũng xảy ra với CJam ( cheat sheet , ví dụ ) và Golfscript ( ví dụ ). Các liên kết trước chỉ đến thông số kỹ thuật của từng ngôn ngữ. Nếu bạn sử dụng phương pháp mờ / bayes, "không nghi ngờ gì" có nghĩa là với mức độ tin cậy cao (ví dụ, bạn đạt 99% với phân loại của mình). Xem dưới đây cho bộ thử nghiệm thực tế.

  • Nếu đầu vào hợp lệ bằng nhiều ngôn ngữ, mỗi ngôn ngữ được phát hiện sẽ được in / trả lại. Khi được in, phải có một dấu phân cách giữa nhiều đầu ra (ví dụ: khoảng trắng, dòng mới, dấu phẩy ...).

  • Thứ tự các ngôn ngữ được thử không quan trọng
  • Tôi không quan tâm đến trường hợp (CJam, cjam, CJAM, SPAM) [1]
  • Nếu không có ngôn ngữ nào ở trên được phát hiện, hãy in " Probably Perl" . Nhờ nhận xét này từ mbomb007 , trong trường hợp trên, bạn cũng có thể xuất " Seriously" cho hình phạt 4 byte (sự khác biệt giữa cả hai chuỗi).

[1] Để rõ ràng, SPAM không hợp lệ

Ví dụ

  • Đầu vào

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • Đầu ra (ví dụ về nhiều giá trị trả về)

    ["Golfscript", "Cjam"]
    
  • Đầu vào

    3
    
  • Đầu ra (ví dụ về đầu ra tiêu chuẩn)

    golfscript
    cjam
    pyth
    
  • Đầu vào

    if {} aazd
    
  • Đầu ra

    Probably Perl
    

Trong trường hợp cuối cùng, chương trình đầu vào tạo ra lỗi Với cả ba thông dịch viên trực tuyến.

Ghi điểm, tiêu chí chiến thắng

Mã ngắn nhất giành chiến thắng. Thêm 4 byte nếu bạn xuất "Nghiêm túc". Sau đó, áp dụng tiền thưởng.

Không kiểm tra

Sau đây là những đoạn không được công nhận là bất kỳ ngôn ngữ nào trong ba ngôn ngữ trên.

Một lớp lót (tức là một mục nhập trên mỗi dòng)
$^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(){}

Bộ kiểm tra cơ bản

Đó là những bài kiểm tra phải vượt qua. Belows là một lớp lót cho mỗi ngôn ngữ trong đó chương trình của bạn phải phát hiện ngôn ngữ mà nó đang được viết (Tôi không kiểm tra ngôn ngữ nào trong số đó là polyglot).

Bình

*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

Golf

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

Camam

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

Phần thưởng bạc: đếm byte * 0,6

Tất cả các bài kiểm tra trước phải vượt qua, cũng như các lớp lót sau. Tất cả các đoạn được lấy từ các câu trả lời CodeGolf thực tế.

Bình

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

Golf

);:|;{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"!"

Camam

"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*

Phần thưởng vàng: điểm trước * 0,8

Bình

So sánh
jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb
Người tuyết
M@GCHgc"  ___

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

Camam

Lớn
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
Người tuyết
q:Q;SS"
 _===_,___
 ....., _
  /_\,___
 (_*_)"',/0{Q=~(=}:G~N" \ "4G'(".oO-"_2G",._ "1G@3G')" / "5GN"< / "4G'(" : ] [> <   "3/6G')"> \ "5GNS'(" : \" \"___   "3/7G')

Golf

Lorem
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.
Đồng hồ kỹ thuật số
:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
Chúc mừng sinh nhật
4,{"Happy Birthday "["To You""Dear GolfScript"]@2==n}%
Trình tự giá vé
~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'

54
Từ tiêu đề, tôi đã hy vọng điều này bao gồm một ngôn ngữ bí truyền mới gọi là "Nghiêm túc".
mbomb007

17
@ mbomb007 Nghiêm túc: một ngôn ngữ chạy kết quả của nguồn được diễn giải trong Golfscript là Pyth, sau đó đẩy các giá trị phân tách dòng mới vào ngăn xếp CJam và cuối cùng xuất ra STDOUT từ đó. Hai lần dễ sử dụng như perl: ^)
FryAmTheEggman

3
@ mbomb007 Tôi cảm thấy thất vọng của bạn. Tôi có thể đề nghị đặt câu hỏi của riêng bạn? "Cách đây không lâu, câu hỏi sau đây đã được hỏi ..."
coredump

31
Và đây, các bạn của tôi, là lý do tại sao shebang được phát minh.
primo

6
Tôi sẽ đưa tiền thưởng 150 lần cho giải pháp đầu tiên đủ điều kiện nhận thưởng vàng và xác thực các đầu vào dựa trên khớp mẫu, thay vì giải pháp đơn giản của tôi là chạy các chương trình thông qua trình thông dịch.
Mego

Câu trả lời:


2

Ruby, (135 + 4) * 0,6 * 0,8 = 66,72

Điều này chạy trên Windows và tôi quá mệt mỏi để rút ngắn nó bằng cách chạy trên 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

Tôi đã làm những điều này nhưng tôi không chắc liệu chúng có được phép hay không:

  • Đổi tên cjam-[version].jarthành cjam, pyth.pythành pyth, golfscript.rbđể golfscript.
  • Đọc từ tập tin fthay vì nhận đầu vào. (Thêm IO.write(?f,gets);vào đầu để sửa lỗi đó và độ dài mới là (153 + 4) * 0,6 * 0,8 = 75,36)

Thật không may, tôi không thể kiểm tra nó (sự kết hợp giữa Windows và thiếu thời gian). Có vẻ tốt và điểm của bạn thấp hơn, vì vậy tôi đang di chuyển dấu kiểm.
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'

Theo như tôi biết, đây là trong các quy tắc. Yêu cầu các trình thông dịch Pyth, CJam và Golfscript ( pyth.py, cjam.jargolfscript.rb) trong thư mục hiện tại và Python 3, Java và Ruby đã cài đặt. Kiểm tra đơn giản: thử chạy chương trình. Nếu nó trở lại với 0, chúng tôi tốt. Nếu không, nó không hợp lệ. Một tệp tạm thời có tên (ví dụ: một tệp được tạo trong $TMP) được tạo để giữ chương trình, vì CJam không có tùy chọn tập lệnh. Các delete=Falselá cờ là cần thiết để ngăn chặn các tập tin không bị xóa khi nó được đóng lại (hệ điều hành sẽ chăm sóc nó cho chúng ta). Tập tin phải được đóng lại trước khi cố gắng đọc từ nó (mặc dù việc xóa tập tin theo cách thủ công cũng sẽ hoạt động, nhưng điều này đơn giản hơn). stdoutstderrđược chuyển hướng đến/dev/null để chặn đầu ra / lỗi (lưu ý rằng điều này làm cho nó chỉ hoạt động trên các hệ thống * NIX).

Thú vị hơn: hãy thử chạy mã đã cho bằng cả 4 ngôn ngữ, để xem những gì chúng tôi nhận được:

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 Câu trả lời hay. Và nó chỉ cần 6 phiên dịch viên để chạy, hoàn thành tốt ;-)
coredump

1
bash, Python 2, Python 3, Ruby, Java, CJam, Pyth, Golfscript - Tôi đếm 8.
Mego

2
Đúng rồi. Và với tệp đầu vào đúng, nó thậm chí có thể xóa sạch thư mục chính của bạn. Dù sao, đây là một cách tiếp cận hợp lệ, tôi không bận tâm.
coredump

Chỉ cần hy vọng bạn không nhận được chương trình nào với các vòng lặp vô tận hoặc trả về giá trị khác không.
Paulo Ebermann

@Mego nếu một chương trình tự thất bại vì một số lý do (như khi mở tệp không tồn tại - hoặc khi nó đang chờ đợi các đối số, mà tôi nghi ngờ có thể xảy ra thường xuyên hơn đối với các chương trình được sử dụng thực sự hiệu quả), nó sẽ trả về giá trị khác không theo tiêu chuẩn thập kỷ đó. Điều này không có nghĩa là nó không thuộc về ngôn ngữ đó. (Tuy nhiên, có thể không có trường hợp thử nghiệm nào thực sự thuộc loại đó.) Một trường hợp khác có thể đang chờ đầu vào, như catchương trình ... ít nhất bạn có nên thử chuyển hướng / dev / null sang đầu vào không?
Paŭlo Ebermann
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.