Consejos para jugar golf en INTERCAL

10

¿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...

Baconaro
fuente
La mayoría de los idiomas no tienen o necesitan sus propias etiquetas aquí, ya que los desafíos específicos del idioma generalmente se desaconsejan.
Alex A.
99
Una pista de que este podría no ser el mejor lenguaje de golf, desde su página de wikipedia:Despite the language's intentionally obtuse and wordy syntax,
isaacg

Respuestas:

2

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 NOTson dos tokens, pero se pueden escribir DONOTsin que el analizador se queje (en casi cualquier implementación ampliamente utilizada). (Por supuesto, también podría escribir DON'T, pero no es ningún terser. Sin embargo, podría ser más fácil de leer. PLEASEN'TProbablemente sea más difícil de leer que PLEASE NOTeso). 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ón DO READ OUTda lo que puede confundir a algunos analizadores INTERCAL de mayor edad debido a la incrustadoDOREADOUTDO(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
2

Concéntrese en hacer todo el trabajo posible en una sola declaración

Los identificadores de declaración de INTERCAL son bastante detallados; DOhay 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 agregar PLEASEuno de vez en cuando para mantener contento al analizador. (Lo mejor que puede hacer es una relación de cuatro DOa uno PLEASE, 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 #1a .1y #2que .2, en lugar de hacerlo en la forma obvia INTERCAL-72:

DO.1<-#1DO.2<-#2

Vale la pena considerar sobrecargar una variable aleatoria para permitirle asignar ambos a la vez:

DO:1<-#1$#2

( :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 .1y .2más de una vez.

No es solo calcular comandos donde funciona este truco. Si necesita esconder una variable dos veces, no lo haga así:

DOSTASH.1DOSTASH.1

pero así:

DOSTASH.1+.1

(La +notación funciona para la mayoría de los comandos donde conceptualmente podría tener sentido).


fuente
2

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 NEXTdos veces y luego hacer un cálculo RESUME. (En el código moderno, a menudo un cómputo COME FROMserá mejor, pero este consejo supone que su código lo prefiere NEXT). Es casi seguro que tiene que pagar los bytes por el primero NEXT, ya que salta de una rama del "si" a la otra. Compartir el segundo NEXTtampoco es trivial, a menos que tenga muchas declaraciones "si" que van al mismo lugar al ver a #1. Sin embargo, RESUMEpuede 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 RESUMEprobablemente garantice un número de línea de un solo dígito, de modo que su segunda NEXTdeclaración pueda ser lo más breve posible. Si es posible, intente que sea un cómputo RESUMEque 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 ser NEXTeditados); entonces, el único costo es el número de línea. Tendrá que usar una sola variable booleana para todos estos NEXTs; 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 RESUMEes 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 acceder NEXTdirectamente a las partes internas de la biblioteca estándar si lo desea, y en particular, NEXTa 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):

(1001) DO RESUME .5

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

(9)DO(1001)NEXT

que es solo marginalmente más largo que

(9)DORESUME.5

y tiene el beneficio de que los booleanos se vuelven #2y #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 #0y #1si va a estar mucho (pero calculado COME FROMprobablemente funcionará mejor en este caso a menos que sus requisitos sean muy raros).


fuente
2

INTERCAL no especifica precedencia, pero tampoco error en precedencia ambigua

Una expresión como

#1$#2~#3

es ambiguo y podría significar

'#1$#2'~#3

o

#1$'#2~#3'

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
2

En C-INTERCAL, considere abreviar el código usando CREATE

La CREATEdeclaració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