免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: o枫叶o飘零
打印 上一主题 下一主题

[学习共享] 出个练习题,看看大神们的代码有多短 [复制链接]

论坛徽章:
1
技术图书徽章
日期:2016-02-03 16:35:25
11 [报告]
发表于 2015-12-24 13:29 |只看该作者
#!/bin/bash
for((i=3;i<=10;i++));do
        for((j=4;j<=14;j++));do
                c=$((i+j))
                if [ $c -le 14 ];then
                        seq $i $c | xargs
                fi
        done
done


大学生。。。初学者献丑了。。。

评分

参与人数 1信誉积分 +10 收起 理由
o枫叶o飘零 + 10 赞一个!

查看全部评分

论坛徽章:
6
羊年新春福章
日期:2015-03-03 17:16:28双子座
日期:2015-03-03 17:16:56巳蛇
日期:2015-03-03 17:17:2415-16赛季CBA联赛之福建
日期:2016-03-11 09:05:00黑曼巴
日期:2016-07-07 16:58:1215-16赛季CBA联赛之吉林
日期:2016-11-14 09:23:07
12 [报告]
发表于 2015-12-24 13:53 |只看该作者
本帖最后由 jcdiy0601 于 2015-12-24 13:54 编辑
  1. #!/usr/bin/env python
  2. #_*_ coding:utf-8 _*_

  3. l = [x for x in range(3,14)]
  4. for i in range(len(l)-4):
  5.         for i in range(5,len(l)+1):
  6.                 print l[:i]
  7.         l.remove(l[0])
复制代码

评分

参与人数 2可用积分 +6 信誉积分 +10 收起 理由
王楠w_n + 6 赞一个!
o枫叶o飘零 + 10 赞一个!

查看全部评分

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
13 [报告]
发表于 2015-12-24 14:00 |只看该作者
回复 1# o枫叶o飘零


这样就不算偷懒了吧:
  1. echo {3..14}|sed -nr 'h;:a;/(\w+\s){4}/p;s/\s\w+$//;ta;g;s/\w+\s//;h;/\s/ba'
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
陈卓文 + 10 碉堡了,研究后更深理解了:,t,b命令,谢谢

查看全部评分

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
14 [报告]
发表于 2015-12-24 15:00 |只看该作者
初学[]
献丑了[]
  1. #!/usr/bin/python2

  2. for i in range(3, 11):
  3.     for e, j in enumerate([range(i, 15)] * (11 - i), 5):
  4.         print j[:e]
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
o枫叶o飘零 + 10 赞一个!

查看全部评分

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
15 [报告]
发表于 2015-12-24 15:05 |只看该作者
回复 12# jcdiy0601

l = [x for x in range(3,14)]


how about this?

l = list(range(3,14))

论坛徽章:
0
16 [报告]
发表于 2015-12-24 17:38 |只看该作者
围观。。。

论坛徽章:
1
技术图书徽章
日期:2016-02-03 16:35:25
17 [报告]
发表于 2015-12-25 15:25 |只看该作者
本帖最后由 陈卓文 于 2015-12-25 15:26 编辑

小白用了1个多小时,分析大神sed命令。。。13楼~sed命令
echo {3..14}|sed -nr 'h;:a;/(\w+\s){4}/p;s/\s\w+$//;ta;g;s/\w+\s//;h;/\s/ba'

贴出过程

(一)内循环分析:
echo {3..14}|sed -nr 'h;:a;/(\w+\s){4}/p;s/\s\w+$//;ta;'
3 4 5 6 7 8 9 10 11 12 13 14
3 4 5 6 7 8 9 10 11 12 13
3 4 5 6 7 8 9 10 11 12
3 4 5 6 7 8 9 10 11
3 4 5 6 7 8 9 10
3 4 5 6 7 8 9
3 4 5 6 7 8
3 4 5 6 7

