JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 程式分享區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 [教學]自產生程式
caterpillar

良葛格

版主

發文: 2602
積分: 70
於 2004-06-11 01:50 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
一個可以印出自己原始程式碼的程式。。。。

這東西其實不難,就是麻煩了些,要一個一個對。。。。

附件是我完成的,我還考慮了縮排、可讀性等。。。。。。我咧自找麻煩,不過這樣比較容易比對啦。。。。。不考慮可讀性的話,程式還可以簡潔一些。。。。

有興趣的,自己可以練習看看,完成後上載您的 .class 檔就可以了,可以獲得積分(雖然還是不知道積分可以作什麼。。。Tongue

要作的話,有幾個方向:
(1)想想這句話:列印以下的句子 "列印以下的句子"
(2)想想有個網友說過的密宗編程。。。。Smile

PrintSelf.class (1.76k)


caterpillar edited on 2004-07-16 21:15
reply to postreply to post
良葛格學習筆記
作者 Re:[題目]自產生程式 [Re:caterpillar]
psmonkey

痞子軍團團長



發文: 332
積分: 1
於 2004-06-11 02:18 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
caterpillar wrote:
一個可以印出自己原始程式碼的程式。。。。

不是很懂需求耶...
是自己寫一個程式,然後再把程式碼寫死在程式當中印出來?


reply to postreply to post
http://blog.dontcareabout.us
作者 Re:[題目]自產生程式 [Re:psmonkey]
caterpillar

良葛格

版主

發文: 2602
積分: 70
於 2004-06-11 04:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
執行我給的 class 檔案,會印出一串原始碼,這串原始碼就是 class 檔編譯前的原始碼!!

簡單的說,在沒有 .java 檔之下,要求您印出 .java 檔的內容!


reply to postreply to post
良葛格學習筆記
作者 Re:[題目]自產生程式 [Re:caterpillar]
T55555

Java, Ruby, Haskell

版主

發文: 1023
積分: 24
於 2004-06-11 05:36 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
實在不想打擾大家寫作的興趣...
不過對於不知道 Quine 是啥玩意的朋友可參考 :
http://info.astrian.net/jargon/terms/q/quine.html

(了解之後, 試著自己也寫一個吧, 不要馬上看 "Quine Home Page" link 哦)
提到 Quine, 另一有趣的挑戰是 "寫出最短小的Quine" !

BTW:
(2)想想有個網友說過的密宗編程。。。。Smile
不會是指我吧 ?!

----
http://en.wikipedia.org/wiki/Quine

The Quine Page:
http://www.nyx.net/~gthompso/quine.htm


T55555 edited on 2005-12-15 06:45
reply to postreply to post
作者 Re:[題目]自產生程式 [Re:caterpillar]
psmonkey

痞子軍團團長



發文: 332
積分: 1
於 2004-06-11 06:46 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
caterpillar wrote:
執行我給的 class 檔案,會印出一串原始碼,這串原始碼就是 class 檔編譯前的原始碼!!

簡單的說,在沒有 .java 檔之下,要求您印出 .java 檔的內容!

熊熊發現,我把這個問題想簡單了... Disapproved


reply to postreply to post
http://blog.dontcareabout.us
作者 Re:[題目]自產生程式 [Re:caterpillar]
caterpillar

良葛格

版主

發文: 2602
積分: 70
於 2004-06-11 22:07 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
所謂的密宗編程呢,其實就是Turing Machine的擴充型,。。。。。

其實呢我是在看計算理論時看到說,任何的程式語言都可以簡單的寫出自產生程式,想說自己用Java寫寫看。。。。。

作法其實我已經公布在我的網站上了,要寫真的不難,只是要寫的容易看懂還要考慮排版就有些麻煩就是了,我將文章貼過來好了。。。。

=====================================

自產生程式(quine)就是要寫一個程式,這個程式的目的就是描述它自己,簡單的說,如果您寫了一個.java,編譯它後產生一個.class檔,然後您將.java檔案刪除,您的.class檔不需要.java檔,它也可以印出.java檔的內容。

根據計算理論(Computation Theorem)遞迴原理,任何的程式語言都可以簡單的寫出自產生程式。簡單指的是寫出自產生程式並不需要特別的算法,只要利用Turing Machine的擴充多帶Turing Machine的操作原理就可以寫出。

撇開計算理論這看似高深的學科不談,我們用一般的解釋來說明如何寫自產生程式,程式分做A、B兩個部分,A部分描述B部分的功能,B部分則負責將A的描述印出來,A似乎必須倚賴建構好的B,但B要有A才能列印,這看似矛盾,但其實不然,做法是將B編碼,放置在不同的字元帶上,幾個字元帶並不是重點,看程式語言的語法而定,您可能需要多幾個帶,或少幾個帶,編碼好之後,A部分完成,開始進入B部分,B部分不斷在多個字元帶上來回,並挑選出字元並顯示出來。

直接看實例會容易懂些,以下是以Java程式實作的自產生程式,我們還考慮了程式縮排與可讀性,由於Java的特性,程式看來比較容易理解,網頁排版關係,請直接下載檔案觀看:
http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/PrintSelf.java

下面是以前在網路上找到的C程式,原作者名我忘了保留了,知道的請告訴我一聲,C程式可以用指標,加上一些特性,以及不考慮縮排,這使得程式寫來時更加簡短:
1
2
3
4
5
6
7
#include<iostream.h>
char*a="\"\\char*a=",
*b="#include<iostream.h>",
*c="main(){cout<<b<<endl<<a+2<<*a<<a[1]<<*a<<a[1]<<a[1]<<a+2<<*a<<','<<'*'<<'b'
<<'='<<*a<<b<<*a<<','<<'*'<<'c'<<'='<<*a<<c<<*a<<';'<<c<<endl;}";
main(){cout<<b<<endl<<a+2<<*a<<a[1]<<*a<<a[1]<<a[1]<<a+2<<*a<<','<<'*'<<'b'<<
'='<<*a<<b<<*a<<','<<'*'<<'c'<<'='<<*a<<c<<*a<<';'<<c<<endl;}


