|
pusofalse
银牌会员
积分 1604
发帖 646
注册 2008-4-13
状态 离线
|
『楼 主』:
[求助]文本计算并输出
文本计算输出。。。
a.txt
是加密过的一段密文,如下:
I S W Z P N Q C K M Y Y Y J K A Y Y E Z F F S W E E S S P G Z X Q A H F
I S W Z P N Q C K M T V Y J O A C V E H A E S A Z R L T P Q I Z M X O T
Q S W M C V U D S I J G G D E U W A Z R S F X W I L K U E J Q L D A C B
G D L Y J X M Y L M D Q K Z M P L D I L Q E M W F S W D P A Z E Z Q N W
D Y W D Z X F S A E E A Z J D U E L V P T M C E K W S E E F U R Z F S W
D P X A C Q A F K M X W A W V E Z F S D B G D L A Y U Q X G D P E K W S
E E F U R Z F S W D P O U E Z K Z M Y L Q N P Q Q D E M J T Q Y G U V A
Z O G R W A W P V U E Q A F J Q J G G C O M J Z A H Q A F K T J D K A D
M N W P J G G C W K P K A Y E Q Z Z P T V K Z M Q G W D V F A H L T L L
U S S P X A Z P G Z J G G O S D W A Z R K A E Z Q C W K Z M M C W I T L
T E Z M E D A Z C A Y Q X Y Z A F J R L U Q L K U Q Q A F J Q Y W H P J T F J
F L K U Q Q A F J Q Y W H P J P Z O X Y Z Z D Z M W D U M W F S W A Y W R Z J
K Z M I S G B T F O S E E J G G D G R A B C E D K M M F D M D P A R Q J A H F
U D K T Z O Z E Z Q Y A I T D A B C X V F A H L T L L K Z M M C W Z Z V D P S
Y P J
如何计算红色字符串出现的次数。。。
注,字母完全是随机排列的,找到里面出现过一次以上的字符串。是字符串,不是字符。
然后计算出相同的字符串之间的字母个数,包括第二次出现的该字符串,但不包括第一次出现的字符串。。
举个例子来说,b.txt:
a j k m l a j k s m l a b
a j k 出现过两次,输出a j k,并输出“从第一个a j k结束后的第一个字母m算起,一直到第二个a j k结束”其间(即m----k)的字母个数”即5
m l a 同样出现过两次,要求同上。。。
想了半天没想出来。。求教各位达人~ 谢谢。。。
[ Last edited by pusofalse on 2008-7-2 at 04:10 AM ]
|
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^ |
|
2008-7-2 04:05 |
|
|
26933062
银牌会员
积分 2268
发帖 879
注册 2006-12-19
状态 离线
|
『第
2 楼』:
仅仅对样本文件有效,太多的因素没有考虑进去
如:以 xyz 为例
xyz xyz 在同一行时 或是在文本中出现2次以上时、
或xyz单独占一行时、都不会有正确结果。
:
@echo off&setlocal enabledelayedexpansion
set "var1=I S W Z P N Q C K M"
set "var2=X Y Z"
set "var3=A B C"
for /f "delims=" %%a in (a.txt) do (
set "str=%%a"
set "num=!str:*%var1%=!"
call :duibi "%var1%" 1
set "num=!str:*%var2%=!"
call :duibi "%var2%" 2
set "num=!str:*%var3%=!"
call :duibi "%var3%" 3
)
pause
:loop
if !n.%2! equ 2 set num=!str:%num%=!
for %%i in (!num!) do set /a m.%2+=1
if !n.%2! equ 2 echo 字符串 %~1 之间有 !m.%2! 个字母。
goto :eof
:duibi
if /i not "!str!"=="!num!" (
set /a n.%2+=1
call :loop "%~1" %2
)
goto :eof
|
致精致简! |
|
2008-7-2 06:15 |
|
|
pusofalse
银牌会员
积分 1604
发帖 646
注册 2008-4-13
状态 离线
|
『第
3 楼』:
感谢!~
有一点遗憾。。我所希望的是只要出现一次以上的字符串,都被输出~
范文中的红色部分,是我为了方便说明而加上的,重复的字串还有很多~
|
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^ |
|
2008-7-2 07:53 |
|
|
zh159
金牌会员
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
『第
4 楼』:
这种查找随机组合的估计超牛人才行了,批处理的工程量绝对不小,你这里的随机组合绝对不下万种
PS:你说的应该是出现二次以上的字符串吧,否则出现一次以上的字符串在任何时候几乎都是N多的
|
|
|
2008-7-2 08:47 |
|
|
HAT
版主
积分 9023
发帖 5017
注册 2007-5-31
状态 离线
|
『第
5 楼』:
如果楼主学过《编译原理》,一定知道词法分析器是什么东西。
如果你知道用C语言写个词法分析器需要多少行代码,就知道这个批处理的工作量有多大了。
更何况还要考虑到N多的随机组合,即使能用批处理写出来,执行效率也值得担忧。
个人认为这个不适合用批处理来写。
|
|
|
2008-7-2 09:19 |
|
|
pusofalse
银牌会员
积分 1604
发帖 646
注册 2008-4-13
状态 离线
|
『第
6 楼』:
其实这跟维热纳尔方针有关。。。涉及到字符串出现的频率和两相同字符串之间的间隔长度。。。
可以有一种思路啊。。。仍旧是变量截取移位
先把a.txt的内容所有内容连为一句,并赋予变量a,去掉变量a中的空格,并计算其长度n。
然后第一次循环截取变量a中字串。偏移量为0,长度为2...3...4...一直到n 并把变量的值设为变量并给其赋值
然后第二次循环截取变量a中字串。偏移量为1,长度为2...3...4...一直到n-1 并把变量的值设为变量并给其赋值
如此循环n次。。。
至于把变量的值设为变量并给其赋值,就是为了判断有无重复~ 有则输出。。。
|
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^ |
|
2008-7-2 10:58 |
|
|
danjiang
初级用户
积分 79
发帖 45
注册 2007-11-28
状态 离线
|
|
2008-7-2 14:26 |
|
|
lxmxn
版主
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
8 楼』:
用Perl写了个,思路比较简单,可能有更好的算法来提高效率。
Quote: | 1 use strict;
2 use warnings;
3
4 open FH,'<myfile.txt';
5 my $filecontent;
6 {
7 undef $/;
8 $filecontent=<FH>;
9 }
10
11 $filecontent =~ s/[\s\n]+//g;
12 # print $filecontent,"\n";
13
14 my $filesize=length($filecontent);
15
16 my $hash;
17
18 for (my $i=0; $i<=$filesize; $i++) {
19 my $mainline=substr($filecontent,$i);
20 for (my $j=2; $j <= $filesize-$i; $j++) {
21 my $subline=substr($filecontent,$i,$j);
22 my $count=0;
23 while($mainline =~ m/$subline/g) {
24 push(@{$hash->{$subline}},$-[0]) if $-[0] > 0 ;
25 }
26 }
27 }
28
29 foreach (keys %$hash) {
30 print "[$_]:@{$hash->{$_}}\n"
31 } |
|
结果如下所示:
Quote: | [KUQQAFJQ]:18
[JQYW]:18
[JGG]:186 210 252 369 24 66 183 42 159 117
[BC]:35
[QYW]:18
[LKUQQAFJQ]:18
[FJQYWHPJ]:18
[EKWS]:45
[AFJ]:111 123 141 12 30 18
[ZM]:54 165 243 285 295 355 372 438 111 189 231 241 301 318 384 78 120 130 190 207 273 42 52 112 129 195 10 70 87 153 60 77 143 17 83 66
[QQAF]:18
[AY]:189 285 354 417 96 165 228 69 132 63
[TLL]:180
[MWF]:297
[LKUQQAFJQY]:18
[JG]:186 210 252 369 24 66 183 42 159 117
[DP]:45 75 90 333 378 30 45 288 333 15 258 303 243 288 45
[AFJQYWHP]:18
[WZPNQCK]:36
[WD]:9 12 45 90 180 290 3 36 81 171 281 33 78 168 278 45 135 245 90 200 110
.... |
|
|
|
2008-7-2 16:01 |
|
|
pusofalse
银牌会员
积分 1604
发帖 646
注册 2008-4-13
状态 离线
|
『第
9 楼』:
Quote: | Originally posted by lxmxn at 2008-7-2 04:01 PM:
用Perl写了个,思路比较简单,可能有更好的算法来提高效率。
结果如下所示:
|
|
想知道这段代码用什么工具可编译为可执行文件?~
|
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^ |
|
2008-7-2 16:04 |
|
|
lxmxn
版主
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
10 楼』:
perlcc
perl2exe
Perl Dev Kit
|
|
2008-7-2 16:15 |
|
|
pusofalse
银牌会员
积分 1604
发帖 646
注册 2008-4-13
状态 离线
|
『第
11 楼』:
谢谢 ^_^
|
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^ |
|
2008-7-3 01:08 |
|