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
-
"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
Compararjdm@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
Granderri: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 IpsumLorem 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}'
Respuestas:
Rubí, (135 + 4) * 0.6 * 0.8 = 66.72
Esto se ejecuta en Windows y estoy demasiado cansado para acortarlo mediante Unix.
Hice estas cosas pero no estoy seguro de si están permitidas:
cjam-[version].jar
acjam
,pyth.py
apyth
,golfscript.rb
agolfscript
.f
lugar de obtener información. (AgregueIO.write(?f,gets);
al principio para arreglar eso, y la nueva longitud es (153 + 4) * 0.6 * 0.8 = 75.36)fuente
Python 2, 332 * 0.6 * 0.8 = 159.36
Que yo sepa, esto está dentro de las reglas. Requiere que los intérpretes Pyth, Cjam y Golfscript (
pyth.py
,cjam.jar
ygolfscript.rb
) en el directorio actual, y Python 3, instalado Java y Ruby. Prueba simple: intente ejecutar el programa. Si regresa con0
, 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. Eldelete=False
indicador 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).stdout
ystderr
son 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:
fuente
cat
programa ... ¿tal vez debería al menos intentar redirigir / dev / null también a la entrada?