2 文字の列でスクランブルされたテキストの段落があります。私の課題の目的は、それを解読することです。
|de| | f|Cl|nf|ed|au| i|ti| |ma|ha|or|nn|ou| S|on|nd|on|
|ry| |is|th|is| b|eo|as| | |f |wh| o|ic| t|, | |he|h |
|ab| |la|pr|od|ge|ob| m|an| |s |is|el|ti|ng|il|d |ua|c |
|he| |ea|of|ho| m| t|et|ha| | t|od|ds|e |ki| c|t |ng|br|
|wo|m,|to|yo|hi|ve|u | t|ob| |pr|d |s |us| s|ul|le|ol|e |
| t|ca| t|wi| M|d |th|"A|ma|l |he| p|at|ap|it|he|ti|le|er|
|ry|d |un|Th|" |io|eo|n,|is| |bl|f |pu|Co|ic| o|he|at|mm|
|hi| | |in| | | t| | | | |ye| |ar| |s | | |. |
列の正しい順序を見つけるための現在のアプローチは、単語の出現回数の基準に従って、各列の最適な位置を再帰的に見つけようとしています。
私が念頭に置いているアルゴリズムのコアの擬似コードは次のようになります。
function unscramble(scrambledMatrix,indexOfColumnIveJustMoved)
for each column on scrambledMatrix as currentIndex=>currentColumn
if (currentIndex!=indexOfColumnIveJustMoved)
maxRepeatedWords=0;maxIndex=0;
for (i=0;i<numberOfColumnsOfScrambledMatrix;i++)
repWordsCount=countRepWords(moveFromToOn(currentIndex,i,scrambledMatrix))
if (maxRepeatedWords<repWordsCount)
maxRepeatedWords=repWordsCount;
maxIndex=i;
endif
endfor
if (maxIndex!=currentIndex)
return unscramble(moveFromToOn(currentIndex,maxIndex,scrambledMatrix),maxIndex); //recursive call
endif
endif
endfor
return(scrambledMatrix); //returns the unscrambled matrix;
endfunction
各列を反復した後、移動する列がなくなると、アルゴリズムは停止します。文章が文字で形成された単語に基づいており、サンプルが十分に大きい限り、どの言語でも機能するはずです(ただし、英語のソリューションにのみ興味があります)。
他のアプローチや改善に関する提案はありますか? この問題の最善の解決策を知りたいです (おそらく、代わりに一般的な単語の出現を探す辞書ベースのものですか? 再帰を避けるためにアルゴリズムを再構築するのはどうですか? はるかに高速でしょうか?)。