llztt
发表于 2010-1-18 18:34:37
array.au3的ArraySort是支持两维的,不知道会否影响效率,所以我用了提取后的单维算法,不过还真没测试过实际差别
a781805288
发表于 2010-1-19 11:42:28
能力问题啊!!!
supersp
发表于 2010-1-19 12:58:21
本帖最后由 supersp 于 2010-1-19 13:02 编辑
本地运行时间,2.3毫秒
$begin = TimerInit()
$chars = FileRead("a.txt")
Local $outs,$array
For $i = 65 To 90
$var = "(:(?i:"&Chr($i)&")\S*(?i:\r\n\S+)+)"
$array = StringRegExp($chars,$var,3)
If IsArray($array) Then
for $j = 0 to UBound($array) - 1
$outs &= @CRLF & $array[$j] & @CRLF
Next
EndIf
$array=0
Next
$dif = TimerDiff($begin)
msgbox (0,"",$dif&@CRLF&$outs)
原本正则前面有 (?i:^|\n)的..但是取出的第一行总是少个@Crlf,在循环中要加个判断,为了方便跟效率就去掉了,虽然不是完全跟a.txt里一样,但输出符合格式就行..
afan
发表于 2010-1-19 13:05:46
回复 48# supersp
好像排序还是有点问题哦~ :tr :te
supersp
发表于 2010-1-19 13:11:22
本帖最后由 supersp 于 2010-1-19 15:50 编辑
我这里测试没有吧..
按顺序从a-z来匹配段落,并合并到字符串
不过没考虑段落中间有空行的情况
对了,理解错了,,,我只考虑了首字母排序问题...
=.= 因为考虑到不使用数组函数..
所以tr te就是原来的顺序了
hzxymkb
发表于 2010-1-19 14:17:43
来这里混了这么久!连这个题目都做不出来!真是。。。。。。。。。。。
supersp
发表于 2010-1-19 15:49:46
咳...楼上是说我吗?
虽然2008年注册的,不过在线时间8小时..
差不多3小时是今天挂的
298311657
发表于 2010-1-20 01:58:07
本帖最后由 298311657 于 2010-1-20 03:03 编辑
几天没上论坛,又出新题目了啊
我用正则匹配写了一个Dim $a = [], $Out = ''
$begin = TimerInit()
;取文本数据
$file = FileOpen("a.txt", 0)
If $file = -1 Then Exit
$chars = FileRead($file)&@CRLF&@CRLF
FileClose($file)
;正则匹配取得的文本内容
$nOffset = 1
While 1
$array = StringRegExp($chars, '^:.*?|\n:.*?', 1, $nOffset)
If @error = 0 Then
$nOffset = @extended
ReDim $a[$a + 1]
$a += 1
$a[$a-1] = $nOffset - 1
Else
ExitLoop
EndIf
WEnd
$a -= 1
If $a = 0 Then Exit;未发现:开始的段落则退出
;取出各段落的内容
For $i = 1 To $a
If $i = $a Then
$a[$i] = StringMid($chars,$a[$i])
Else
$a[$i] = StringMid($chars,$a[$i],$a[$i+1]-$a[$i])
EndIf
Next
;对段落进行排序,也许还有更高效的算法
For $i = 1 To $a
For $s = $i To $a - 1
If $a[$i] > $a[$s+1] Then
$tmp0 = $a[$i]
$tmp1 = $a[$i]
$a[$i] = $a[$s+1]
$a[$i] = $a[$s+1]
$a[$s+1] = $tmp0
$a[$s+1] = $tmp1
Else
ExitLoop
EndIf
Next
Next
;整理输出
For $i = 1 To $a
If $i = $a Then
$Out &= StringRegExpReplace($a[$i],'\n\s*\r','');删除最后的输出段落的空白符
Else
$Out &= $a[$i]
EndIf
Next
$dif = TimerDiff($begin)
MsgBox(0,'耗时'&$dif,$Out)
298311657
发表于 2010-1-20 02:02:51
本帖最后由 298311657 于 2010-1-20 02:19 编辑
网络太卡了,造成连贴两楼,这层清理掉~
afan
发表于 2010-1-20 02:53:58
本帖最后由 afan 于 2010-1-20 02:55 编辑
回复 53# 298311657
好像排序还是有点问题,比如下面这段测试文本:
:zxv:jhlkj
fjhgkgh,:
:aaggjgj
sfsdgsh
jyjyjkyk
fghrt,uy5:6.766
:true
true??
assign!
:false
false??
:asf
sddgfdfh_:ds
:loop
L$***,G$***
:M$
M$###,M-obj
:kkkasdf
&&&fff****232
:test
^^~!!%%^^
false??
298311657
发表于 2010-1-20 03:06:23
回复 55# afan
修改了一下正则,现在应该好了
afan
发表于 2010-1-20 03:09:29
回复 56# 298311657
还是同样的问题, :l:k :M
316428696
发表于 2010-1-22 00:16:46
传说中的正则之神么?
lubb
发表于 2010-1-30 13:43:39
高人呀,不顶不行
zouyingj
发表于 2010-1-31 16:04:55
看不懂,先收藏慢慢学习