亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2923 | 回復(fù): 7
打印 上一主題 下一主題

dc.sed 解析 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-04-15 20:12 |只看該作者 |倒序?yàn)g覽
本帖最后由 hbmhalley 于 2012-04-15 20:54 編輯

http://72891.cn/forum.php?mod=viewthread&tid=1844319&page=1

  1. 上個月看見這么個東西 瞬間閃瞎狗眼
  2. 閑著蛋疼 翻出來發(fā)現(xiàn)還是值得一看的
  3. 于是挖個坑 能填完最好。本人語文渣,歡迎拍磚,眾人填坑填的快。

  4. 由于這玩意實(shí)在是個怪物,所以打算先分別說 dc 與 sed ,然后再看 dc.sed 的流程。先說 dc。

  5. dc :“任意精度逆波蘭式計(jì)算器”
  6. 逆波蘭式就是后綴表達(dá)式,例如
  7.   prefix notation     -->  reverse polish notation
  8.   3 + 4               -->      3 4 +
  9.   (3 + 4) * 5         -->      3 4 + 5 *
  10.   (3 + 4) * (5 + 6)   -->      3 4 + 5 6 + *
  11. 沒錯,省括號。

  12. dc 實(shí)時維護(hù)一個棧,初始為空。執(zhí)行 '3 4 + 5 6 + *' 的流程就是:
  13. 3 入棧;4 入棧;彈出 4 3 將 7 入棧;5 入棧;6 入棧;彈出 6 5 將 11 入棧;彈出 11 7 將 77 入棧;
  14. 最后棧里只剩一個 77 。你可以用 p(打印棧頂)或 f(從頂?shù)降状蛴≌麄棧)命令查看結(jié)果。試試:

  15.         dc -e '3 4+5 6+*p'

  16. 除了 + - * / 外,還有 % 用來求余數(shù),~ 同時求商與余數(shù),^ 求冪,| 求模意義下的冪,v 求平方根。
  17. 其中 + - * / % ^ 彈棧兩個壓棧一個,~ 彈棧兩個壓棧兩個,v 彈棧一個壓棧一個,| 彈棧三個壓棧一個。

  18. 除了“主棧”外,dc 還提供寄存器,每個寄存器也是一個棧。有兩組控制寄存器的命令(其中 r 表示寄存器的名字。所有寄存器的名字都是單個字符,因此你最多可以用 256 個寄存器)

  19.         Lr   彈出 r 寄存器棧頂,將彈出的元素壓入主棧;     Sr    彈出主棧棧頂,將彈出的元素壓入 r 寄存器
  20.         lr   將 r 寄存器棧頂元素壓入主棧                 sr    彈出主棧棧頂,用彈出的元素替換 r 寄存器棧頂(若 r 棧為空則作用同 Sr)
  21.         (簡而言之,l s 兩個命令將“寄存棧”當(dāng)作“寄存器”在用,而 L S 將其用作棧)

  22. 舉個例子,'3salala*p' 作用是打印 3 的平方,其中 'salala' 借助寄存器 a 復(fù)制棧頂。(其實(shí)有個 d 命令作用就是復(fù)制棧頂。)

  23. dc 還支持“字符串”,所謂字符串其實(shí)是可以被執(zhí)行的代碼,類似 lambda 表達(dá)式。用 [..] 表示字符串。
  24. x 命令的作用是彈出棧頂元素,若不是字符串則放回,否則將其執(zhí)行。例如:
  25. '[3 4+5 6+*p]x' 等價于 '3 4+5 6+*p'
  26. (當(dāng)然,一個不被執(zhí)行的字符串也不是一點(diǎn)用沒有。)

  27. 配合寄存器,dc 便有了流程控制的雛形,例如,可以這樣實(shí)現(xiàn) yes 命令:

  28.         dc -e '[y][plax]dsax'

  29. 稍微畫個圖解釋一下:

  30. [y][plax]dsax                   [y]
  31. ^^^
  32. [y][plax]dsax                   [y] [plax]
  33.    ^^^^^^
  34. [y][plax]dsax                   [y] [plax] [plax]
  35.          ^
  36. [y][plax]dsax                   [y] [plax]           ([plax] /*I'm register a*/)
  37.           ^^
  38. [y][plax]dsax                   [y] [plax]           ([plax] /*I'm register a*/)
  39.             ^                       └-> 這是即將被彈出并執(zhí)行的代碼
  40. [y][plax]dsax                   [y]                  ([plax] /*I'm register a*/)      //Output: y
  41.             └-plax
  42.               ^
  43. [y][plax]dsax                   [y] [plax]           ([plax] /*I'm register a*/)      //Output: y
  44.             └-plax
  45.                ^^
  46. [y][plax]dsax                   [y] [plax]           ([plax] /*I'm register a*/)      //Output: y
  47.             └-plax                  └-> 這是即將被彈出并執(zhí)行的代碼
  48.                  ^
  49. [y][plax]dsax                   [y]                  ([plax] /*I'm register a*/)      //Output: yy
  50.             └-plax
  51.                  └-plax
  52.                    ^
  53. ...
  54. [y][plax]dsax                                                                         //Output: yyy..y
  55.             └-plax
  56.                  └-plax
  57.                    ....
  58.                       └-plax


  59. 還有六個用來執(zhí)行代碼的命令:<  >  =  !<  !>  !=
  60. >r 作用是彈出主棧兩個元素,若先出棧的大于后出棧的,則執(zhí)行寄存器 r 棧頂?shù)拇a
  61. 其余的都差不多,> 是大于,!< 是不小于,等等。
  62. q 命令退出當(dāng)前及其父親的代碼執(zhí)行過程
  63. Q 命令彈出棧頂元素 k,并退出 k 層代碼的執(zhí)行過程


  64. 語法很簡單吧。但是相當(dāng)完整。例如

  65.     求 20 的階乘:
  66.         dc -e '20[d1-d1<r*]dsrxp'

  67.     求 [1,999] 內(nèi)所有 3 或 5 的倍數(shù)之和
  68.         dc -e '999 0sw [dlw+sw]sA [dd3%r5%*0=A1-d0!=B]dsBx lwp'

  69.     求所有不超過 4,000,000 的斐波那契數(shù)之和
  70.         dc -e '0 1 1sw 0sx [+lwrdswd4000000!<B]sA [d2%0=ClAx]sB [dlx+sx]sC lAx lxpd'

  71.     求 600851475143 的最大質(zhì)因子
  72.         dc -e '600851475143 [lp/lCx]sA [lp1+splCxd1!=B]sB [dlp%0=A]sC 1sp lBx lpp'

  73. 以上代碼中除了第一個改編自 dc.sed 的 Examples ,其余都是 Project Euler 上的題,代碼和第一個相比丑了不少,因?yàn)閷?shí)在擺脫不了傳統(tǒng) C 代碼的 if while 的思維習(xí)慣,只能提前硬生生的構(gòu)造語句塊。這顯然不是長久之計(jì)。但我相信 dc 必有其精妙之用,期待高手來發(fā)掘。

  74. 如果不能擺脫 C 代碼的習(xí)慣,也有方法構(gòu)造對應(yīng)的 dc 代碼。例如

  75. if (#) {@} 可以寫成:

  76.         [@]sA # 0!=A

  77. do {@} while (#) 可以寫成:

  78.         [@ #0!=A] d sA x

  79. while (#) {@} 可以寫成:

  80.         [@ # 0!=A] sA # 0!=A
  81.   或者  [@ lAx] sB  [# 0!=B] dsAx
  82.   或者  [q]sq [# 0==q @ lAx] dsAx

  83. 然而,這只能解決一層塊結(jié)構(gòu),嵌套的塊會讓代碼混亂不堪。其實(shí)上面的后三個例子就是這么強(qiáng)行拼湊出來的。
  84. 實(shí)際上,與“嵌套塊”結(jié)構(gòu)對應(yīng),我們維護(hù)一個“代碼!,保證當(dāng)前代碼及其子代碼不會干擾父輩代碼即可:

  85. if (#) {@@} else {&&} -->

  86.         [@@]SR # dSS 0!=R [&&]SR LS 0==R LRLRsrsr

  87. do {@} while (#) -->

  88.         [@ # 0!=R] dSRx LRsr

  89. while (#) {@} -->

  90.         [# 0==q @ lRx] dSRx LRsr

  91. 其中,R 就是“代碼!。S 用來保存 if 語句 # 的計(jì)算結(jié)果,以供 else 使用。S 也是棧(因?yàn)?if 也會嵌套)。q 專門用來保存 [q](相當(dāng)于 break)。r 是垃圾箱(要是 dc 支持刪除棧頂就不用多此一舉了)。

  92. 現(xiàn)在,@ 里也可以有 [] 了。還有函數(shù)什么的就不說了。這是 dc 強(qiáng)項(xiàng)。
  93. 說這一坨目的不是說明 dc 就該寫成這樣,而是證明 dc 足夠強(qiáng)大,dc 語法再疵也不比 C 差,以提供信心挖掘 dc 潛質(zhì)。

  94. 貼一個構(gòu)造出來的 dc 代碼。同樣是 Project Euler 的題:求出可寫成兩個三位數(shù)乘積的最大回文數(shù)(答案是 906609:906609 == 913 * 993)

  95. ################
  96. 100si
  97. 100sj
  98. 0sm

  99. [
  100.         lilj*dsk
  101.         0sb
  102.         [10~dSxSy lb1+sb d0<R]dSRxLRsr
  103.         sr lbSb
  104.         [Lx lb1-dsb 0<R]dSRxLRsr
  105.         Lbsr
  106.         1st
  107.         [
  108.                 [0st]SR Ly!=RLRsr lb1-dsb 0<R
  109.         ]dSRxLRsr
  110.         [
  111.                 [lksm]SR lmlk>RLRsr
  112.         ]SR lt1=RLRsr
  113.         lj1+
  114.         [sr10 li1+ [3Q]SR d1000=RLRsr si]SR d1000=RLRsr sj
  115.         lRx
  116. ] dSRxLRsr

  117. lmp
  118. ################




  119. 目前為止,dc 語法說的差不多了,還有些有關(guān)精度進(jìn)制、把棧當(dāng)數(shù)組用等等命令,完整用法見手冊。

  120. 原本想 dc.sed 重點(diǎn)在 sed 而非 dc,但由于 dc.sed 里有好幾處將一個高級 dc 命令換成一串簡單 dc 命令的處理方式(難道你認(rèn)為真的能用正則表達(dá)式算平方根么- -|),因此不得不先說 dc。但話說回來,dc.sed 根本沒有用到其它工具,如果不把它當(dāng)成 dc 語言的解釋器,它只是借用了 dc 的語法來 **存儲任務(wù)序列** ,間接實(shí)現(xiàn)了平方根等幾乎不可能完成的功能。之前不是有個 lookup table 技術(shù)么,那這就叫 “dc sequence” 技術(shù)吧 ^ ^

  121. 待續(xù)
復(fù)制代碼

評分

參與人數(shù) 3可用積分 +19 信譽(yù)積分 +2 收起 理由
zooyo + 5 非常不錯
cjaizss + 10 + 2 神馬都是浮云
waker + 4 感謝分享

查看全部評分

論壇徽章:
3
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亞洲杯之阿曼
日期:2015-04-07 20:00:59
2 [報(bào)告]
發(fā)表于 2012-04-15 21:45 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽

論壇徽章:
2
射手座
日期:2014-10-10 15:59:4715-16賽季CBA聯(lián)賽之上海
日期:2016-03-03 10:27:14
3 [報(bào)告]
發(fā)表于 2012-04-16 07:10 |只看該作者
學(xué)習(xí)~

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報(bào)曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
4 [報(bào)告]
發(fā)表于 2012-04-16 08:15 |只看該作者
雖然看不懂樓主在說什么,不過這次看來是非常真的很NB的樣子

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-04-16 10:45 |只看該作者
雖然看不懂樓主在說什么,不過這次看來是非常真的很NB的樣子

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-04-16 10:51 |只看該作者
強(qiáng)烈建議CU管理員把評分功能加上,現(xiàn)在看到這樣好的帖子想加分的權(quán)利都沒了。!

評分

參與人數(shù) 1可用積分 +2 收起 理由
rdcwayx + 2 可以評分啊。

查看全部評分

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
7 [報(bào)告]
發(fā)表于 2012-04-16 11:08 |只看該作者
中午的時候拜讀拜讀

論壇徽章:
20
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-11 06:20:0015-16賽季CBA聯(lián)賽之山東
日期:2016-05-28 18:18:5615-16賽季CBA聯(lián)賽之新疆
日期:2017-04-12 22:55:4715-16賽季CBA聯(lián)賽之青島
日期:2017-06-26 18:30:0315-16賽季CBA聯(lián)賽之四川
日期:2017-09-04 12:27:0315-16賽季CBA聯(lián)賽之福建
日期:2018-02-09 14:28:3315-16賽季CBA聯(lián)賽之同曦
日期:2018-04-17 12:43:3415-16賽季CBA聯(lián)賽之浙江
日期:2018-07-14 13:27:4015-16賽季CBA聯(lián)賽之吉林
日期:2018-09-13 15:48:2915-16賽季CBA聯(lián)賽之新疆
日期:2016-05-07 05:05:3215-16賽季CBA聯(lián)賽之八一
日期:2016-03-14 12:32:06程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-12 06:20:00
8 [報(bào)告]
發(fā)表于 2015-09-18 16:57 |只看該作者
竟然如此高大上啊,贊一個,寫這些東西的人腦子都怎么想的
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP