文字列でプラスを出力

文字列で+を表示する
http://ja.doukaku.org/291/lang/other/

の問題を多少変えてます。
問題で使われていたワード "doukaku" の語尾にdが付くのが嫌なので以下の出力結果になるようにしました。


出力結果:

 0 |      doukaku
 1 |      o     k
 2 |      u     a
 3 |      k     k
 4 |      a     u
 5 |      k     o
 6 |doukaku     doukaku
 7 |o                 k
 8 |u                 a
 9 |k                 k
10 |a                 u
11 |k                 o
12 |ukakuod     ukakuod
13 |      o     k
14 |      u     a
15 |      k     k
16 |      a     u
17 |      k     o
18 |      ukakuod


考えるのが苦手だなとつくづく思います。
沢山コードを書けばましになるかな。。


[ソースコード]

namespace Doukakuorg

(*
    文字列を+で表示
*)
type C291 private () =
    member this.Run (text : string) =
        let max = text.Length - 1
        let space = new string(' ', max)
        let reverse = new string(Array.rev (text.ToCharArray()))
        let mutable soucount = 0

        for i in 0..(max * 3) do
            printf "%2d |" i

            if i < max || max * 2 < i then
                printf "%s" space

            if i % max = 0 then
                soucount <- soucount + 1
                if soucount <= 2 then
                    printf "%s" text
                else
                    printf "%s" reverse

                if 2 <= soucount && soucount <= 3 then
                    printf "%s" (space.[0..max-2])
                    if soucount <= 2 then
                        printf "%s" text
                    else
                        printf "%s" reverse
            else
                printf "%c" text.[i % max]
                if 2 = soucount then
                    printf "%s" space
                    printf "%s" (space.[0..max-2])
                    printf "%s" space
                    printf "%c" reverse.[i % max]
                else
                    printf "%s" (space.[0..max-2])
                    printf "%c" reverse.[i % max]

            printfn ""
            ()
        ()

    static member Start() =
        let text = "doukaku"
        (new C291()).Run(text);
        ()