J ou K?

Introdução

Depois que eu algumas formas de calcular o fatorial usando K , alguns amigos do Facebook queriam desesperadamente saber qual das duas linguagens eu preferia. Na realidade, não era desesperadamente. Apenas uma curiosidade. E também não eram todos os meu amigos, apenas os que trabalhavam com TI. Bem, nem todos que trabalhavam com TI. Só um pouquinho. Vou lá no face para saber quantos amigos queria a minha opinião. Tec, tec, tec…. Pô, nenhum. Acho que foi um sonho.

Então tá. Como ninguém queria saber, vou escrever mesmo assim. Quem sabe …. algum dia ….

Bem, K é comercializado pela Kx Systems  e foi feita uma versão aberta de K conhecida como kona. Mas é só uma parte do todo. A empresa Kx permite baixar a versão de 32bits do sistema que não pode ser utilizada em sistemas comerciais. Baseado apenas nisso, já posso dizer que a minha preferência é por J, que é uma versão completa, foi desenvolvida por Kenneth E. Iverson (desenvolvedor da APL), tem a versão GPL (inclusive é possível baixar os fontes).

A linguagem

Existem diferenças entre uma e outra linguagens, mas nada de muito anormal. No exemplo do fatorial em K foram usados dois exemplos para gerar a lista. Um era 1+!5 (gera a lista 0 1 2 3 4) e adiciona 1 e o exemplo 1_!6 (gera a lista 0 1 2 3 4 5 6), retira o primeiro elemento e fica com os restantes. Em J, os equivalentes seriam 1+i.5 (1 + 0 1 2 3 4 = 1 2 3 4 5) e }.i.6 (0 1 2 3 4 5 = 1 2 3 4 5). Existem outras variantes possíveis como, por exemplo, >:i.5 (gera a lista e incrementa os elementos). Em qualquer caso de J, precede-se */ para inserir a multiplicação entre os elementos da lista (*/>:i.5 => 0 1 2 3 4 5 => 1 2 3 4 5 => 1 * 2 * 3 * 4 * 5).

Já vem com diversas bibliotecas para facilitar o trabalho e ainda podemos instalar outras tantas, facilitando tarefas como a geração dos mais diversos tipos de gráficos, trabalhar com web, arquivos, sgbds, etc..

Ambiente.

Existem três ambientes onde podemos trabalhar com J.

Console

É o mais básico e é possível fazer de tudo mas, provavelmente, não será utilizado para muita coisa. Só para executar algum programa em J ou pequenos testes. Para não causar conflito com o jconsole do java, uma opção é criar um link simbólico. Aqui, /usr/bin/jc aponta para /home/zilog/j64-804/bin/jconsole. Não é necessário ser administrador para instalar o J.

jqt

Muito bom para você fazer testes, administrar o sistema e criar projetos. Inicialmente apresenta uma janela como o do terminal (jconsole) porém, existem diversos programas e funções que podem ser acessadas pelo menu para facilitar o desenvolvimento e consulta. É uma janela mais ou menos assim:

jqt

Em Tools/Package Manager, existe um utilitário para gerenciar os pacotes. Você poderá instalar/atualizar os diversos pacotes existentes para a linguagem. Como não ocupam muito espaço, pode instalar todos (até porque alguns exemplos necessitam).

package

Em File, além de outras coisas como imprimir, é possível editar arquivos. Com Ctrl+N ou File/New Temp, você pode digitar e executar linhas, blocos ou todo o arquivo e salvar para uso posterior.

qeditNo menu Help, temos toda uma gama de informações para auxiliar o usuário no desenvolvimento e ainda uma série de exemplos que podem servir de base para outros programas. Em Help/Studio/Labs, existe uma série de tutoriais interativos. O usuário pode selecionar um assunto e, ao executar, os diversos capítulos e seções serão executados no terminal. Após mostrar uma seção, o usuário deverá pressionar Ctrl+J para prosseguir depois de ler e entender (bem, não é necessário nem possível entender tudo). Antes de pressionar Ctrl+J, é possível entrar com comandos com valores diferentes para melhorar o entendimento. A janela para escolher entre oa diversos tutoriais:

lab1

