Skip to content

Category: Uncategorized

Gerando permutações

Muitas vezes para resolver uma única instância de um problema é mais rápido ataca-lo com força bruta do que encontrar um algoritmo geral com uma boa ordem de complexidade. Permutações são de grande utilidade nesse tipo de abordagem.

Permutações em Prolog:

Esse é um código em Prolog que o Wladimir Araujo passou na cadeira de IA.

select(X, [X|Xs], Xs).
select(X, [Y|Ys], [Y|Zs]) :- select(X, Ys, Zs).

permutar([], []).
permutar(Xs, [Z|Zs]) :-
    select(Z, Xs, Ys),
    permutar(Ys, Zs).

Permutações em Python:
Esse é um código de um certo Michael Davies que eu tirei daqui. Ele gera uma lista com todas as permutações de uma lista. Muito bonitinho. 🙂

def all_perms(str):
    if len(str) <=1:
        yield str
    else:
        for perm in all_perms(str[1:]):
            for i in range(len(perm)+1):
                yield perm[:i] + str[0:1] + perm[i:]

Um exemplo de uso:

>>> for p in all_perms(['a','b','c']):
	print p
['a', 'b', 'c']
['b', 'a', 'c']
['b', 'c', 'a']
['a', 'c', 'b']
['c', 'a', 'b']
['c', 'b', 'a']

Outras implementações:
Em outras linguagens o código para gerar permutações geralmente é muito grande, então eu preferi deixar alguns links.

Monitor de Memória do Netbeans

Você já viu em algum screencast um monitor de memória na barra de ferramentas do Netbeans?

Monitor de memória

Bem lega, né? Essa ferramenta mostra um gráfico animado do consumo de memória do Netbeans. Ele também permite que você chame a Coleta de Lixo clicando nele

Para ativar essa ferramenta no Netbeans 6 (download), vá em View → Toolbars → Memory.

View → Toolbas → Memory

Binha Dormindo

Binha dormindo
Binha, a poodle da Juliana (aka Cheetos).

Reparem que ela usou a coleira para tapar os olhos. Engraçado, não é a primeira vez que eu vejo um cachorro usar essa técnica. Eu também não consigo dormir sem um lençol para cobrir o rosto.

Família Simpsons em Prolog

Os Simpsons no sofá

% Fatos.
homer.
marge.
bart.
lisa.
maggie.
mona.
jacqueline.
patty.
abraham.
clancy.
hugo.
louise.
herb.

mulher(marge).
mulher(maggie).
mulher(lisa).
mulher(mona).
mulher(jacqueline).
mulher(selma).
mulher(patty).
mulher(louise).

homem(homer).
homem(bart).
homem(abraham).
homem(clancy).
homem(hugo).
homem(herb).
homem(clancy).

progenitor(homer,bart).
progenitor(homer,lisa).
progenitor(homer,maggie).
progenitor(marge,bart).
progenitor(marge,lisa).
progenitor(marge,maggie).

progenitor(abraham, homer).
progenitor(mona, homer).

progenitor(clancy, marge).
progenitor(clancy, patty).
progenitor(clancy, selma).
progenitor(jacqueline, marge).
progenitor(jacqueline, patty).
progenitor(jacqueline, selma).

progenitor(abraham, herb).

progenitor(herb, hugo).
progenitor(louise, hugo).

% Regras
pai(A,B) :- homem(A), progenitor(A,B).
mãe(A,B) :- mulher(A), progenitor(A,B).

é_pai(A) :- pai(A,_).
é_mãe(A) :- mãe(A,_).

filho(A,B):- homem(A), progenitor(B,A).
filha(A,B):- mulher(A), progenitor(B,A).

irmaos(X,Y) :-
	progenitor(Z,X),
	progenitor(Z,Y),
	X\=Y.

irmao_completos(A,B) :-
	pai(P,A), pai(P,B),
	mãe(M,A), mãe(M,B),
	A\=B.

tio(T,A) :-
	homem(T),
	irmaos(T,X), progenitor(X,A).

tia(T,A) :-
	mulher(T),
	irmaos(T,X), progenitor(X,A).

primo(A,B) :-
	homem(A),
	progenitor(X,A),
	progenitor(Y,B),
	irmaos(X,Y).

prima(A,B) :-
	mulher(A),
	progenitor(X,A),
	progenitor(Y,B),
	irmaos(X,Y).

avô(A,B) :- pai(A,X), pai(X,B).
avó(A,B) :- pai(A,X), pai(X,B).

Referências:

Extrair arquivos .rar incompletos

ícone pacote de David Vignoni

É bem comum eu assisti episódios ou filmes em formatos rmvb que estão divididos em diversos arquivos rar hospedados em vários servidores grátis diferentes. Mas uma das coisas boas do rmvb é a possibilidade de assistir o vídeo antes mesmo de ter finalizado o do download. Como os arquivos estão compactados em vários arquivos rar seria necessário esperar acabar o download de todas as partes e só então descompactar e assisti ao vídeo.

Você pode contornar isso descompactando o arquivo mesmo sem ele ter terminado. Na linha de comando você deve usar o parâmetro -kb:

unrar e -kb arquivo.rar

O unrar vai descompactar o arquivo rar e os arquivos da sequência até onde ele conseguir, e quando ele sentir falta de algum arquivo ele vai falhar mas não vai apagar o que ele já conseguiu extrair.

Bachelorette

Adoro esse clipe. Não é só porque é da Björk mas porque essa recursividade me lembra muito os sonhos em que as vezes eu fico preso.

Cannot create duplicate Solaris fdisk partitions

Eu estava com problemas para instalar o Solaris Express Community Edition b73.

Ocorria de sempre no inicio ou lá pelos 5% da instalação ela falhava. No log da instalação havia:

ERROR: Cannot create duplicate Solaris fdisk partitions (c0d0)

Isso acontecia quando eu instalava o Ubuntu e depois tentava instalar o Solaris. Quando eu tentava instalar o Solaris no disco todo não havia nenhum problema e a instalação transcorria normalmente.

Bem, o que eu acho que estava acontecendo era o seguinte. Por algum motivo o Solaris usa o mesmo código para identificar uma partição Solaris e uma partição linux-swap. Sempre que já havia alguma partição linux-swap ele iria pensar que já havia uma partição Solaris.

Para contornar isso, use uma ferramente da particionamento como o Gparted e modifique temporariamente o linux-swap para alguma outra coisa. No meu caso eu troquei para ext2.

Gparted

Depois é só instalar o Solaris normalmente e o problema não deve se manifestar sumir:

Opensolaris no notebook

Depois reformate a partição para linux-swap e torne o swap ativo:

Ativando o swap

Pronto.

SHA-1 em Java

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class sha1it {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        if (args.length==0) return;
        
        MessageDigest md = MessageDigest.getInstance("SHA1");
        md.update(args[0].getBytes());
        byte[] newHash = md.digest();
        StringBuffer newHashStringBuffer = new StringBuffer();
        for ( int i = 0; i < newHash.length; i++ )
            newHashStringBuffer.append(Integer.toHexString(newHash[i]&0xff));
        System.out.println(newHashStringBuffer.toString());
    }
}

Vai calcular o SHA-1 do primeiro argumento da linha de comando:

$ java sha1it silveira
665fc8e2ed1b8aa1571a5c9d3e14d89bad4f0

Note que não é uma implementação pura do SHA-1. Simplesmente pedimos por essa implementação, que pode não estar disponível.