Серьезно, 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 , в вышеупомянутом случае вы также можете вывести " Seriously" для штрафа в 4 байта (разница между обеими строками).

[1] Просто чтобы прояснить, СПАМ недействителен

Примеры

  • вход

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • Вывод (пример нескольких возвращаемых значений)

    ["Golfscript", "Cjam"]
    
  • вход

    3
    
  • Вывод (пример на стандартный вывод)

    golfscript
    cjam
    pyth
    
  • вход

    if {} aazd
    
  • Выход

    Probably Perl
    

В последнем случае программа ввода выдает ошибку С Всеми тремя онлайн - переводчиками.

Подсчет очков, критерий победы

Самый короткий код выигрыша. Добавьте 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(){}

Базовый набор тестов

Это тесты, которые должны пройти. Ниже приведены однострочники для каждого языка, где ваша программа должна определить язык, на котором она написана (я не проверял, какой из них является полиглотом).

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 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}'
CoreDump
источник
54
Из названия я надеялся, что это включало новый эзотерический язык под названием «Серьезно».
mbomb007
17
@ mbomb007 Серьезно: язык, который запускает результат источника, интерпретируемого в Golfscript как Pyth, затем помещает значения, разделенные новой строкой, в стек CJam и, наконец, выводит их в STDOUT. Вдвое проще в использовании, чем в perl: ^)
FryAmTheEggman
3
@ mbomb007 Я чувствую твое разочарование. Могу ли я предложить задать свой вопрос? «Не так давно был задан следующий вопрос ...»
coredump,
31
И именно поэтому, друзья мои, были изобретены шебанги.
Примо
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].jarв cjam, pyth.pyчтобы pyth, golfscript.rbчтобы golfscript.
  • Читать из файла fвместо того, чтобы получать ввод. (Добавьте IO.write(?f,gets);в начало, чтобы исправить это, и новая длина будет (153 + 4) * 0,6 * 0,8 = 75,36)
RShields
источник
К сожалению, я не могу это проверить (сочетание 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.
Мего
2
Верно. И с правильным входным файлом, он может даже стереть ваш домашний каталог. Во всяком случае, это правильный подход, я не против.
coredump
Просто будем надеяться, что у вас нет программ с бесконечными циклами или возвращающими ненулевые значения.
Пауло Эберманн
@Mego, если сама программа по какой-то причине дает сбой (например, при открытии файла, который не существует - или когда он ожидает аргументы, что, как я подозреваю, может случиться чаще для действительно продуктивно используемых программ), он должен возвращать ненулевое значение в соответствии с этим десятилетним стандартом. Это не значит, что он не принадлежит этому языку. (Хотя, возможно, ни один из тестовых примеров на самом деле не относится к этому типу.) Другой случай может ожидать ввода, например, catпрограммы ... может быть, вам следует хотя бы попытаться перенаправить / dev / null также на вход?
Paŭlo Ebermann