En serio, ¿GolfScript, CJam o Pyth?

56

Hace algún tiempo, se hizo la siguiente pregunta: GolfScript, CJam o Pyth? Basado solo en el título, pensé que sería un desafío muy agradable, pero desafortunadamente, resultó ser una pregunta para pedir consejos. Aquí está el desafío que quería leer:

¿Quién dijo que los idiomas de golf no se usaban en el mundo real? Como todos saben, la proporción de errores por línea de código es la misma independientemente del lenguaje de programación utilizado, por lo que existe una clara oportunidad de reducir los costos de depuración y mantenimiento con esos idiomas. Su empresa finalmente vio la luz y decidió utilizar Golfscript, CJam y Pyth para desarrollar sus productos.

Desafortunadamente, después de un par de meses, sus discos duros están llenos de fragmentos de código y ni siquiera sabe cuáles están escritos en qué idiomas (incluso sospecha que algunos de sus programadores usan Perl).

Debe escribir una herramienta para detectar cuál de CJam, Golfscript o Pyth es el idioma en el que se escribe un programa. La situación es crítica, puede usar el idioma que desee, pero sea breve (el almacenamiento de datos es costoso: cuantos más bytes usamos, más cuesta).

General

  • El código más corto gana
  • Lagunas estándar, etc.
  • No use un intérprete en línea.
  • Puedes escribir una función o un programa
  • Puedes usar eval para detectar tu propio idioma

Entrada

  • Su entrada se toma de la secuencia de entrada estándar o como una cadena
  • La entrada contiene solo caracteres ASCII imprimibles y avances de línea
  • El tamaño de la entrada es de hasta 256 bytes.

Salida

  • La salida se imprime en la secuencia de salida o se devuelve como una secuencia de cadenas / símbolos
  • Si la entrada es sin duda un programa X válido , imprima o devuelva X , X ∈ {CJam, Pyth, Golfscript}

    Observación : "sin lugar a dudas" no significa que se le permita responder con un analizador tonto que constantemente no detecta ningún idioma. Para Pyth , espero que se reconozcan los Programas simples (pero sin codificación fija). Lo mismo ocurre con CJam ( hoja de trucos , ejemplos ) y Golfscript ( ejemplos ). Los enlaces anteriores apuntan a las especificaciones de cada idioma. Si utiliza un enfoque difuso / bayesiano, "sin duda" significa con un alto nivel de confianza (por ejemplo, obtiene un puntaje del 99%). Vea a continuación el conjunto de pruebas real.

  • Si la entrada es válida en varios idiomas, cada idioma detectado debe imprimirse / devolverse. Cuando se imprime, debe haber un separador entre múltiples salidas (por ejemplo, espacio, nueva línea, coma ...).

  • El orden en que se prueban los idiomas no importa
  • No me importa el caso (CJam, cjam, CJAM, SPAM) [1]
  • Si no se detecta ninguno de los idiomas anteriores , imprima " Probably Perl" . Gracias a este comentario de mbomb007 , en el caso anterior también puede " Seriously" emitir una penalización de 4 bytes (la diferencia entre ambas cadenas).

[1] Para ser claros, el SPAM no es válido

Ejemplos

  • Entrada

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • Salida (ejemplo de múltiples valores de retorno)

    ["Golfscript", "Cjam"]
    
  • Entrada

    3
    
  • Salida (ejemplo en salida estándar)

    golfscript
    cjam
    pyth
    
  • Entrada

    if {} aazd
    
  • Salida

    Probably Perl
    

En el último caso, el programa de entrada produce un error con los tres intérpretes en línea.

Puntuación, criterio ganador

El código más corto gana. Agregue 4 bytes si genera "En serio". Luego, aplique bonificaciones.

Pruebas reprobadas

Los siguientes son fragmentos que no deben reconocerse como ninguno de los tres idiomas anteriores.

One-liners (es decir, una entrada por línea)
$^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";
}
Pescado
#ifndef __linux
#include "x.h"
#define X/*\
a=1 set -e
+++++++++++++++++++++_+++++++++++++....Hello World!?:Q:
#endif
    echo "Hello, World!"
    int m(){}

Suite de prueba básica

Esas son pruebas que deben pasar. Belows son de una sola línea para cada idioma en que su programa debe detectar el idioma que se está escribiendo en (no el registro cuales de ellos son políglota).

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

