sexta-feira, 5 de maio de 2017

Anagramas

Inspirado num artigo publicado no do Hacker News, resolvi explorar os anagramas da língua portuguesa. O algoritmo é muito simples. Cada palavra é transformada numa chave que é composta por suas letras em ordem alfabética. Todas as palavras são guardadas num hash de acordo com a chave. Então, todas as palavras que possuem as mesmas combinações de letras são naturalmente agrupadas.


use strict;

my $dict;
my %anagrams;
open($dict, '<', 'wordlist-preao-latest.txt');
while (my $word=<$dict>) {
  chomp $word;
  my $index=$word;
  $index=~s/\-//g;  
  my $sorted = join "", sort split //, $index;
  push @{$anagrams{$sorted}}, $word;
}

for my $words (values %anagrams) {
  print "@$words\n" if @$words>1;
}


Modifiquei o código para que ignorasse os traços. O dicionário que encontrei possui, inclusivamente, todas as conjugações dos verbos.

O campeão de variações (22) foi este:


amestrei eremitas estiar-me estreiam 
estremai mastreei mastreie meterias 
rasteiem remateis remetais remetias 
reteimas ser-te-iam seriam-te teimar-se 
teimares temerias ter-me-ias ter-se-iam 
teriam-se terias-me


E os anagramas mais longos não são muito interessantes, porque a maioria é de diferentes conjugações. O mais longo é:

transcendentalizar-lhe-ias transcendentalizar-lhes-ia

E há muitos desses antes deste:

constitucionalizardes desconstitucionalizar

Pelo menos são verbos diferentes.

Com uma pequena adição ao programa, gerei um arquivo com todos os anagramas (um por linha) ordenados por ordem decrescente de comprimento:

my @sorted= sort { length $b <=> length $a } keys %anagrams;
for my $i (0..$#sorted) {
  if(scalar(@{$anagrams{$sorted[$i]}})>1) {
    print join ' ',@{$anagrams{$sorted[$i]}};
    print "\n";
  }
} 

São mais de 114 mil linhas e cerca de 3MB. A evolução natural é transformar isso num webservice e vender o AaaS (Anagrams as a Service).

Nenhum comentário: