Parece que GolfScript gana todo esto. Para que no puedas vencerlos, únete a ellos.
Escribir un intérprete de Golfscript autónomo
Estoy usando la definición de autocontenido para significar, un solo programa: - Así que no pasaré el dinero a algún programa externo para que haga el trabajo por usted.
Casos de prueba:
Las cadenas y los bloques se representan como listas de códigos ASCII. Los tipos no se verifican con estas pruebas, pero deberían ser correctos de todos modos.
test("[50] [60]+", [[50, 60]]);
test("{a} {b}+", [[97, 32, 98]]);
test("'a' 'b'+", [[97, 98]]);
test("' ' 0+", [[32, 48]]);
test("' ' [50]+", [[32, 50]]);
test("{a} 0+", [[97, 32, 48]]);
test("{a} [50]+", [[97, 32, 53, 48]]);
test("5 ~", [-6]);
test('"1 2+"~', [3]);
test('{1 2+}~', [3]);
test('[1 2 3]~', [1, 2, 3]);
test('1`', [[49]]);
test("[1 [2] 'asdf']`", [[91, 49, 32, 91, 50, 93, 32, 34, 97, 115, 100, 102, 34, 93]]);
test('"1"`', [[34, 49, 34]]);
test("{1}`", [[123, 49, 125]]);
test("0!", [1]);
test("[]!", [1]);
test("{}!", [1]);
test("''!", [1]);
test("5!", [0]);
test("[[]]!", [0]);
test("{{}}!", [0]);
test("'asdf'!", [0]);
test("1 2 3 4 @", [1, 3, 4, 2]);
test("1 # 2", [1]);
test("1 2 3 4 5 1 $", [1, 2, 3, 4, 5, 4]);
test("'asdf' $", [[97, 100, 102, 115]]);
test("[5 4 3 1 2]{-1*}$", [[5, 4, 3, 2, 1]]);
test("5 7 +", [12]);
test("'a'{b}+", [[97, 32, 98]]);
test("[1 2 3][4 5]+", [[1, 2, 3, 4, 5]]);
test("1 2-3+", [1, -1]);
test("1 2 -3+", [1, -1]);
test("1 2- 3+", [2]);
test("[5 2 5 4 1 1][1 2]-", [[5, 5, 4]]);
test("2 4*", [8]);
test("2 {2*} 5*", [64]);
test("[1 2 3]2*", [[1, 2, 3, 1, 2, 3]]);
test("3'asdf'*", [[97,115,100,102,97,115,100,102,97,115,100,102]]);
test("[1 2 3]' '*", [[49, 32, 50, 32, 51]]);
test("[1 2 3][4]*", [[1,4,2,4,3]]);
test("'asdf'' '*", [[97,32,115,32,100,32,102]]);
test("[1 [2] [3 [4 [5]]]]' '*", [[49, 32, 2, 32, 3, 4, 5]]);
test("[1 [2] [3 [4 [5]]]][6 7]*", [[1, 6, 7, 2, 6, 7, 3, [4, [5]]]]);
test("[1 2 3 4]{+}*", [10]);
test("'asdf'{+}*", [414]);
test("7 3 /", [2]);
test("[1 2 3 4 2 3 5][2 3]/", [[[1], [4], [5]]]);
test("[1 2 3 4 5] 2/", [[[1, 2], [3, 4], [5]]]);
test("0 1 {10<} { .@+ } /", [8, [1, 1, 2, 3, 5, 8]]);
test("[1 2 3]{1+}/", [2, 3, 4]);
test("7 3 %", [1]);
test("'assdfs' 's'%", [[[97], [100, 102]]]);
test("'assdfs' 's'/", [[[97], [], [100, 102], []]]);
test("[1 2 3 4 5] 2%", [[1, 3, 5]]);
test("[1 2 3 4 5] -1%", [[5, 4, 3, 2, 1]]);
test("[1 2 3] {1+}%", [[2, 3, 4]]);
test("5 3 |", [7]);
test("[5 5 1] [1 3] |", [[5, 1, 3]]);
test("5 3 &", [1]);
test("[1 1 2 2][1 3]&", [[1]]);
test("5 3 ^", [6]);
test("[1 1 2 2][1 3]^", [[2, 3]]);
test("1 2 [\\]", [[2, 1]]);
test("1 2 3 \\", [1, 3, 2]);
test("1 2 3; ", [1, 2]);
test("3 4 <", [1]);
test('"asdf" "asdg" <', [1]);
test("[1 2 3] 2 <", [[1, 2]]);
test("{asdf} -1 <", [[97, 115, 100]]);
test("3 4 >", [0]);
test('"asdf" "asdg" >', [0]);
test("[1 2 3] 2 >", [[3]]);
test("{asdf} -1 >", [[102]]);
test("3 4 =", [0]);
test('"asdf" "asdg" =', [0]);
test("[1 2 3] 2 =", [3]);
test("{asdf} -1 =", [102]);
test("3,", [[0,1,2]]);
test("10,,", [10]);
test("10,{3%},", [[1, 2, 4, 5, 7, 8]]);
test("1 2 .", [1,2,2]);
test("2 8?", [256]);
test(" 5 [4 3 5 1] ?", [2]);
test(" 6 [4 3 5 1] ?", [-1]);
test("[1 2 3 4 5 6] {.* 20>} ?", [5]);
test("5(", [4]);
test("[1 2 3](", [[2, 3], 1]);
test("5)", [6]);
test("[1 2 3])", [[1, 2], 3]);
test("5 {1 0/} or", [5]);
test("5 {1 1+} and", [2]);
test("0 [3] xor", [[3]]);
test("2 [3] xor", [0]);
test("5{1-..}do", [4, 3, 2, 1, 0, 0]);
test("5{.}{1-.}while", [4, 3, 2, 1, 0, 0]);
test("5{.}{1-.}until", [5]);
test("1 2 3 if", [2]);
test("0 2 {1.} if", [1, 1]);
test("[[1 2 3][4 5 6][7 8 9]]zip", [[[1, 4, 7], [2, 5, 8], [3, 6, 9]]]);
test("[1 1 0] 2 base", [6]);
test("6 2 base", [[1, 1, 0]]);
code-golf
golfscript
Adam Speight
fuente
fuente

