Usando iteração para calcular seqüências
Normalmente, resolver um desafio de sequência OEIS exigirá o uso de uma das fórmulas fornecidas em sua página. Alguns deles se adaptam bem a J e outros nem tanto. As fórmulas recursivas são diretas; no entanto, a iteração pode não ser simples. Um padrão que comecei a usar é
(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
onde s
é o primeiro valor da sequência, f
é um verbo que calculará o próximo termo, dado o termo anterior, e n
é o índice baseado em zero do termo que você deseja calcular. Esse método baseia-se no fato de que, ao calcular o poder de uma díade, o LHS está vinculado à díade para formar uma nova mônada, e essa mônada está aninhada no valor inicial. A díade dada ao advérbio de poder é um gancho, onde (]f)
é dado o índice n
no LHS e o valor de um termo na sequência s
. O gancho será aplicado f
na s
como uma mônada, e depois ignorar n
a devolver o resultado de f s
.
Biblioteca padrão
Às vezes, você pode achar que J terá suporte para um verbo em sua biblioteca padrão . Por exemplo, a maioria das operações com números inteiros de bits é vinculada a nomes mais curtos que o uso da chamada primitiva.
AND =: (17 b.) NB. it is actually '$:/ :(17 b.)'
Data e hora incorporadas também estão disponíveis.
Gamas
Se você tiver um conjunto de valores [a, b, c]
e desejar formar um intervalo com base no produto deles [0, 1, 2, ..., a*b*c-1]
, a abordagem típica seria encontrar o produto e formar um intervalo que pode [:i.*/
custar 6 bytes. Um caminho mais curto é ,@i.
para 4 bytes, pois i.
pode formar matrizes multidimensionais enquanto continua a contagem e, se o achatamento, ele produzirá um intervalo equivalente.
Imprimindo continuamente
Uma maneira tácita de imprimir um valor e continuar a usá-lo sem um loop explícito é ([echo)
para um caso monádico. echo
é um verbo na biblioteca padrão que imprime seu conteúdo stdout
no mesmo formato usado no intérprete. O gancho passa o mesmo valor de entrada usando o [
verbo esquerdo .
Base 10 dígitos de um número inteiro
A maneira padrão de adquirir os 10 dígitos básicos de um número inteiro é o 10#.inv]
que custa 8 bytes, demais! Uma alternativa é convertê-lo em uma string e analisá-lo na classificação 0, "."0@":
que salva um byte, mas uma maneira ainda melhor é ,.&.":
salvar outro byte, tornando o custo final de 6 bytes em vez de 8.
GolfScript gets its own way far too often
em 2019.