【Go】GoでQuine(クワイン)を考えてみる
とある記事でクワイン(quine)というものを知った。
けっこうプログラミングの世界では、遊び?というかやっている内にハマっちゃうらしくて少し触れてみました。
Quineとは?
Quineとは、 自身のソースコードと同じ文字列を出力させるものです。
言語はなんでもいいらしい。 最初は、「なんか頑張ればできそうだな」とか 思ってたんですが、以外とムズいことに気づきました。
Pythonと迷ったのですが、先人の記事が少しあったので 今回はgolangでやってみようかと思います。
手始めに考えたこと
とりあえずfmt.Print
してみる!ww
まあ、それはすぐムズいことに気づく。それにわしはgolangのすごい慣れ親しんではまだいない。
以下糞コード。
package main import "fmt" func main() { fmt.Print(" package main import "fmt" func main() { } ") }
でもなんかfmt.Printのとこでreplaceかなんかやればできんじゃね?みたいに思った。
とりあえず色々出力
package main import ( "fmt" _ "github.com/davecgh/go-spew/spew" ) func main() { hoge := "This is the test" fmt.Print(hoge) } > This is the test
うんうん、そりゃそのままだなwww
ちょっとvar_dump的なのないのか?と思ったので、 spewというパッケージを使用してみた!
spew.Dump(hoge)
でgo run main.goを実行。
> (string) (len=16) "This is the test"
ほう。 ならこれはどうだ。
hoge := "This is the test. That is the test. " > newline in character literal > syntax error: unexpected is at end of statement > newline in character literal
おっと、エラー出た。 そうかダブルクォーテーションじゃ駄目だな〜。 ああ、ヒアドキュメントか。
ダブルクォーテーションを ` で囲む。
> (string) (len=61) "This is the test.\n That is the test.\n
正規表現を使って...
きた。\n があるじゃん。
package main import ( "fmt" _ "github.com/davecgh/go-spew/spew" ) func main() { hoge := `package main import ( "fmt" _ "github.com/davecgh/go-spew/spew" ) func main() { hoge := fmt.Print(hoge[:175] + "\u0060" + hoge + "\u0060" + hoge[:175]) } ` fmt.Print(hoge[:175] + "\u0060" + hoge + "\u0060" + hoge[175:]) }
正規表現についてはググればOK!
string型の文字列を分解してただそのまま出力するだけでした。
変数hogeのスライス位置を確かめるのがしんどすぎました。ちゃとスペースとかタブとか考えて記述しないとですね…
なかなか面白かったです。 goの勉強にもなったし! ただ、興味のない言語でやりたいとは思わない...w
以上.