免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6483 | 回复: 23
打印 上一主题 下一主题

看似简单的问题,求最简方法!请大侠们解答! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-21 10:45 |只看该作者 |倒序浏览
问题:有一个文本文件a.txt,内容为:

jlsdjl
dsflepdf
dfj
ipwier
======   dfg
fds
djfl
rewuoi
======   qqw
dsfj
wruo
======   eurew

要求:将每个横线间的内容随机输出到b.txt,例如:

dsflepdf
dfj
ipwier
jlsdjl
======   dfg
djfl
fds
rewuoi
======   qqw
wruo
dsfj
======   eurew

有横线行的位置相对不变。环境:winxp,perl5.8;请高手解答!

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2011-06-21 10:53 |只看该作者
List::Util 有个 shuffle 可以用来随机排列

论坛徽章:
0
3 [报告]
发表于 2011-06-21 11:08 |只看该作者
谢谢楼上了,但是,最好不要用模块,用基本方法,时间来不及。

论坛徽章:
0
4 [报告]
发表于 2011-06-21 11:30 |只看该作者
本帖最后由 guap514 于 2011-06-21 13:33 编辑

回复 1# ggglw
  1. print sort { $hash->{$a} <=> $hash->{$b} } map { $hash->{ $_ } = /=/ ? ++$i : $i + rand(); $_ } <DATA>;

  2. __DATA__
  3. jlsdjl
  4. dsflepdf
  5. dfj
  6. ipwier
  7. ======   dfg
  8. fds
  9. djfl
  10. rewuoi
  11. ======   qqw
  12. dsfj
  13. wruo
  14. ======   eurew
复制代码
----
  1. print map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [ $_, /=/ ? ++$i : $i + rand() ] } <DATA>;
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2011-06-21 11:31 |只看该作者
不用 shuffle 怎么做啊,自己写个 shuffle 太长不了够简单啊

论坛徽章:
0
6 [报告]
发表于 2011-06-21 11:36 |只看该作者
模块 不就是用来解决时间问题的么

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2011-06-21 11:37 |只看该作者
4楼的思路比较有意思
  1. use List::Util qw(shuffle);

  2. my @data;
  3. while (<>) {
  4.     if (/^=/ or eof) {
  5.         print shuffle @data;
  6.         print;
  7.         @data = ();
  8.     }
  9.     else {
  10.         push @data, $_;
  11.     }
  12. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2011-06-21 11:37 |只看该作者
太感谢guap514的回答了!你的代码很精彩,只有一行,符合要求!
继续求其他方法!

论坛徽章:
0
9 [报告]
发表于 2011-06-21 11:40 |只看该作者
回复 7# zhlong8


    不过有几个致命的问题 就是数据不能有重复 而且不能太多

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
10 [报告]
发表于 2011-06-21 11:56 |只看该作者
回复  zhlong8


    不过有几个致命的问题 就是数据不能有重复 而且不能太多
guap514 发表于 2011-06-21 11:40



    像这种复杂点的情况用一行的往往都是 FP 风格,效率问题难免的。至于不能有重复用数组替代 hash 的功能就可以了,直接 push 进去 [$_, $i+rand]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP