Usando iteración para calcular secuencias
Típicamente, resolver un desafío de secuencia OEIS requerirá usar una de las fórmulas dadas en su página. Algunos de estos se adaptan bien para J, y otros no tanto. Las fórmulas recursivas son sencillas, sin embargo, la iteración podría no ser simple. Un patrón que comencé a usar es
(s(]f)^:[~]) n
] Gets n
s The first value in the sequence
~ Commute the argument order, n is LHS and s is RHS
[ Gets n
^: Nest n times with an initial argument s
(]f) Compute f s
Returns (f^n) s
donde s
es el primer valor de la secuencia, f
es un verbo que calculará el siguiente término dado el término anterior, y n
es el índice basado en cero del término que desea calcular. Este método se basa en el hecho de que al calcular el poder de una díada, el LHS está unido a la díada para formar una nueva mónada, y esa mónada se anida en el valor inicial. La diada dada al adverbio de potencia es un gancho donde (]f)
se le da el índice n
en el LHS y el valor de un término en la secuencia s
. El gancho se aplicará f
en s
como una mónada, y luego ignorar n
a devolver el resultado de f s
.
Biblioteca estándar
A veces, puede encontrar que J tendrá soporte para un verbo en su biblioteca estándar . Por ejemplo, la mayoría de las operaciones enteras a nivel de bits están vinculadas a nombres que son más cortos que el uso de la llamada primitiva.
AND =: (17 b.) NB. it is actually '$:/ :(17 b.)'
Fecha y hora incorporadas también están disponibles.
Rangos
Si tiene un conjunto de valores [a, b, c]
y desea formar un rango basado en su producto [0, 1, 2, ..., a*b*c-1]
, el enfoque típico sería encontrar su producto y luego formar un rango que podría [:i.*/
costar 6 bytes. Una forma más corta es ,@i.
para 4 bytes, ya que i.
puede formar matrices multidimensionales mientras sigue contando, y al aplanarla producirá un rango equivalente.
Imprimir continuamente
Una forma tácita de imprimir un valor y continuar usándolo sin un ciclo explícito es ([echo)
para un caso monádico. echo
es un verbo en la biblioteca estándar que imprime sus contenidos stdout
en el mismo formato utilizado en el intérprete. El gancho luego pasa el mismo valor de entrada usando el [
verbo izquierdo .
Base 10 dígitos de un entero
¡La forma estándar de adquirir los 10 dígitos básicos de un entero es lo 10#.inv]
que cuesta 8 bytes, demasiado! Una alternativa es convertirlo en una cadena y analizarlo en el rango 0 "."0@":
que guarda un byte, pero una forma aún mejor es ,.&.":
que guarda otro byte haciendo que el costo final sea de 6 bytes en lugar de 8.
GolfScript gets its own way far too often
en 2019.