mokeheheのScheme日記

ツッコミ、添削大歓迎です。いろいろ教えてください。

2008-01-03

[] Caesar cipher

TBS | 404 NotFound記念に、anarchy golf - Caesar cipherを解く:

; 1を足す
(define (1+ x) (+ 1 x))

; 文字を回転させる
(define (rotate-char c start-char end-char n)
        (let ((cc (char->integer c))
              (st (char->integer start-char))
              (ed (char->integer end-char)))
          (if (and (<= st cc) (<= cc ed))
              (integer->char (+ (modulo (+ (- cc st)
                                           n)
                                        (1+ (- ed st)))
                                st))
            c)))

; 文字列の文字ごとに関数を適用する
(define (string-map fn str)
        (list->string
         (map fn
              (string->list str))))

; 文字を暗号化
(define (caesar-cipher-char c n)
        (rotate-char (rotate-char c #\A #\Z n)
                     #\a #\z n))

; 文字列を暗号化
(define (caesar-cipher str n)
        (string-map (lambda (c) (caesar-cipher-char c n))
                    str))

(let ((str (read-line (current-input-port) #t)))
  (dotimes (i 26)
    (print (caesar-cipher str i))))
  • エレガントさのかけらもない
  • Schemeで数式を扱うと超わかりにくいな…
トラックバック - http://sicp.g.hatena.ne.jp/mokehehe/20080103