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#已贴出我之前写的,毫无技巧,仅供飘过练飞~