执行过程:
1.给 3 .. 14 打上了标签a,打印,然后执行s/ \w+$//替换掉最后的“ 14”,由于-n选项不会输出替换后的 3 .. 13
2.执行ta是跳转到标签a位置循环执行命令,此时这一行为 3 .. 13 执行p打印出来(打印第二行3 .. 13),然后s再替换掉“ 13”#-n选项静默,替换后没有自动打印[1]
3.再跳转到行首,打印(结果为 3 .. 12)再s替换“ 12” ...
4.循环步骤1-3,最后只剩下4个“数字+空格”,不满足/(\w+\s){4}/p,不再打印,继续执行剩下内容s/\s\w+$//;ta;直至替换行至空,结束命令[2]

注:
[1]
a.插入p输出模式空间
$ echo {3..14}|sed -nr 'h;:a;/(\w+\s){4}/p;s/\s\w+$//;p'
3 4 5 6 7 8 9 10 11 12 13 14
3 4 5 6 7 8 9 10 11 12 13
b.没有-n选项自动打印模式空间内容
$ echo {3..14}|sed -r 'h;:a;/(\w+\s){4}/p;s/\s\w+$//;'
3 4 5 6 7 8 9 10 11 12 13 14
3 4 5 6 7 8 9 10 11 12 13

[2]
若没有/(\w+\s){4}/p匹配,只有p将一直打印
$ echo {3..14}|sed -nr 'h;:a;p;s/\s\w+$//;ta;'
3 4 5 6 7 8 9 10 11 12 13 14
3 4 5 6 7 8 9 10 11 12 13
3 4 5 6 7 8 9 10 11 12
3 4 5 6 7 8 9 10 11
3 4 5 6 7 8 9 10
3 4 5 6 7 8 9
3 4 5 6 7 8
3 4 5 6 7
3 4 5 6
3 4 5
3 4
3


(二)外循环分析:

(1)删除最后的/\s/ba,替换为p(打印)
$ echo {3..14}|sed -nr 'h;:a;/(\w+\s){4}/p;s/\s\w+$//;ta;g;s/\w+\s//;h;p'
3 4 5 6 7 8 9 10 11 12 13 14
3 4 5 6 7 8 9 10 11 12 13
3 4 5 6 7 8 9 10 11 12
3 4 5 6 7 8 9 10 11
3 4 5 6 7 8 9 10
3 4 5 6 7 8 9
3 4 5 6 7 8
3 4 5 6 7
4 5 6 7 8 9 10 11 12 13 14

1.执行内循环 #h;:a;/(\w+\s){4}/p;s/\s\w+$//;ta;
2.执行完内循环后 g;s/\w+\s//;h;
g #将保持空间内容替换到掉模式空间,此时模式空间为3..14
s/\w+\s// #将第一个“数字+空格”删除
h #将模式空间保持并替换保持空间(用于下一外循环)
3.p打印模式空间4..14
4.若p改为/\s/ba(即原命令)则重新开始内循环[3],重复1-3(外循环),直至输出最后一行“10 11 12 13 14”,但是命令还在继续只不过不再打印[4]


[3]:a标签标注什么?
:a标注的是命令的这个位置,而不是模式空间

