정말로 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 %의 점수를 얻음). 실제 테스트 스위트는 아래를 참조하십시오.

  • 입력이 여러 언어로 유효한 경우 감지 된 각 언어를 인쇄 / 반환해야합니다. 인쇄시 여러 출력 (예 : 공백, 줄 바꿈, 쉼표 등) 사이에 구분 기호가 있어야합니다.

  • 언어를 시도하는 순서는 중요하지 않습니다
  • 나는 사건에 관심이 없다 (CJam, cjam, CJAM, SPAM) [1]
  • 경우 위의 언어 중 어느 것도 , 인쇄 감지되지 " Probably Perl" . mbomb007의이 주석 덕분에 위의 경우 Seriously4 바이트의 벌점 (두 문자열의 차이)에 대해 " "를 출력 할 수도 있습니다 .

[1] SPAM은 유효하지 않습니다.

  • 입력

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • 출력 (여러 반환 값의 예)

    ["Golfscript", "Cjam"]
    
  • 입력

    3
    
  • 출력 (표준 출력의 예)

    golfscript
    cjam
    pyth
    
  • 입력

    if {} aazd
    
  • 산출

    Probably Perl
    

마지막 경우, 입력 프로그램 오류 발생 으로 모든 세 가지 온라인 통역을.

득점, 승리 기준

최단 코드 승리. "Seriously"를 출력하면 4 바이트를 추가하십시오. 그런 다음 보너스를 적용하십시오.

실패한 테스트

다음은 위의 세 언어 중 하나로 인식 되지 않아야 하는 스 니펫입니다 .

라이너 1 개 (즉, 라인 당 하나의 항목)
$^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
>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++++++++++++++++++++++++++++++++++++++++++++.
-----------------.
++++++++.
+++++.
--------.
+++++++++++++++.
------------------.
++++++++.
@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(){}

기본 테스트 스위트

그것들은 반드시 통과 해야하는 테스트입니다 . 아래는 프로그램이 작성중인 언어를 감지 해야하는 각 언어에 대한 하나의 라이너 입니다 ( 폴리 글 로트 중 어느 것을 검사하지는 않았습니다).

피스

*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

골프 스크립트

;'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 답변에서 가져옵니다.

피스

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

골프 스크립트

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

피스

비교
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')

골프 스크립트

로렘 입숨
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}%
패 레이 시퀀스
~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'

54
제목에서 "Seriously"라는 새로운 비전 어가 포함되기를 바랐습니다.
mbomb007

17
@ mbomb007 진지하게 : Golfscript에서 Pyth로 해석 된 소스의 결과를 실행 한 다음 줄 바꿈으로 구분 된 값을 CJam 스택으로 푸시하고 마지막으로 STDOUT으로 출력합니다. perl : ^)처럼 두 번 사용하기 쉬움
FryAmTheEggman

3
@ mbomb007 실망합니다. 질문을해도 될까요? "오래 전에, 다음 질문이 제기되었습니다 ..."
coredump

31
그리고 이것이 나의 친구들입니다. 이것이 바로 세방이 발명 된 이유입니다.
primo

6
나는 통역사를 통해 프로그램을 실행하는 간단한 솔루션이 아니라 금 보너스를받을 수있는 첫 번째 솔루션에 150 개의 보상 현상금을 제공하고 패턴 일치를 기반으로 입력을 확인합니다.
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].jarcjam, pyth.pypyth, golfscript.rbgolfscript.
  • f입력하는 대신 파일에서 읽습니다 . ( IO.write(?f,gets);처음에 추가 하여 수정하면 새 길이는 (153 + 4) * 0.6 * 0.8 = 75.36)

불행히도, 나는 그것을 테스트 할 수 없습니다 (Windows와 시간 부족의 조합). 좋아 보이고 점수가 낮아서 체크 표시를 옮기고 있습니다.
coredump

39

파이썬 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.jargolfscript.rb)가 필요하며 Python 3, Java 및 Ruby가 설치되어 있어야합니다. 간단한 테스트 : 프로그램을 실행 해보십시오. 로 반환되면 0좋습니다. 그렇지 않으면 유효하지 않습니다. $TMPCJam에는 스크립트 옵션이 없으므로 이름이 지정된 임시 파일 (예 :에서 작성된 파일 )이 프로그램을 보유하기 위해 작성됩니다. delete=False플래그는이 닫힐 때 (OS가 우리를 위해 그것의 처리됩니다) 삭제되는 파일을 방지 할 필요가있다. 파일을 읽으려고 시도하기 전에 파일을 닫아야합니다 (파일을 수동으로 플러시해도 작동하지만 더 간단합니다). stdoutstderr로 리디렉션됩니다/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) 통역이 필요
코어 덤프

1
bash, Python 2, Python 3, Ruby, Java, CJam, Pyth, Golfscript-나는 8을 ​​센다.
Mego

2
맞습니다. 올바른 입력 파일을 사용하면 홈 디렉토리를 지울 수도 있습니다. 어쨌든, 이것은 유효한 접근 방법입니다. 걱정하지 않습니다.
coredump

무한 루프가 있거나 0이 아닌 값을 반환하는 프로그램이 없기를 바랍니다.
Paŭlo Ebermann

@Mego 프로그램이 존재하지 않는 파일을 열 때 또는 인수를 기대할 때와 같이 어떤 이유로 프로그램 자체가 실패하면 실제로 생산적으로 사용되는 프로그램에서 더 자주 발생할 것으로 의심되는 경우 0이 아닌 값을 반환해야합니다 10 년 전의 표준에 따르면 그렇다고 언어에 속하지 않는 것은 아닙니다. (실제로는 테스트 케이스가 아닐 수도 있습니다.) 다른 경우는 cat프로그램 과 같이 입력을 기다리는 중일 수 있습니다 . 아마도 적어도 / dev / null을 입력으로 리디렉션하려고합니까?
Paŭlo Ebermann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.