caterpillar edited on 2005-12-14 20:32
reply to postreply to post
良葛格學習筆記
作者 Re:[題目]自產生程式 [Re:caterpillar]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-06-11 22:29 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
caterpillar wrote:
下面是以前在網路上找到的C程式,原作者名我忘了保留了,知道的請告訴我一聲,C程式可以用指標,加上一些特性,以及不考慮縮排,這使得程式寫來時更加簡短:
1
2
3
4
5
6
7
#include<iostream.h>
char*a="\"\\char*a=",
*b="#include<iostream.h>",
*c="main(){cout<<b<<endl<<a+2<<*a<<a[1]<<*a<<a[1]<<a[1]<<a+2<<*a<<','<<'*'<<'b'
<<'='<<*a<<b<<*a<<','<<'*'<<'c'<<'='<<*a<<c<<*a<<';'<<c<<endl;}";
main(){cout<<b<<endl<<a+2<<*a<<a[1]<<*a<<a[1]<<a[1]<<a+2<<*a<<','<<'*'<<'b'<<
'='<<*a<<b<<*a<<','<<'*'<<'c'<<'='<<*a<<c<<*a<<';'<<c<<endl;}



這個 C++ 程式寫的太矯情了,下面的應該是最有名的 C Quine(T55555 給的連結裡有):
1
main(){char *p="main(){char *p=%c%s%c;printf(p,34,p,34);}";printf(p,34,p,34);}


Duncan edited on 2004-06-11 22:32
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:[題目]自產生程式 [Re:caterpillar]
aladdin

老婆不准我用兒子照片



發文: 175
積分: 3
於 2004-06-22 11:14 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
以前用Apple的Basic也寫過這個問題,我記得只用了三個行號,概念也相同,但是還不是最簡單的。

Turing machine都出來了!......但老實說,Turing Machine是數學家拿來嚇人的東西。如果有人有興趣,可以試著用Turing Machine證出數學上有名的「不完備定理」。至於那有什麼用?......不知道,當年就是心生懷疑才沒有繼續念Functional Programming。

有人可能會問,這個問題有沒有什麼用處?我曾經看過一個用處就是拿來編碼javascript。由於Javascript沒有任何保護的措施(ie的encode例外),所以,有人就用同樣的概念編碼javascript的原始碼:

首先把原始的javascript給編碼成為一個字串(description),和解碼的javascript(printing)一起塞進html裡。解碼的Javascript其實就是透過document.write把這個字串重新寫回原始的樣子。如果一次覺得不夠,可以來回兩次、三次(但如果高手要看,還是擋不住的)。這種東西很多,google一下javascript encode,可以得到一堆。

最後,說一下ie的encode:那實在是microsoft才會做的事情,microsoft寫程式是為了賺錢,我們寫程式是為了讓別人驚豔。所以,我們注定貧窮,microsoft注定越來越可惡。


reply to postreply to post
作者 Re:[題目]自產生程式 [Re:caterpillar]
機車轟





發文: 1
積分: 0
於 2004-06-23 04:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不太懂...是反編譯嗎

reply to postreply to post
作者 Re:[題目]自產生程式 [Re:caterpillar]
listen





發文: 19
積分: 1
於 2004-06-24 07:24 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
有看沒有懂haha~~~各位大大實在是,博學多聞

reply to postreply to post
» JWorld@TW »  Java 程式分享區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8