Серйозно, 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!')
Брейнфук
>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++++++++++++++++++++++++++++++++++++++++++++.
-----------------.
++++++++.
+++++.
--------.
+++++++++++++++.
------------------.
++++++++.
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(){}

Основний тестовий набір

Це тести, які треба пройти. Нижче наведено одне вкладиш для кожної мови, де ваша програма повинна виявити мову, на якій вона написана (я не перевіряв, який із них є поліглотом).

Піт

*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
З назви я сподівався, що це включає нову езотеричну мову під назвою "Серйозно".
mbomb007

17
@ mbomb007 Серйозно: мова, яка запускає результат джерела, інтерпретованого в Golfscript як Pyth, потім висуває розділені значення нового рядка на стек CJam і, нарешті, виводить звідти STDOUT. Удвічі простіший у використанні, як perl: ^)
FryAmTheEggman

3
@ mbomb007 Я відчуваю ваше розчарування. Чи можу я запропонувати задати власне запитання? "Не так давно було задано наступне питання ..."
coredump

31
І це, друзі мої, ось чому винайшли шебанги.
прима

6
Я дам винагороду в розмірі 150 повторних пропозицій першому рішенню, яке підходить до золотого бонусу, і підтверджує вхідні дані на основі відповідності шаблонів, а не моєму простому рішенню запуску програм через інтерпретаторів.
Мего

Відповіді:


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)

На жаль, я не можу його перевірити (поєднання 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.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

@Mego, якщо сама програма з якихось причин виходить з ладу (наприклад, при відкритті файлу, який не існує - або коли він очікує аргументів, які, як я підозрюю, трапляються частіше для фактично продуктивно використовуваних програм), він повинен повернути ненульове значення відповідно до цього десятирічного стандарту. Це не означає, що він не належить до цієї мови. (Можливо, жоден із тестових випадків насправді такого типу не існує.) Ще один випадок може чекати на введення, як catпрограма ... можливо, вам слід хоча б спробувати перенаправити / dev / null також на вхід?
Paŭlo Ebermann
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.