단일 단어의 문자 정렬 - 순열(또는 철자 바꾸기)을 찾는 데 사용합니다.

단일 단어의 문자 정렬 - 순열(또는 철자 바꾸기)을 찾는 데 사용합니다.

나는 철자법에 대한 몇 가지 사전을 가지고 있습니다 file.dic. 예를 들어:

abc
aword
bword
cab
worda
wordzzz

다른 단어를 찾고 있어요편곡(또는 철자 바꾸기)서로.

"알파벳순으로 정렬"하라는 명령이 있다면 다음과 같이 할 것입니다.

cat file.dic | letter-sort | paste - file.dic | sort

이것은 나에게 다음을 제공합니다:

abc abc
abc cab
adorw aword
adorw worda
bdorw bword    
dorwzzz wordzzz

이제 파일에 철자 바꾸기가 명확하게 표시됩니다. 그러한 명령이 있거나 letters-sort그렇지 않으면 그러한 결과를 얻는 방법이 있습니까?

답변1

파일에서 문자를 한 줄씩 정렬하려면 다음을 수행할 수 있습니다.

while read line; do
    grep -o . <<< "${line}" | sort | tr -d '\n'
    echo
done < file.dic

산출:

abc
adorw
bdorw
abc
adorw
dorwzzz

답변2

fold명령을 사용하면 아래 스크립트와 같이 문자열을 개별 문자 배열로 나눌 수 있습니다.

#!/bin/bash

CHARS=`echo $1 | fold -w1`
# $CHARS now contain an array of single character in the string $1

for i in "${CHARS[@]}"
do
    # do something with each character
    echo $i;
done

위의 스크립트를 저장했다고 가정하면 test.sh다음과 같이 실행할 수 있습니다.

$./test.sh abcde

문자열 "abcde"를 문자 배열로 분리한 다음 이를 사용하여 철자 바꾸기를 찾을 수 있습니다.

답변3

당신이 언급한 것을 python그대로 유지하세요 python. 1. 동일한 문자를 포함하고 2. 문자 빈도가 일치하는 경우 두 단어는 서로의 철자 바꾸기입니다. 내장 Counter클래스를 사용하면 정렬 없이 일회성 문자 빈도를 수행할 수 있습니다.

from __future__ import print_function
from collections import Counter, defaultdict
from itertools import combinations_with_replacement
with open('file') as f:
    data = (l.rstrip('\n') for l in f)
    data = ((l, Counter(l)) for l in data)
    perms = defaultdict(list)
    for l, c in data:
        perms[frozenset(c.iteritems())].append(l)   
    for anagrams in perms.itervalues():
        print(*anagrams)

bword
aword worda
abc cab
wordzzz

답변4

Perl과 해당 명령줄 플래그는 간결성이 뛰어납니다.

다음 명령은 단어의 문자를 정렬합니다.

perl -CS -ne 'chomp; print(join("", sort(split("", $_ . "\n"))))' 

실제로, 단어 퍼즐 작업을 하고 있다면 이 an유틸리티를 사용하는 것이 더 나을 수도 있습니다. 이는 사전을 인수로 사용할 수 있습니다.

an -d /usr/share/dict/ngerman Anagramword

관련 정보