找回密码
 加入
搜索
楼主: afan

[效率算法] 文章仿古文竖排的练习

 火... [复制链接]
发表于 2010-3-9 15:28:06 | 显示全部楼层
我得看看
发表于 2010-3-9 16:11:43 | 显示全部楼层
看起来,挺有趣的,看看怎么实现的!~~
发表于 2010-3-9 16:12:21 | 显示全部楼层
看看!!!
发表于 2010-3-9 17:06:35 | 显示全部楼层
還真多人回復! 希望下次能出簡單一點的題目...

小弟也很想玩啊~~~
发表于 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][14],$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
再贴个运行图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +100 收起 理由
afan + 100 学习了

查看全部评分

发表于 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
好吧 方法非主流了

输出正常了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +100 收起 理由
afan + 100 学习了

查看全部评分

发表于 2010-3-9 17:34:13 | 显示全部楼层
回复  sensel


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



    = = 个人讨厌匈牙利命名法 其实驼峰不是很好么- -!
 楼主| 发表于 2010-3-9 17:59:57 | 显示全部楼层
好吧 方法非主流了
rolaka 发表于 2010-3-9 17:32



    貌似大虾的排列有问题哦,你用1#的文字测试下……
发表于 2010-3-9 18:11:28 | 显示全部楼层
貌似大虾的排列有问题哦,你用1#的文字测试下……
afan 发表于 2010-3-9 17:59



    修复了- -
发表于 2010-3-9 19:42:47 | 显示全部楼层
有点难度,先看看怎么做
发表于 2010-3-9 20:07:28 | 显示全部楼层
回复 28# pusofalse


pusofalse兄总是不吝惜赞美之辞,胸怀气度令我等佩服。
发表于 2010-3-9 20:23:51 | 显示全部楼层
吸取高手的经验以提高自己的能力
发表于 2010-3-9 20:35:41 | 显示全部楼层
还是来偷看一下高手做的。。。。。。
 楼主| 发表于 2010-3-9 22:12:40 | 显示全部楼层
要结题了,目前效率最高的是 pusofalse 版,不知还有没有更高效的出现,嘿嘿~
 楼主| 发表于 2010-3-9 23:08:25 | 显示全部楼层
1#已贴出我之前写的,毫无技巧,仅供飘过练飞~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 12:01 , Processed in 0.076467 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表