Exemplo da execução do tutorial (note que também é possível avançar utilizando o menu mas Ctrl+j é muito mais simples).

lab2Outra opção interessante é Help/Studio/Showcase…, que possui diversos programas que podem ser executados e podem ser vistos os fontes para análise.

demojO programa plot é um bom começo para mostrar a grande quantidade de gráficos bi e tri dimensionais que o J permite.

demoj1Também temos a opção Help/Studio/Qt Demos… que possui exemplos de como utilizar os diversos controles do QT com os programas, entregando uma interface gráfica para facilitar a vida do usuário.

demoqt

jhs

É um servidor que possibilita a interação com J por um navegador. Vem configurado para aceitar apenas conexões de localhost (127.0.0.1) mas é possível editar o arquivo j64-804/addons/ide/jhs/config/jhs_default.ijs (troque o j64-804 pelo caminho da sua instalação) e alterar a variável BIND de localhost para any para aceitar de qualquer dispositivo (neste caso, por motivos de segurança, é necessário especificar senha para acesso). Após executar ./j64-804/bin/jhs, temos um resultado como o que segue:

jhs1

Agora é só usar o seu navegador, abrir o endereço especificado e brincar. Para encerrar o servidor, digite exit”.

jhs2

jupyter

Mas não eram três? Sim, mas este não conta. Ainda está em desenvolvimento e está muito relacionado com python. Interessante por permitir gravar a sessão para visualização futura. Outras informações em jkernel.

Anúncios

Projeto Euler – #48

O problema #48 do projeto Euler é bem simples. A série 11 + 22 + 33 + … + 1010 = 10405071317. Qual os últimos 10 dígitos da série 11 + 22 + 33 + … + 10001000

Bem, dá para fazer até no papel. Mas como o meu objetivo é aprender J, então vou resolver em J. Mas vou resolver passo a passo conforme o enunciado. Primeiro a geração da sequencia:

>:i.10x
1 2 3 4 5 6 7 8 9 10

Como a sequencia inicia com zero, devemos incrementar os elementos >: e o x foi utilizado para trabalhar com precisão estendida.

^~>:i.10x
1 4 27 256 3125 46656 823543 16777216 387420489 10000000000

O ^ irá elevar um número a um determinado expoente e, como o ~ duplica a lista antes do verbo, significa elevar um número a ele mesmo.

Para somar os elementos de uma lista, inserimos / o verbo + entre cada elemento dela. Como resultado temos:

+/^~>:i.10x
10405071317

Ok, está conforme o enunciado. Para obtermos os últimos dez dígitos do resultado, primeiro deveremos converter o número para um string utilizando “: e, logo em seguida, obter os últimos dez dígitos _10{. (como foi visto na resolução do problema #13, 10{. retorna os 10 primeiros elementos)

_10{.":+/^~>:i.10x
0405071317

A solução não é otimizada e resultou em um tempo mais longo do que eu espera para a sequencia 1…1000. Apesar do problema permitir que eu exclua 100 número dos cálculos (como desejamos os últimos dez dígitos e todo o múltiplo de dez ira gerar um valor como dez ou mais zeros que não seriam significativos na soma), essa exclusão não melhorou muito a performance do cálculo. Após resolver o exercício e entrar no fórum do problema, uma outra forma de resolução do problema em J possui uma performance bem melhor. Enquanto a minha leva 3s, o método lá leva 0.09s. Mas é para quem já está no nível 1 de aprendizado de J.

=-=-=-=-=
Powered by Blogilo

Projeto Euler – Problema #13

Bem, o problema #13 do projeto Euler é bem simples. Apenas pede os 19 primeiros dígitos da soma de 100 números com 50 dígitos cada um. É só somar todos e pegar os 10 primeiro. Mas como resolver em J?

A=: “.;._2(0 : 0)
37107287533902102798797998220837590246510135740250

53503534226472524250874054075591789781264330331690
)
Ok, criamos uma lista com os 100 números de 50 digitos. Para o resultado é só:
10{.”:x:+/A
Mais um sem graça.
+/ soma todos os elementos da lista, x: torna precisão extendida, “: converte para string, 10{. retorna os 10 primeiros elementos.