例子:使用两行,并且插入n命令
$ echo -e "3 4 5 6 7 8 9 10 11 12 13 14\na b c d e" |sed -nr 'h;n;:a;/(\w+\s){4}/p;s/\s\w+$//;ta;g;s/\w+\s//;h;/\s/ba'
a b c d e  #注意第一行输出为"a b c d e"
4 5 6 7 8 9 10 11 12 13 14 #注意第一个数字是4而不是3
4 5 6 7 8 9 10 11 12 13
4 5 6 7 8 9 10 11 12
4 5 6 7 8 9 10 11
4 5 6 7 8 9 10
4 5 6 7 8 9
4 5 6 7 8
5 6 7 8 9 10 11 12 13 14
5 6 7 8 9 10 11 12 13
5 6 7 8 9 10 11 12
5 6 7 8 9 10 11
5 6 7 8 9 10
5 6 7 8 9
6 7 8 9 10 11 12 13 14
6 7 8 9 10 11 12 13
6 7 8 9 10 11 12
6 7 8 9 10 11
6 7 8 9 10
7 8 9 10 11 12 13 14
7 8 9 10 11 12 13
7 8 9 10 11 12
7 8 9 10 11
8 9 10 11 12 13 14
8 9 10 11 12 13
8 9 10 11 12
9 10 11 12 13 14
9 10 11 12 13
10 11 12 13 14
解释:
第一步,第一个h将"3..14"保存到保持空间
第二步,执行n将输入下一行而不返回脚本顶部(即n之前的命令h不会对"a b c d e"生效),然后执行:a打印标签a.
第三步,执行内循环(打印"a b c d e"
第四步,g将保持空间内容替换模式空间,此时模式空间为"3..14",s/\w+\s//;h删除第一个“数字+空格”即“4..14",并将“4..14”替换掉保持空间的内容.
第五步,执行/\s/ba,跳转到a处循环执行命令,直至结束

[4]在命令最后插入p,打印最后的模式空间为“14"
$ echo {3..14}|sed -nr 'h;:a;/(\w+\s){4}/p;s/\s\w+$//;ta;g;s/\w+\s//;h;/\s/ba;p'
3 4 5 6 7 8 9 10 11 12 13 14
3 4 5 6 7 8 9 10 11 12 13
3 4 5 6 7 8 9 10 11 12
3 4 5 6 7 8 9 10 11
3 4 5 6 7 8 9 10
3 4 5 6 7 8 9
3 4 5 6 7 8
3 4 5 6 7
4 5 6 7 8 9 10 11 12 13 14
4 5 6 7 8 9 10 11 12 13
4 5 6 7 8 9 10 11 12
4 5 6 7 8 9 10 11
4 5 6 7 8 9 10
4 5 6 7 8 9
4 5 6 7 8
5 6 7 8 9 10 11 12 13 14
5 6 7 8 9 10 11 12 13
5 6 7 8 9 10 11 12
5 6 7 8 9 10 11
5 6 7 8 9 10
5 6 7 8 9
6 7 8 9 10 11 12 13 14
6 7 8 9 10 11 12 13
6 7 8 9 10 11 12
6 7 8 9 10 11
6 7 8 9 10
7 8 9 10 11 12 13 14
7 8 9 10 11 12 13
7 8 9 10 11 12
7 8 9 10 11
8 9 10 11 12 13 14
8 9 10 11 12 13
8 9 10 11 12
9 10 11 12 13 14
9 10 11 12 13
10 11 12 13 14
14

回复 13# ly5066113


   

评分

参与人数 1信誉积分 +10 收起 理由
请叫我俊哥哈 + 10 赞一个!

查看全部评分

论坛徽章:
6
羊年新春福章
日期:2015-03-03 17:16:28双子座
日期:2015-03-03 17:16:56巳蛇
日期:2015-03-03 17:17:2415-16赛季CBA联赛之福建
日期:2016-03-11 09:05:00黑曼巴
日期:2016-07-07 16:58:1215-16赛季CBA联赛之吉林
日期:2016-11-14 09:23:07
18 [报告]
发表于 2015-12-28 09:08 |只看该作者
回复 15# substr函数


    这个好,更简练

论坛徽章:
0
19 [报告]
发表于 2016-07-23 20:55 |只看该作者
回复 17# 陈卓文


    学到了,也要谢谢你

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
20 [报告]
发表于 2016-07-25 04:45 |只看该作者
本帖最后由 RE_HASH 于 2016-07-25 04:50 编辑

来晚了,0当10:
$> echo 34567890JQKA|perl -ne 'for $i(5..12) {push @a, /(?=(.{$i}))/g}print "@a"'
34567 45678 56789 67890 7890J 890JQ 90JQK 0JQKA 345678 456789 567890 67890J 7890JQ 890JQK 90JQKA 3456789 4567890 567890J 67890JQ 7890JQK 890JQKA 34567890 4567890J 567890JQ 67890JQK 7890JQKA 34567890J 4567890JQ 567890JQK 67890JQKA 34567890JQ 4567890JQK 567890JQKA 34567890JQK 4567890JQKA 34567890JQKA
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP