nmgwddj 发表于 2010-3-9 15:28:06

我得看看:face (22):

冷风无泪 发表于 2010-3-9 16:11:43

看起来,挺有趣的,看看怎么实现的!~~

xatbs 发表于 2010-3-9 16:12:21

看看!!!

We! 发表于 2010-3-9 17:06:35

還真多人回復! 希望下次能出簡單一點的題目...

小弟也很想玩啊~~~

C.L 发表于 2010-3-9 17:07:21

本帖最后由 C.L 于 2010-3-9 17:12 编辑

做这道题有点蛋疼,不过还是做出来了,也是笨办法.$time = TimerInit ()
$sText = _
                "这是个将文章以仿古文的形式竖向排列的练习,欢迎各位童鞋参与,参与练习的均有米米发放。呵呵~" & @CR & _
                "练习的要求很简单,如下(不,应该是如左):" & @CR & _
                "1,将练习文本以每个章节18列竖向排列,每列文字12个,由上至下、由右及左的阅读顺序;" & @CR & _
                "2,排列必须做到横纵对齐。" & @CR& _
                "在此基础上能做到以下要求的更好:" & @CR & _
                "1,将半角的字符转为全角,如“ABC123”;" & @CR & _
                "2,能加上装饰边框线;" & @CR & _
                "3,断行时需另为下一列;" & @CR & _
                "4,章节填满后需往下另开新章节。" & @CR & _
                "有兴趣的就来试试吧,两日内以完成时间(ms计)最短的为最佳答案(均以本人同机自测为准)。" & @CR & _
                "没兴趣或者觉得太简单的就请飘过吧…" & @CR & _
                "另注:" & @CR & _
                "这个是加了边框线表格线的例子,在本论坛的帖子中由于行距被加大而不那么完美,在记事本中可以完美显示竖线无间断~"

$sLen = int(StringLen ($sText)/12)
$sLen = (Int ($sLen / 20)+1)*20
Global $astr [$sLen],$o=1
TextToArray ()       
drawline ()
$result = arrayToStr()
MsgBox (0,"用时:"&TimerDiff($time)&"ms",$result)

Func arrayToStr ()
        Dim $e=19,$s=0,$finish=""
        While $e < $sLen
                $finish = xx($s,$e)&@CRLF&$finish
                $s=$e+1
                $e+=20
        WEnd
        Return $finish
EndFunc
       
Func xx ($s,$e)
        Dim $sOut = ""
        For $m = 0 to 13
                For $n = $s To $e
                        $sTem = $astr[$n][$m]
                        If $sTem <> "" Then
                                $sOut &= $sTem
                        Else
                                $sOut &= $sTem&"│"
                        EndIf
                        If Mod($n,20)==19 And $n <> 0 Then
                                $sOut &= @crlf
                        EndIf
                Next
        Next
        Return $sOut
EndFunc

Func drawline ()
                For $n = $sLen -1 To 0 step -1
                        For $m = 0 to 13
                                If Mod ($n,20)==0 Or Mod ($n,20)==19 Then
                                        If $m == 0 Or $m == 13 Then
                                                $astr [$n][$m] = "╃"
                                        Else
                                                $astr [$n][$m] = "║"
                                        EndIf
                                Else
                                        if $m == 0 Then
                                                $astr [$n][$m] = "─┬"
                                        elseIf $m == 13 Then
                                                $astr [$n][$m] = "─┴"
                                        EndIf
                                EndIf
                        Next
                Next
EndFunc
       

Func TextToArray ()
                For $n = $sLen -1 To 0 step -1
                        For $m = 0 to 13
                                If Mod ($n+1,20)==0 Then ExitLoop
                                If $m <> 0 And $m <> 13 Then
                                        $tText = StringMid ($sText,$o,1)
                                        If $tText == @CR Or $tText == "" Then
                                                $o+=1
                                                ExitLoop
                                        EndIf
                                        If AscW($tText) >= 32 AND AscW($tText) <= 126 Then $tText = ChrW(65248 + AscW($tText))
        ;~                                         MsgBox (0,"",$tText&@cr&$n&@cr&$m)
                                        If Mod ($n,20)==0 Or Mod ($n,20)==18 Then
                                                $astr [$n][$m]= $tText       
                                        Else
                                                $astr [$n][$m] = $tText&"│"
                                        EndIf
                                        $o+=1
                                EndIf
                        Next
                Next
EndFunc
再贴个运行图:

rolaka 发表于 2010-3-9 17:32:22

本帖最后由 rolaka 于 2010-3-9 18:41 编辑


$time = TimerInit()
$string = _
                "这是个将文章以仿古文的形式竖向排列的练习,欢迎各位童鞋参与,参与练习的均有米米发放。呵呵~" & @CRLF & _
                "练习的要求很简单,如下(不,应该是如左):" & @CRLF & _
                "1,将练习文本以每个章节18列竖向排列,每列文字12个,由上至下、由右及左的阅读顺序;" & @CRLF & _
                "2,排列必须做到横纵对齐。" & @CRLF & _
                "在此基础上能做到以下要求的更好:" & @CRLF & _
                "1,将半角的字符转为全角,如“ABC123”;" & @CRLF & _
                "2,能加上装饰边框线;" & @CRLF & _
                "3,断行时需另为下一列;" & @CRLF & _
                "4,章节填满后需往下另开新章节。" & @CRLF & _
                "有兴趣的就来试试吧,两日内以完成时间(ms计)最短的为最佳答案(均以本人同机自测为准)。" & @CRLF & _
                "没兴趣或者觉得太简单的就请飘过吧…" & @CRLF & _
                "另注:" & @CRLF & _
                "这个是加了边框线表格线的例子,在本论坛的帖子中由于行距被加大而不那么完美,在记事本中可以完美显示竖线无间断~"
$array = StringToASCIIArray(StringStripCR($string))
$arraySize = UBound($array)
$arrayIndex = 0
$arrayAnte = ""
For $i = 0 To $arraySize - 1
        If $array[$i] == 10 Then
                $mod = Mod($arrayIndex, 12)
                If $mod <> 0 Then
                        For $n = 0 To 12-$mod-1
                                $arrayAnte &= 12288 & "|"
                        Next
                        $arrayIndex += 12-$mod
                EndIf
        Else
                $arrayAnte &= $array[$i] & "|"
                $arrayIndex += 1
        EndIf
Next
$array = StringSplit($arrayAnte, "|", 2)
$arraySize = UBound($array)
$out = ""
For $i = 0 To $arraySize / 216
        $out &= "╃─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─╄" & @CRLF
        For $line = 1 To 12
                $out &= "║"
                For $row = 17 To 0 Step -1
                        $index = ($line + ($row * 12) + ($i * 216)) - 1
                        If $index > $arraySize - 1 Or $array[$index] == "" Then
                                $out &= ChrW(12288)
                        Else
                                $out &= ChrW(_SBC($array[$index]))
                        EndIf
                        If $row <> 0 Then
                                $out &= "│"
                        EndIf
                Next
                $out &= "║" & @CRLF
        Next
        $out &= "╃─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─╄" & @CRLF
Next

MsgBox(0, TimerDiff($time), $out)

Func _SBC($ascii)
        If $ascii == 32 Then
                Return 12288
        EndIf
        If $ascii < 127 Then
                Return $ascii + 65248
        EndIf
        Return $ascii
EndFunc   ;==>_SBC
好吧 方法非主流了

输出正常了

rolaka 发表于 2010-3-9 17:34:13

回复sensel


    代码真是漂亮极了~!
代码结构,变量、函数的命名,还有格式缩进,以及强大的运行 ...
pusofalse 发表于 2010-3-9 14:50 http://www.autoitx.com/images/common/back.gif


    = = 个人讨厌匈牙利命名法 其实驼峰不是很好么- -!

afan 发表于 2010-3-9 17:59:57

好吧 方法非主流了
rolaka 发表于 2010-3-9 17:32 http://www.autoitx.com/images/common/back.gif


    貌似大虾的排列有问题哦,你用1#的文字测试下……

rolaka 发表于 2010-3-9 18:11:28

貌似大虾的排列有问题哦,你用1#的文字测试下……
afan 发表于 2010-3-9 17:59 http://www.autoitx.com/images/common/back.gif


    修复了- -

xiaoy 发表于 2010-3-9 19:42:47

有点难度,先看看怎么做

sensel 发表于 2010-3-9 20:07:28

回复 28# pusofalse


pusofalse兄总是不吝惜赞美之辞,胸怀气度令我等佩服。

jonyzhr 发表于 2010-3-9 20:23:51

吸取高手的经验以提高自己的能力

xdcysten 发表于 2010-3-9 20:35:41

还是来偷看一下高手做的。。。。。。

afan 发表于 2010-3-9 22:12:40

要结题了,目前效率最高的是 pusofalse 版,不知还有没有更高效的出现,嘿嘿~

afan 发表于 2010-3-9 23:08:25

1#已贴出我之前写的,毫无技巧,仅供飘过练飞~
页: 1 2 [3] 4 5 6 7 8
查看完整版本: 文章仿古文竖排的练习