PHPのスクリプトを作っていただけないでしょうか。

いくつかの文字列をあるルールに従って並べて書き出すスクリプトです。
いるか賞(できるだけ軽く動作するものを望みます)には、少ないですが500ポイントを差し上げます。

具体的には、いくつかの文字の組み合わせで出来た文字列を与え、各行の文字数を決めると「下の文字列はすぐ上の文字列に1文字加えたものか、1文字減らしたものしか置けない」「各文字列は一度しか使えない」というルールにしたがって文字列を並べてくれるというものです。(ルールを満たす並べ方が複数ある場合はすべて書き出し、不可能な場合はエラーを返す)
例えばa,b,c3文字の組み合わせで出来た文字列、a,b,c,ab,bc,ac,abcを与え、各行の文字数を(1,2,1,2,1,2,3)と決めると、

a
ab
b
bc
c
ac
abc

等(実際は他にもあります)の結果を書き出してくれるスクリプトです。この例は3文字で出来た7つの文字列でしたが、文字数や文字列数が増えても対応出来るものを希望します。
説明に解りにくい部分があれば質問してください。
また、以前よく似た質問をしましたのでそちらも参考にしてください。
http://q.hatena.ne.jp/1207875536
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/10/03 08:45:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:GoldenDawn No.1

回答回数426ベストアンサー獲得回数81

ポイント60pt

ちょっと速くなった。

文字コードは UTF-8。

<pre>
<?php
mb_internal_encoding('utf-8') ;

function search_patterns($strings, $lengths, $ordered = array()) {
  if (count($strings) < count($lengths)) return false ;

  global $result ;
  if ($ordered == array()) $result = array() ;

  $clen = array_shift($lengths) ;
  for ($i = 0; $i < count($strings); ++$i, array_push($strings, array_shift($strings))) {
    if (mb_strlen($strings[0]) == $clen) {
      if ($ordered != array()) {
        $cc = preg_split('//u', $strings[0],   -1, PREG_SPLIT_NO_EMPTY) ;
        $rc = preg_split('//u', end($ordered), -1, PREG_SPLIT_NO_EMPTY) ;

        $npat = array_merge($cc, $rc) ;
        $nl = count($npat) ;
        $ul = count(array_unique($npat)) ;
        if (($nl - ($nl - $ul)*2) != 1) continue ;
      }

      $next_strngs = $strings ;
      $next_ordered = $ordered ;
      array_push($next_ordered, array_shift($next_strngs)) ;

      if (count($lengths) == 0) array_push($result, $next_ordered) ;
      else search_patterns($next_strngs, $lengths, $next_ordered) ;
    }
  }

  return count($result) ? $result : false ;
}


$s = array('a', 'b', 'c', 'ab', 'bc', 'ac', 'abc') ;
$l = array(1, 2, 1, 2, 1, 2, 3) ;
$r = search_patterns($s, $l) ;
if ($r) for ($i = 0; $i < count($r); ++$i) echo implode(" ", $r[$i])."\n" ;
else echo "エラー\n" ;
echo "\n" ;

// 1 の次に 3 がある不正なデータ
$s = array('a', 'b', 'c', 'ab', 'bc', 'ac', 'abc') ;
$l = array(1, 3, 1, 2, 1, 2, 3) ;
$r = search_patterns($s, $l) ;
if ($r) for ($i = 0; $i < count($r); ++$i) echo implode(" ", $r[$i])."\n" ;
else echo "エラー\n" ;
echo "\n" ;

$s = array('', '', '', '',
           'あい', 'あう', 'あえ', 'いう', 'いえ', 'うえ',
           'あいう', 'あいえ', 'いうえ', 'あいうえ') ;
$l = array(1, 2, 3, 2, 1, 2, 3, 2, 3, 4) ;
$r = search_patterns($s, $l) ;
if ($r) for ($i = 0; $i < count($r); ++$i) echo implode(" ", $r[$i])."\n" ;
else echo "エラー\n" ;
?>
</pre>

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません