『ケブンッリジ関数』投稿

久々の『どう書く?』投稿。

お題:

ケブンッリジ関数

http://ja.doukaku.org/249/

与えた文章の各単語の最初と最後の文字以外の文字を入れ替えた文章を出力する処理を実装して下さい。元の文章の与え方は特に問いません。参考: 確かに”読めてしまう”コピペ

話題になったケンブリッジ大学の研究成果。

こんちには みさなん おんげき ですか? わしたは げんき です。この ぶんょしう は いりぎす の ケブンッリジ だがいく の けゅきんう の けっかにんんげ は もじ を にしんき する とき その さしいょ と さいご の もさじえ あいてっればじばんゅん は めくちちゃゃ でも ちんゃと よめる という けゅきんう に もづいとてわざと もじの じんばゅん を いかれえて あまりす。どでうす? ちんゃと よゃちめう でしょ?ちんゃと よためら はのんう よしろく

以下投稿したコード。PHP。ネストがダサい。マルチバイト対応のstr_shuffle()がないのでmb_str_shuffle()を作成。

$utf8_str = <<<HERE  
こんにちは みなさん おげんき ですか? わたしは げんき です。  
この ぶんしょう  いぎりす  ケンブリッジ だいがく  けんきゅう  けっか  
にんげん  もじ  にんしき する とき その さしいょ  さいご  もじさえ あっていれば  
じゅんばん  めちゃくちゃ でも ちゃんと よめる という けんきゅう  もとづいて  
わざと もじの じゅんばん  いれかえて あります。  
どうです? ちゃんと よめちゃう でしょ?  
ちゃんと よめたら はんのう よろしく  
HERE;  
  
echo Cambridge( $utf8_str, ‘UTF-8 );  
  
function Cambridge( $text, $enc )  
{  
	$ret = ;  
	$lines = explode( “\n”, $text );  
	foreach ( $lines as $line ) {  
		$words = explode(  , trim($line) );  
		foreach ( $words as $word ) {  
			$len = mb_strlen( $word, $enc );  
			if ( 3 <  $len ) {  
				$head = mb_substr( $word, 0, 1, $enc );  
				$body = mb_str_shuffle( mb_substr( $word, 1, $len-2, $enc ), $enc );  
				$foot = mb_substr( $word, $len-1, 1, $enc );  
				$word = $head.$body.$foot;  
			}  
			$ret .= $word. ;  
		}  
		$ret = rtrim( $ret ).”\n”;  
	}  
	return $ret;  
}  
  
function mb_str_shuffle( $str, $enc )  
{  
	$buff = array();  
	while ( $len = mb_strlen( $str, $enc ) ) {  
		$buff[] = mb_substr( $str, 0, 1, $enc );  
		$str = mb_substr( $str, 1, $len, $enc);  
	}  
	shuffle( $buff );  
	return implode( , $buff );  
}

文字を並び替えた結果、元の並びと同じになる事と、句読点や疑問符、感嘆符などを1文字として扱っている事(そうすべきではないと思う)は、単純さを優先したため考慮していない。

以下出力結果。よしろく。

こんにちは みさなん おんげき でかす? わしたは げんき です。この ぶょしんう は いぎりす の ケンッブリジ だいがく の けんゅきう の けっかにんげん は もじ を にしんき する とき その さいしょ と さいご の もじさえ あれいてっばじんゅばん は めちゃちくゃ でも ちゃんと よめる という けゅきんう に もとづいてわざと もじの じばゅんん を いれえかて あますり。どでうす? ちゃんと よちめゃう でょし?ちんゃと よためら はのんう よしろく