あのねノート

せんせいあのね、パソコンで字が書けるようになったよ

"すごいプログラム"を書きました

しばらく見てない間にはてなブログのUIが若干変わっててびっくりしてます。使いやすくなってそうな気はする…?

さて、実験からの現実逃避に"すごいプログラム"を書いたのでそっと載せておきます。Lispのリスト構造と再帰を使ってひたすらすごいすごい言ってくれるプログラムです。すごい。語彙力がない。
こんなの作っててむなしくならないのと自分で思いましたが、正直作ってる間は脳内麻薬みたいなのが出ててテンションがおかしかったです。

lispにもいろいろありますが、SchemeやRacketで動くものを書きました。
まず名詞を引数として「すごい○○」と言ってくれる関数(sugoi x)を定義します。

;;1回すごい
 (define (sugoi x) (cons 'sugoi x))

これを再帰させて、n回すごいと言ってくれる関数(msugoi n x)を定義します。ちなみにmsugoiは「めっちゃすごい」の略です。

;;n回すごい
 (define (msugoi n x)
	(if (= n 0)
		x
		(sugoi (msugoi (- n 1) x)))
	)

引数の名詞の最初にn回sugoiをつけてくれます。
(sugoi 'lisp)を実行すると

> (sugoi 'lisp)
'(sugoi . lisp)

となります。
3倍ぐらいすごいlisp、sugolispを作ってみましょう。

> (define sugolisp (msugoi 3 'lisp))
> sugolisp
'(sugoi sugoi sugoi . lisp)

すごいと思っていたものがすごくなくなることもあります。すごくなくなる関数、(sugokunai x)も作りました。

;;すごくなくなる
(define (sugokunai x)
  (if (pair? x)
       (if (equal? (car x) 'sugoi)
           (sugokunai (cdr x))
           x
        )
       x))

受け取ったxのcarがsugoiだったら1つsugoiを外すのを繰り返して、sugoiがなくなったら返してくれます。
今回はsugolispをすごくない状態に戻します。

> (sugokunai sugolisp)
'lisp

それはさておき「すごいすごいすごい○○」ってなんだか不自然ですよね?本来は「すごくすごくすごい○○」となってほしいものです。
作りました。

;;n回すごくすごい
(define (new-msugoi n x)
  (cond ((= n 0) x)
        ((>= n 1) (if (= n 1) (sugoi x) (cons 'sugoku (new-msugoi (- n 1) x))))
        ))

nが1になるまでsugokuをつけ続けて、nが1になったらsugoiをつけて返してくれます。

> (define new-sugolisp (new-msugoi 3 'lisp))
> new-sugolisp
'(sugoku sugoku sugoi . lisp)

こんな感じ。
sugokunaiもこれに対応しなければなりません。

;;すごくにも対応してすごくなくなる
(define (new-sugokunai x)
  (if (pair? x)
       (if (or (equal? (car x) 'sugoi) (equal? (car x) 'sugoku))
           (new-sugokunai (cdr x))
           x
        )
       x))

これはcarを外す条件にcarがsugokuになっているかどうかも付け足せばいいだけです。

> (new-sugokunai new-sugolisp)
'lisp

ここまでは名詞にすごいをつけてきましたが、なんなら連用形も使いこなして名詞以外にも使いたい。ということでnew2-msugoiも作りました。これは最初のmsugoiと同様にして、sugoiをsugokuに変えるだけでいいので簡単です。

;;名詞じゃなくてもn回すごくできる
(define (new2-msugoi n x)
  (if (= n 0)
      x
      (cons 'sugoku (new2-msugoi (- n 1) x))))

すごくおなかがすいたときは

> (new2-msugoi 3 'onakasuita)
'(sugoku sugoku sugoku . onakasuita)

すごくすごくすごくおなかすいた。
実験ですさんだ心を癒すためにほめてもらえるものも書きました。上のと同じ要領なので一度に載せてしまいます。

;;語彙力なくほめてくれる
(define (homete) 'sugoi)

;;語彙力なくすごくほめてくれる
(define (mhomete n) (if (= n 0)
		(homete)
		(cons 'sugoku (mhomete (- n 1)))))

実際に使うとこうなります。すごくほめるときの回数が何か変わっちゃうのはご愛嬌。

> (homete)
'sugoi
> (mhomete 3)
'(sugoku sugoku sugoku . sugoi)

sugoiにn回sugokuをつけることになってるから1回多く言われた気持ちになりますね。お得。
なんでこんなことしたんだろう…あまり細かいことは気にしないことにします。再帰の理解も深まったんだ。たぶん。

Land of Lispを図書館で借りてきて読み始めたのでそのうちそのことについても書けたらいいなと思います(白目)。