¿Qué consejos generales tienes para jugar al golf en INTERCAL ? Estoy buscando ideas que puedan aplicarse a los desafíos de golf de código y que también sean al menos algo específicas para INTERCAL (es decir, "eliminar comentarios" no es una respuesta útil).
Sé que los idiomas exóticos pueden ser realmente útiles para ganar concursos de golf, pero no veo mucho código INTERCAL por aquí. ¿Tiene algún consejo que pueda ayudar a las personas a obtener tamaños de código competitivos con INTERCAL? ¿Podría este lenguaje ser competitivo alguna vez?
INTERCAL está tan infrautilizado que ni siquiera tiene una etiqueta. Muy triste...
Despite the language's intentionally obtuse and wordy syntax,
Respuestas:
La eliminación de espacios en blanco / "ruido" puede ir más allá de lo esperado
INTERCAL es un lenguaje insensible a los espacios en blanco. Sin embargo, a diferencia de la mayoría de los idiomas insensibles al espacio en blanco, la insensibilidad va mucho más allá de lo que cabría esperar.
Por ejemplo,
DO NOT
son dos tokens, pero se pueden escribirDONOT
sin que el analizador se queje (en casi cualquier implementación ampliamente utilizada). (Por supuesto, también podría escribirDON'T
, pero no es ningún terser. Sin embargo, podría ser más fácil de leer.PLEASEN'T
Probablemente sea más difícil de leer quePLEASE NOT
eso). En realidad, existe cierto debate sobre si el espacio en blanco hace algo; al menos un analizador INTERCAL lo permite incluso dentro de constantes numéricas (no es que eso sea muy útil cuando se juega al golf). Una cosa a tener en cuenta es que los espacios en blanco de la eliminaciónDO READ OUT
da lo que puede confundir a algunos analizadores INTERCAL de mayor edad debido a la incrustadoDOREADOUT
DO
(aunque sus autores generalmente consideran que esto es un error y, por lo tanto, hoy en día generalmente funciona en un programa válido, no es aconsejable colocar un código como este cerca de un error de sintaxis, ya que puede ser mucho más difícil de eliminar).También recuerde que puede superponer caracteres para ahorrar espacio. En ASCII, solo puedes lograr esto con
'.
→!
, pero ese es un truco muy útil por derecho propio. (Cuando no está utilizando matrices, no existe la posibilidad de una ambigüedad de chispas incluso cuando todos sus caracteres de agrupación son iguales, por lo que para las entradas de golf, se recomienda seguir solo a'
menos que un subíndice de matriz realmente requiera a"
). representado en un byte usando la?
abreviatura (C-INTERCAL) o Latin-1 para¥
(CLC-INTERCAL), en lugar de los tres que necesita INTERCAL-72.fuente
Concéntrese en hacer todo el trabajo posible en una sola declaración
Los identificadores de declaración de INTERCAL son bastante detallados;
DO
hay dos caracteres de ruido en cada declaración, el nombre de la declaración en sí también tiende a ser bastante largo, y debe agregarPLEASE
uno de vez en cuando para mantener contento al analizador. (Lo mejor que puede hacer es una relación de cuatroDO
a unoPLEASE
, lo que significa que está usando 14 caracteres en identificadores por cada 5 comandos.) Por otro lado, la sintaxis de la expresión es bastante concisa (ridícula, pero concisa). Esto significa que a menudo vale la pena ajustar parte de su programa en una sola expresión, incluso cuando usar múltiples declaraciones sería una forma más "natural" de hacer las cosas.Por ejemplo, si desea asignar
#1
a.1
y#2
que.2
, en lugar de hacerlo en la forma obvia INTERCAL-72:Vale la pena considerar sobrecargar una variable aleatoria para permitirle asignar ambos a la vez:
(
:1/!1$.2'
incluido en algún lugar anterior en el programa; tenga en cuenta que esta notación es posterior a INTERCAL-72 de una manera considerable, por lo que deberá usar un INTERCAL moderno para que esto funcione). Esto es solo un poco más largo, incluso si tiene en cuenta la configuración, y se acorta si alguna vez necesita, o puede organizar, asignar simultáneamente.1
y.2
más de una vez.No es solo calcular comandos donde funciona este truco. Si necesita esconder una variable dos veces, no lo haga así:
pero así:
(La
+
notación funciona para la mayoría de los comandos donde conceptualmente podría tener sentido).fuente
Use un solo RESUME para todos los estilos INTERCAL-72 si construye
Si necesita escribir el equivalente de una declaración "if", el método normal que usa el código INTERCAL-72 es hacer
NEXT
dos veces y luego hacer un cálculoRESUME
. (En el código moderno, a menudo un cómputoCOME FROM
será mejor, pero este consejo supone que su código lo prefiereNEXT
). Es casi seguro que tiene que pagar los bytes por el primeroNEXT
, ya que salta de una rama del "si" a la otra. Compartir el segundoNEXT
tampoco es trivial, a menos que tenga muchas declaraciones "si" que van al mismo lugar al ver a#1
. Sin embargo,RESUME
puede estar en cualquier parte del programa (porque el control lo dejará instantáneamente en cualquier lugar).Hay dos formas de manejar esto. Si tiene muchas declaraciones "if", entonces
RESUME
probablemente garantice un número de línea de un solo dígito, de modo que su segundaNEXT
declaración pueda ser lo más breve posible. Si es posible, intente que sea un cómputoRESUME
que ocurriría naturalmente en su código (es cierto, esto es difícil, ya que es raro que aparezcan en el "flujo normal" de código en lugar de serNEXT
editados); entonces, el único costo es el número de línea. Tendrá que usar una sola variable booleana para todos estosNEXT
s; el consenso universal aquí es usar.5
, principalmente porque es la variable que la biblioteca estándar usa para valores de retorno booleanos.Alternativamente, es posible hacer uso de una característica indocumentada (técnicamente subdocumentada, porque introduje una pista en la documentación de INTERCAL cuando me di cuenta) de la biblioteca estándar. Debido a que una ubicación central para a
RESUME
es tan útil, la biblioteca estándar usa una internamente. Los números de línea en INTERCAL son globales (con convenciones de espacios de nombres, pero que se pueden dividir si sabe lo que está haciendo), por lo que puede accederNEXT
directamente a las partes internas de la biblioteca estándar si lo desea, y en particular,NEXT
a su ubicación central de REANUDACIÓN . Esto es suficientemente popular en el código INTERCAL existente que los reemplazos de biblioteca estándar tienden a tener que implementarlo para evitar romper los programas existentes.La línea en cuestión es (literal o efectivamente, dependiendo de la implementación):
La razón principal para no usar esto es su número de línea larga; si necesita hacer muchas construcciones if de estilo INTERCAL-72, será mejor usar la suya para darle un número más corto.
Por supuesto, puedes combinar las técnicas, escribiendo algo como
que es solo marginalmente más largo que
y tiene el beneficio de que los booleanos se vuelven
#2
y#3
(que es más difícil de leer, pero normalmente más fácil de generar). En realidad, incluso podría valer la pena poner el código adicional para manejar#0
y#1
si va a estar mucho (pero calculadoCOME FROM
probablemente funcionará mejor en este caso a menos que sus requisitos sean muy raros).fuente
INTERCAL no especifica precedencia, pero tampoco error en precedencia ambigua
Una expresión como
es ambiguo y podría significar
o
La especificación INTERCAL deja intencionalmente poco claro lo que significa, y en general no hay un estándar (aunque C-INTERCAL y CLC-INTERCAL hacen un esfuerzo para coincidir entre sí en los casos más simples). Dicho esto, el original no es incorrecto ; es ambiguo y no recomendaría usarlo en el código de producción (pero tampoco recomendaría usar INTERCAL en el código de producción), pero tendrá algún significado en la mayoría de los compiladores.
En otras palabras, puede valer la pena simplemente eliminar caracteres de agrupación y esperar que su programa aún funcione. La mayoría de los intérpretes analizarán cualquier expresión ambigua de manera consistente, por lo que para cada par de caracteres de agrupación, hay una probabilidad de 1 en 2 de que sea innecesario; eso puede sumar bastante ahorro. (Desafortunadamente, los analizadores INTERCAL tienden a ser lo suficientemente confusos como para que nadie esté completamente seguro de cuáles son realmente las reglas , pero normalmente se puede determinar mediante un experimento. En los casos más simples, los operadores tienden a tener la misma prioridad y una asociatividad constante).
fuente
En C-INTERCAL, considere abreviar el código usando
CREATE
La
CREATE
declaración le permite crear una nueva sintaxis. Esto es particularmente útil en el golf porque le permite dar nombres cortos a las declaraciones. También puede usarlo para "definir una función" de manera efectiva mediante la creación de un nuevo operador (que tiene la gran ventaja de que le permite llamar a la función en el medio de una expresión).El costo de instalación aquí es bastante alto, pero si hay una construcción que usa mucho, inventar una sintaxis más corta para él probablemente será una buena idea.
fuente