Bonificación de plata: recuento de bytes * 0.6

Todas las pruebas anteriores deben pasar, así como las siguientes frases. Todos esos fragmentos están tomados de las respuestas reales de 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*

Bonificación de oro: puntaje anterior * 0.8

Pyth

Comparar
jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb
Monigote de nieve
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

Grande
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
Monigote de nieve
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.
Reloj digital
:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
Feliz cumpleaños
4,{"Happy Birthday "["To You""Dear GolfScript"]@2==n}%
Secuencia de despedida
~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'
volcado de memoria
fuente
54
Desde el título, esperaba que esto incluyera un nuevo lenguaje esotérico llamado "En serio".
mbomb007
17
@ mbomb007 En serio: un lenguaje que ejecuta el resultado de la fuente interpretada en Golfscript como Pyth, luego empuja los valores separados de nueva línea en una pila CJam y finalmente sale a STDOUT desde allí. El doble de fácil de usar que perl: ^)
FryAmTheEggman
3
@ mbomb007 Siento tu decepción. ¿Puedo sugerirle que haga su propia pregunta? "No hace mucho tiempo, se hizo la siguiente pregunta ..."
coredump
31
Y esto, amigos míos, es por qué se inventaron los shebangs.
primo
66
Daré una recompensa de 150 repeticiones a la primera solución que sea elegible para el bono de oro y valide las entradas en función de la coincidencia de patrones, en lugar de mi solución simple de ejecutar los programas a través de los intérpretes.
Mego

Respuestas:

2

Rubí, (135 + 4) * 0.6 * 0.8 = 66.72

Esto se ejecuta en Windows y estoy demasiado cansado para acortarlo mediante 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

Hice estas cosas pero no estoy seguro de si están permitidas:

  • Renombrar cjam-[version].jara cjam, pyth.pya pyth, golfscript.rba golfscript.
  • Leer desde el archivo en flugar de obtener información. (Agregue IO.write(?f,gets);al principio para arreglar eso, y la nueva longitud es (153 + 4) * 0.6 * 0.8 = 75.36)
RShields
fuente
Desafortunadamente, no puedo probarlo (una combinación de Windows y falta de tiempo). Se ve bien y su puntaje es más bajo, así que estoy moviendo la marca de verificación.
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'

Que yo sepa, esto está dentro de las reglas. Requiere que los intérpretes Pyth, Cjam y Golfscript ( pyth.py, cjam.jary golfscript.rb) en el directorio actual, y Python 3, instalado Java y Ruby. Prueba simple: intente ejecutar el programa. Si regresa con 0, estamos bien. Si no, no es válido. Se crea un archivo temporal con nombre (por ejemplo, un archivo creado en $TMP) para contener el programa, ya que CJam no tiene una opción de script. El delete=Falseindicador es necesario para evitar que el archivo se elimine cuando se cierra (el sistema operativo se encargará de nosotros). El archivo debe cerrarse antes de intentar leerlo (aunque el vaciado manual del archivo también debería funcionar, pero esto es más simple). stdouty stderrson redirigidos a/dev/null para suprimir la salida / errores (tenga en cuenta que esto hace que solo funcione en sistemas * NIX).

Diversión adicional: intente ejecutar el código dado en los 4 idiomas, para ver qué obtenemos:

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
fuente
11
+1 Buena respuesta. Y solo requiere 6 intérpretes para funcionar, bien hecho ;-)
coredump
1
bash, Python 2, Python 3, Ruby, Java, CJam, Pyth, Golfscript - Cuento 8.
Mego
2
Eso es correcto. Y con el archivo de entrada correcto, incluso puede borrar su directorio de inicio. De todos modos, este es un enfoque válido, no me importa.
coredump
Solo esperemos que no obtenga programas con bucles interminables o que no sean cero.
Paŭlo Ebermann
@Mego si un programa falla por algún motivo (como al abrir un archivo que no existe, o cuando está esperando argumentos, lo que sospecho que podría suceder con más frecuencia para los programas realmente utilizados de manera productiva), debería devolver un valor distinto de cero de acuerdo con ese estándar de una década. Esto no significa que no pertenece a ese idioma. (Sin embargo, es posible que ninguno de los casos de prueba sea realmente de ese tipo). Otro caso podría estar esperando entrada, como un catprograma ... ¿tal vez debería al menos intentar redirigir / dev / null también a la entrada?
Paŭlo Ebermann