helloworlds

not a noun, it's a verb

【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というパッケージを使用してみた!

github.com

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!

Unicode正規化

string型の文字列を分解してただそのまま出力するだけでした。

変数hogeのスライス位置を確かめるのがしんどすぎました。ちゃとスペースとかタブとか考えて記述しないとですね…

なかなか面白かったです。 goの勉強にもなったし! ただ、興味のない言語でやりたいとは思わない...w

以上.