"The time is #{Time.now}"? ¿Qué tal números de precisión arbitrarios?Respuestas:
Ruby, 5490 bytes
Bueno, puedo jugar golf al intérprete de GolfScript desde 8283 bytes hasta 5490 ...
fuente
Javascript, 2227 bytes
@ Peter Taylor: ¡Desafío aceptado!
_ = 'S = b9b? B ^ 3? "{" +) + "}": \' "\ '+) + \'" \ ': "[" + B6SB "") + "]": "" + b}; $ = b ||! b99b: [b] b6 $ B "" L; M = b9 $ (bb + ""}; A = b? (gb.charCodeAt (0) A (b1)) v = g, v = 3, g, v}; C = b9 (k = b6Ck = b, kb}; a = g, s, O, r = Wj, uX, d, c, i, yPb = (b? $ (bb + ""). match (/ \ '(. | [^ \']) * \ '| "(. | [^"]) * "| -? \\ d + | \\ 043 [^ \\ n ] * | [a-z _] \\ w * | ./imgFi=y=0; z = b [i ++];) "{" Yz?! y ++ Zk = iy? "}" Yz! - yZe = A (bk, i-1B "")) e = 4 \ '"\' YzQ? A (eval (z.replace (" \\ n "," n ")))" \ '"YzQ? A ( z1, -1) .replace (/ (| \ ') / g, "$ 1")) ":" Yz? r [b [i ++]] = (d = s [s-1]) ^ 4? S ( dd: r [z]? r [z] z + "." - 0.1? eval (z) eval ("// ~ t; t98? ts = st ~ t \\ 140A (S (G))) // [ O.uns] JEt, u @ `vEuX, v%` I! U) t% u! TPt3? [32]: [] Xu + tV-5! ~ Tc) RcL # qt / `I! U) Matemáticas. floot / u)! tPv = 0; j% tY0ZvRvv,vvcdvLu ^ 4Pp = 1 ITPFd; \ '. \' u;) ds [s-1] tGdL # {D; HL // * 7I! t) q * t! uPFd; u -;) T? td = dCUd = 8; T || dL8 ^ 4P! U8Zu6M) 6A) d = dC (j? T: [] cd = 8; GdL # {q.) HL // zipt; Fv = c; v -;)! D [v] Zd [v] d [v] c [v]? 7IT) HG) Zcu # t9tuMath.pow (uX) $ t; u = 0; t9 (T? (u = t, G) t) .sort (uZaua, bubb-a} C (s ~ t) Q) = `t! 9ut) Q: 0 | $ (u) Y $ U> N $ U | 0: t0Xu> t | 0V) K ()]: [t + 1] (K.)]: [t-1] & 5v; ~ tc) vc & t | 5dvt | t ^ 5v; k, ut! ~ tc) ^! ~ kc) vc ^ tif`v =? u : t; v ^ 4? A (S (v) v! +! randMath.random () * G) | 0) ". split (" // "+ z) [1] L, \ '{1 $ if }: y {1 $ if}: o {!! {!} *}: xor {.. 0sZOQ = sFfoGs (HctIif (Js.splice (O.)) Kt; s = st9 [tXL)} N`q9t9 $ (u) P) {Q [0] RdT8> 3U (t) V8 // Wfunction (b, X, tY == Z (`; qu '; for (Y = 0; $ =' q`ZYXWVUTRQPNLKJIHGFEDB98765 # '[ Y ++];) con (_. Split ($)) _ = join (pop ()); eval (_)d [v] Zd [v] d [v] c [v]? 7IT) HG) Zcu # t9tuMath.pow (uX) $ t; u = 0; t9 (T? (u = t, G) t). sort (uZaua, bubb-a} C (s ~ t) Q) = `t! 9ut) Q: 0 | $ (u) Y $ U> N $ U | 0: t0Xu> t | 0V) K ()] : [t + 1] (K.)]: [t-1] & 5v; ~ tc) vc & t | 5dvt | t ^ 5v; k, ut! ~ tc) ^! ~ kc) vc ^ tif`v =? u: t; v ^ 4? A (S (v) v! +! randMath.random () * G) | 0) ". split (" // "+ z) [1] L, \ '{1 $ if}: y {1 $ if}: o {!! {!} *}: xor {.. 0sZOQ = sFfoGs (HctIif (Js.splice (O.)) Kt; s = st9 [tXL)} N`q9t9 $ (u) P) {Q [0] RdT8> 3U (t) V8 // Wfunction (b, X, tY == Z (`; qu '; for (Y = 0; $ =' q`ZYXWVUTRQPNLKJIHGFEDB98765 # ' [Y ++];) con (_. Split ($)) _ = join (pop ()); eval (_)d [v] Zd [v] d [v] c [v]? 7IT) HG) Zcu # t9tuMath.pow (uX) $ t; u = 0; t9 (T? (u = t, G) t). sort (uZaua, bubb-a} C (s ~ t) Q) = `t! 9ut) Q: 0 | $ (u) Y $ U> N $ U | 0: t0Xu> t | 0V) K ()] : [t + 1] (K.)]: [t-1] & 5v; ~ tc) vc & t | 5dvt | t ^ 5v; k, ut! ~ tc) ^! ~ kc) vc ^ tif`v =? u: t; v ^ 4? A (S (v) v! +! randMath.random () * G) | 0) ". split (" // "+ z) [1] L, \ '{1 $ if}: y {1 $ if}: o {!! {!} *}: xor {.. 0sZOQ = sFfoGs (HctIif (Js.splice (O.)) Kt; s = st9 [tXL)} N`q9t9 $ (u) P) {Q [0] RdT8> 3U (t) V8 // Wfunction (b, X, tY == Z (`; qu '; for (Y = 0; $ =' q`ZYXWVUTRQPNLKJIHGFEDB98765 # ' [Y ++];) con (_. Split ($)) _ = join (pop ()); eval (_)0sZOQ = sFfoGs (HctIif (Js.splice (O.)) Kt; s = st9 [tXL)} N`q9t9 $ (u) P) {Q [0] RdT8> 3U (t) V8 // Wfunction (b, X, tY == Z (`; qu '; for (Y = 0; $ =' q`ZYXWVUTRQPNLKJIHGFEDB98765 # '[Y ++];) con (_. Split ($)) _ = join (pop ()); eval (_)0sZOQ = sFfoGs (HctIif (Js.splice (O.)) Kt; s = st9 [tXL)} N`q9t9 $ (u) P) {Q [0] RdT8> 3U (t) V8 // Wfunction (b, X, tY == Z (`; qu '; for (Y = 0; $ =' q`ZYXWVUTRQPNLKJIHGFEDB98765 # '[Y ++];) con (_. Split ($)) _ = join (pop ()); eval (_)Nota: Contiene algunos caracteres de control, sin embargo, nada fuera de ASCII. Aquí hay un enlace directo al archivo: gs.js . El código proporciona una función
aque toma el código Golfscript como un parámetro único y devuelve la pila resultante como una matriz, con cadenas y bloques representados como ASCII.Diferencias con el intérprete oficial:
print(aunque sería fácil de agregar)También hice un montón de casos de prueba y configuré un pequeño formulario para ejecutar el código Golfscript: http://copy.sh/golfscript/
Aquí hay unos ejemplos:
Esta es mi biblioteca estándar de Golfscript, las sugerencias son bienvenidas:
fuente
;[1 2]{+}*parece un bucle para siempre en lugar de evaluar casi instantáneamente3. Todo lo demás que he probado hasta ahora ha funcionado. Hará más pruebas más tarde.;[1 2]{+}*funciona para mí (también pasan todos los casos de prueba), pero este error puede aparecer debido al estado global. Lo estoy investigando ...11:10 10 *no se muestra121como debería. También parece manejar la pila vacía de manera inconsistente:;5 p 4 * pno debería funcionar en absoluto, pero da20.pno está definida