Poważnie, GolfScript, CJam lub Pyth?

56

Jakiś czas temu zadano następujące pytanie: GolfScript, CJam lub Pyth? Opierając się tylko na samym tytule, pomyślałem, że będzie to bardzo miłe wyzwanie, ale niestety okazało się, że jest to pytanie z pytaniem o wskazówki. Oto wyzwanie, które chciałem przeczytać:

Kto powiedział, że w prawdziwym świecie nie używa się golfa? Jak wszyscy wiedzą, stosunek błędów do wiersza kodu jest taki sam, niezależnie od używanego języka programowania, więc istnieje wyraźna szansa na zmniejszenie kosztów debugowania i konserwacji w tych językach. Twoja firma w końcu ujrzała światło i zdecydowała się wykorzystać Golfscript, CJam i Pyth do opracowania swoich produktów.

Niestety, po kilku miesiącach twoje dyski twarde są zaśmiecone fragmentami kodu i nawet nie wiesz, które są napisane w których językach (podejrzewasz nawet niektórych programistów używających Perla).

Musisz napisać narzędzie, które wykryje, w którym języku CJam, Golfscript lub Pyth jest językiem, w którym napisany jest program. Sytuacja jest krytyczna, możesz użyć dowolnego języka, ale pamiętaj, aby był on krótki (przechowywanie danych jest drogie: im więcej bajtów używamy, tym więcej kosztuje).

Generał

  • Najkrótszy kod wygrywa
  • Standardowe luki itp.
  • Nie używaj tłumacza online
  • Możesz napisać funkcję lub program
  • Możesz użyć eval do wykrycia własnego języka

Wejście

  • Twoje dane wejściowe są pobierane ze standardowego strumienia wejściowego lub jako ciąg znaków
  • Dane wejściowe zawierają tylko znaki drukowalne ASCII i linie
  • Rozmiar danych wejściowych wynosi do 256 bajtów

Wynik

  • Dane wyjściowe są drukowane do strumienia wyjściowego lub zwracane jako sekwencja ciągów / symboli
  • Jeśli dane wejściowe są bez wątpienia poprawnym programem X , wydrukuj lub zwróć X , X ∈ {CJam, Pyth, Golfscript}

    Uwaga : „bez wątpienia” nie oznacza, że ​​możesz odpowiadać głupim analizatorem, który konsekwentnie nie wykrywa żadnego języka. W przypadku Pyth spodziewam się, że zostaną rozpoznane proste programy (ale nie zostaną zapisane na stałe ). To samo dotyczy CJam ( ściągawki , przykłady ) i Golfscript ( przykłady ). Poprzednie linki wskazują specyfikacje każdego języka. Jeśli zastosujesz podejście rozmyte / bayesowskie, „bez wątpienia” oznacza z wysokim poziomem pewności (na przykład zdobywasz 99% swojej klasyfikacji). Poniżej znajduje się rzeczywisty zestaw testów.

  • Jeśli dane wejściowe są prawidłowe w wielu językach, każdy wykryty język powinien zostać wydrukowany / zwrócony. Po wydrukowaniu musi istnieć separator między wieloma wyjściami (np. Spacja, nowa linia, przecinek ...).

  • Kolejność wypróbowania języków nie ma znaczenia
  • Nie obchodzi mnie sprawa (CJam, cjam, CJAM, SPAM) [1]
  • Jeśli żaden z powyższych języków nie zostanie wykryty, wydrukuj Probably Perl . Dzięki temu komentarzowi z mbomb007 , w powyższym przypadku możesz również wypisaćSeriously” za karę 4 bajtów (różnica między oboma łańcuchami).

[1] Dla jasności SPAM jest nieprawidłowy

Przykłady

  • Wejście

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • Dane wyjściowe (przykład wielu zwracanych wartości)

    ["Golfscript", "Cjam"]
    
  • Wejście

    3
    
  • Wyjście (przykład na standardowe wyjście)

    golfscript
    cjam
    pyth
    
  • Wejście

    if {} aazd
    
  • Wynik

    Probably Perl
    

W ostatnim przypadku program wejściowy generuje błąd w przypadku wszystkich trzech internetowych tłumaczy.

Punktacja, kryterium wygranej

Najkrótszy kod wygrywa. Dodaj 4 bajty, jeśli wypisujesz „Poważnie”. Następnie zastosuj bonusy.

Nieudane testy

Poniżej znajdują się fragmenty kodu, których nie można rozpoznać jako jeden z trzech powyższych języków.

Jednoliniowe (tj. Jeden wpis na linię)
$^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";
}
Ryba
#ifndef __linux
#include "x.h"
#define X/*\
a=1 set -e
+++++++++++++++++++++_+++++++++++++....Hello World!?:Q:
#endif
    echo "Hello, World!"
    int m(){}

Podstawowy zestaw testów

To są testy, które muszą przejść. Belows są jednej wkładki dla każdego języka, gdzie program powinien wykryć język jest on napisany w (nie sprawdzić, które z nich są poliglota).

Pyt

*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=}{;}?}/

