Scrabble helper no bash

5

Estou tentando fazer um auxiliar de scrabble no bash, que, quando recebe uma lista de caracteres, localiza todas as palavras no arquivo /usr/share/dict/words .
Por exemplo, quando receber as letras a,c,r,t
A palavra cart corresponderá a A palavra car também corresponderá à A palavra carat não não corresponde

No entanto, se a,a,c,r,t foi dado | Então carat teria correspondido.

Estou tentando descobrir se é possível usar apenas grep , suspeito que expansões de chaves como {a,c,r,t}{a,c,r,t} possam ser úteis para gerar todas as combinações possíveis das letras, mas, em vez disso, sou recebido com os erros como

grep: aaac: No such file or directory
grep: aaar: No such file or directory
grep: aaat: No such file or directory   

ao executar o comando $ grep {a,c,r,t}{a,c,r,t}{a,c,r,t}{a,c,r,t} /usr/share/dict/words

Quando uso citações como "{a,c,r,t}{a,c,r,t}" ou "\{a,c,r,t\}\{a,c,r,t\}" , a expansão de chaves não funciona de todo

Eu sei que o comando acima não deve funcionar como um auxiliar de scrabble, mas os erros ainda são bastante inesperados. O que há de errado com o comando e como corrigi-lo? Além disso, pode grep ser usado de alguma forma para criar um auxiliar de scrabble?

    
por AvZ 21.12.2015 / 09:35

2 respostas

4

As expressões regulares não são a melhor ferramenta para esse tipo de trabalho. Eu faria algo como:

perl -CLASD -lne '
  BEGIN{$l0{$_}++ for (split "", shift)}
  %l = %l0; for (split "") {next LINE unless $l{$_}--}
  print' aacrt < /usr/share/dict/words

Ou desde (pelo menos em francês e inglês e algumas outras línguas usando o alfabeto latino ), o scrabble tem apenas o 26 letras maiúsculas de A a Z (été é escrito como ETE, cœur como COEUR), com GNU iconv :

iconv -t us//TRANSLIT < /usr/share/dict/words |
  perl -CLASD -lne '
    BEGIN{$l0{$_}++ for (split "", uc shift)}
    %l = %l0; for (split "", uc $_) {next LINE unless $l{$_}--}
    print' croeu

Ou para enviar na forma original:

perl -CLASD -MText::Unidecode -lne '
  BEGIN{$l0{$_}++ for (split "", uc shift)}
  %l = %l0; for (split "", uc unidecode $_) {next LINE unless $l{$_}--}
  print' croeu < /usr/share/dict/word
    
por 21.12.2015 / 13:50
2

O que está acontecendo aqui é que {a,c,r,t}{a,c,r,t}{a,c,r,t}{a,c,r,t} é expandido pelo shell que você está usando. Isso significa que o primeiro deles ( aaaa ) é o padrão que grep pesquisará em aaac , aaar , etc., como se você digitasse:

grep aaaa aaac aaar aaat aaca ..... /usr/share/dict/words

Coloque o padrão de pesquisa entre aspas simples para evitar que isso aconteça:

grep '{a,c,r,t}{a,c,r,t}{a,c,r,t}{a,c,r,t}' /usr/share/dict/words

Por outro lado, não tenho certeza se você está usando a sintaxe certa para o grep aqui. Eu usaria:

grep '[acrt][acrt][acrt][actr]' /usr/share/dict/words

que corresponde a essas combinações de 4 caracteres e como @mueh comentou:

grep -xE '[acrt]{1,4}' /usr/share/dict/words

para corresponder de 1 a 4 combinações dessas letras.

    
por 21.12.2015 / 09:43