标题: [求助]文本计算并输出
[打印本页]
作者: pusofalse
时间: 2008-7-2 04:05
标题: [求助]文本计算并输出
文本计算输出。。。
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 ]
作者: 26933062
时间: 2008-7-2 06:15
仅仅对样本文件有效,太多的因素没有考虑进去
如:以 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
作者: pusofalse
时间: 2008-7-2 07:53
感谢!~
有一点遗憾。。我所希望的是只要出现一次以上的字符串,都被输出~
范文中的红色部分,是我为了方便说明而加上的,重复的字串还有很多~
作者: zh159
时间: 2008-7-2 08:47
这种查找随机组合的估计超牛人才行了,批处理的工程量绝对不小,你这里的随机组合绝对不下万种
PS:你说的应该是出现
二次以上的字符串吧,否则出现
一次以上的字符串在任何时候几乎都是N多的
作者: HAT
时间: 2008-7-2 09:19
如果楼主学过《编译原理》,一定知道词法分析器是什么东西。
如果你知道用C语言写个词法分析器需要多少行代码,就知道这个批处理的工作量有多大了。
更何况还要考虑到N多的随机组合,即使能用批处理写出来,执行效率也值得担忧。
个人认为这个不适合用批处理来写。
作者: pusofalse
时间: 2008-7-2 10:58
其实这跟维热纳尔方针有关。。。涉及到字符串出现的频率和两相同字符串之间的间隔长度。。。
可以有一种思路啊。。。仍旧是变量截取移位
先把a.txt的内容所有内容连为一句,并赋予变量a,去掉变量a中的空格,并计算其长度n。
然后第一次循环截取变量a中字串。偏移量为0,长度为2...3...4...一直到n 并把变量的值设为变量并给其赋值
然后第二次循环截取变量a中字串。偏移量为1,长度为2...3...4...一直到n-1 并把变量的值设为变量并给其赋值
如此循环n次。。。
至于把变量的值设为变量并给其赋值,就是为了判断有无重复~ 有则输出。。。
作者: danjiang
时间: 2008-7-2 14:26
路过,学习
作者: lxmxn
时间: 2008-7-2 16:01
用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
.... |
|
作者: pusofalse
时间: 2008-7-2 16:04
Quote: |
Originally posted by lxmxn at 2008-7-2 04:01 PM:
用Perl写了个,思路比较简单,可能有更好的算法来提高效率。
结果如下所示:
|
|
想知道这段代码用什么工具可编译为可执行文件?~
作者: lxmxn
时间: 2008-7-2 16:15
perlcc
perl2exe
Perl Dev Kit
作者: pusofalse
时间: 2008-7-3 01:08
谢谢 ^_^