Bonus srebrny: liczba bajtów * 0,6

Wszystkie poprzednie testy muszą zostać zaliczone, a także następujące jednowierszowe. Wszystkie te fragmenty pochodzą z rzeczywistych odpowiedzi CodeGolf.

Pyt

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*

Złoty bonus: poprzedni wynik * 0,8

Pyt

Porównać
jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb
Bałwan
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

Duży
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
Bałwan
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.
Zegar cyfrowy
:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
Wszystkiego najlepszego z okazji urodzin
4,{"Happy Birthday "["To You""Dear GolfScript"]@2==n}%
Sekwencja opłat
~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'
rdzeń rdzeniowy
źródło
54
Z tytułu miałem nadzieję, że będzie to nowy ezoteryczny język o nazwie „Seriously”.
mbomb007
17
@ mbomb007 Poważnie: język, który uruchamia wynik źródła interpretowanego w Golfscript jako Pyth, następnie wypycha wartości rozdzielone znakiem nowej linii na stos CJam i stamtąd generuje stamtąd do STDOUT. Dwa razy łatwiejszy w użyciu niż perl: ^)
FryAmTheEggman
3
@ mbomb007 Czuję twoje rozczarowanie. Czy mogę zasugerować własne pytanie? „Nie tak dawno temu zadano następujące pytanie ...”
rdzeń
31
I właśnie, moi przyjaciele, wymyślono sekstensy.
primo
6
Dam pierwsze repozytorium w wysokości 150 powtórzeń, które kwalifikuje się do premii złotej i weryfikuje dane wejściowe na podstawie dopasowania wzorca, zamiast mojego prostego rozwiązania polegającego na uruchamianiu programów za pośrednictwem tłumaczy.
Mego

Odpowiedzi:

2

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

Działa to w systemie Windows i jestem zbyt zmęczony, aby go skrócić, uruchamiając na Uniksie.

(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

Zrobiłem te rzeczy, ale nie jestem pewien, czy są dozwolone:

  • Zmień nazwę cjam-[version].jarna cjam, pyth.pyna pyth, golfscript.rbna golfscript.
  • Czytaj z pliku fzamiast pobierać dane wejściowe. (Dodaj IO.write(?f,gets);do początku, aby to naprawić, a nowa długość to (153 + 4) * 0,6 * 0,8 = 75,36)
RShields
źródło
Niestety nie mogę go przetestować (połączenie Windows i brak czasu). Wygląda dobrze, a twój wynik jest niższy, więc przesuwam znacznik wyboru.
rdzeń rdzeniowy
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'

O ile mi wiadomo, jest to zgodne z zasadami. Wymaga interpreterów Pyth, CJam i Golfscript ( pyth.py, cjam.jari golfscript.rb) w bieżącym katalogu oraz zainstalowanych Python 3, Java i Ruby. Prosty test: spróbuj uruchomić program. Jeśli to wróci 0, jesteśmy dobrzy. Jeśli nie, jest nieważny. Nazwany plik tymczasowy (np. Plik utworzony w $TMP) jest tworzony w celu przechowywania programu, ponieważ CJam nie ma opcji skryptu. delete=FalseFlaga jest konieczne, aby zapobiec przed usunięciem, gdy jest ona zamknięta (OS zadba o to dla nas) plik. Plik musi zostać zamknięty przed próbą odczytu z niego (chociaż ręczne opróżnianie pliku powinno również działać, ale jest to prostsze). stdouti stderrzostaną przekierowani na/dev/null aby ukryć dane wyjściowe / błędy (zauważ, że dzięki temu działa tylko w systemach * NIX).

Dodatkowa zabawa: spróbuj uruchomić dany kod we wszystkich 4 językach, aby zobaczyć, co otrzymujemy:

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()
Mego
źródło
11
+1 Ładna odpowiedź. I wymaga tylko 6 tłumaczy, dobra robota ;-)
rdzeń
1
bash, Python 2, Python 3, Ruby, Java, CJam, Pyth, Golfscript - liczę 8.
Mego
2
Zgadza się. Przy odpowiednim pliku wejściowym może nawet wyczyścić katalog domowy. W każdym razie jest to prawidłowe podejście, nie mam nic przeciwko.
coredump
Miejmy nadzieję, że nie otrzymasz żadnych programów z niekończącymi się pętlami lub zwracających niezerowe.
Paŭlo Ebermann
@Mego, jeśli sam program z jakiegoś powodu zawiedzie (na przykład podczas otwierania pliku, który nie istnieje - lub gdy oczekuje argumentów, które, jak podejrzewam, mogą się częściej zdarzać w przypadku faktycznie produktywnie wykorzystywanych programów), powinien zwrócić wartość niezerową zgodnie z tym dziesięcioletnim standardem. To nie znaczy, że nie należy do tego języka. (Może to jednak nie być żaden z przypadków testowych tego typu.) Inny przypadek może oczekiwać na dane wejściowe, na przykład catprogram ... może powinieneś przynajmniej spróbować przekierować / dev / null również na dane wejściowe?
Paŭlo Ebermann