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

2007-12-09

[] join lines

http://golf.shinh.org/p.rb?join+lines

(port-for-each
 display
 (lambda () (read-line (current-input-port) #t)))

echoのprintdisplayに変えただけ。これでいいのかは知らんが。

VictoryVictory2011/08/18 20:13That's really serwhd! Good to see the logic set out so well.

gctjndcodpmgctjndcodpm2011/08/19 02:30dsb2U3 <a href="http://qcaokfqvtszf.com/">qcaokfqvtszf</a>

bthmatrgfpbthmatrgfp2011/08/20 02:30A7U8Fy , [url=http://xiafyuuwmmhh.com/]xiafyuuwmmhh[/url], [link=http://gtcwmzzzbgjx.com/]gtcwmzzzbgjx[/link], http://jnrkikbugcej.com/

pxxaksibbcpxxaksibbc2011/08/25 18:27VD6BnR <a href="http://txlncdbmsidb.com/">txlncdbmsidb</a>

トラックバック - http://sicp.g.hatena.ne.jp/mokehehe/20071209

2007-11-24

[] LEDcounter

anarchy golf - LED counterを解く

(use srfi-1)

; LEDデータ
(define LEDData
  '((" _ "
     "| |"
     "|_|")
    ("   "
     "  |"
     "  |")
    (" _ "
     " _|"
     "|_ ")
    (" _ "
     " _|"
     " _|")
    ("   "
     "|_|"
     "  |")
    (" _ "
     "|_ "
     " _|")
    (" _ "
     "|_ "
     "|_|")
    (" _ "
     "  |"
     "  |")
    (" _ "
     "|_|"
     "|_|")
    (" _ "
     "|_|"
     "  |")
    (" _ "
     "|_|"
     "| |")
    ("   "
     "|_ "
     "|_|")
    (" _ "
     "|  "
     "|_ ")
    ("   "
     " _|"
     "|_|")
    (" _ "
     "|_ "
     "|_ ")
    (" _ "
     "|_ "
     "|  ")))

; 数値を2桁の16進数で出力
(define (print-LED2 i)
        (for-each print
                  (ref LEDData (quotient i 16))
                  (ref LEDData (remainder i 16))))

; エントリ
(dotimes (x 256)
  (print-LED2 x))

[] echo

anarchy golf - echoを解く。以下、ダメ回答

(port-for-each
 print
 (lambda () (read-line (current-input-port) #t)))
  • echoごときにこの長さ…!
  • 一見うまく動いてる風、だけど
  • print で出力するのはいいのか?
  • read-line
    • 改行が削除されてしまうので、ファイルの最後とかで改行があったかなかったか分からない。
    • SJISの日本語を使ってるファイルとか食わせるとエラーが出るので、3番目の引数に #t を渡す
  • ググッても案外回答がみあたらない
  • port-for-each

[] httpから取得

anarchy golf - example_comを解いてみる。HTTPからの取得はHTTPでGET Schemeでどう書く?orgをモロ参照してできた。

(use rfc.uri)
(use rfc.http)

; uri-parse が分解してしまったpathとqueryとfragmentをつなげる
(define (uri-path path query fragment)
        (string-append path
                       (if query
                           (string-append "?" query)
                         "")
                       (if fragment
                           (string-append "#" fragment)
                         "")))

; uri を http-get して本文を返す
(define (get-http-text uri)
        (receive (scheme auth host port path query fragment)
                 (uri-parse uri)
                 (values-ref (http-get host
                                       (uri-path path query fragment))
                             2)))

(display
 (get-http-text
  (read-line (current-input-port))))
  • uri-parseを呼び出すと多値で返ってくるので、receiveで受け取って処理。メンドイ。
  • 「?hoge=fuga」とかのクエリ文字の「?」と、アンカー「#name」の「#」が削られてしまうので再構築。削らなければ単に結合するだけですむのに、なんか微妙にメンドイ。

[] Summation

anarchy golf - Summationを解く。

(use srfi-1)

(define (sum ls)
        (reduce + 0 ls))

(define (atob a b)
        (if (> a b)
            ()
          (iota (+ b (- a) 1) a)))

(port-for-each (lambda (n)
                 (if (= n 0)
                     (exit)
                   (print (sum (atob 0 n)))))
               read)
  • シンボルの負の数って -a と直接書けなくて、(- a) としないといけないんでしょうか。
    • 数値なら直接 -1 と書ける。シンボルだと「-a」の一続きがシンボルとみなされてしまう。
    • Lispは - に与える引数が1個のときは引数の符号反転した値、2個以上のときは1個目の引数から残りの引数を引いた値になるんですね。
  • reduce
    • reduceはfoldの特別版、初期値が使われるのはリストが空のときだけ
    • Haskellのなごりで sum → reduce と思ってしまったけど、わざわざ reduce を使わなくても (apply + ls) で十分だった…

[] FizzBuzz

Haskellの時に思ったけど、言語を覚えるにはgolfが一番!

anarchy golf - FizzBuzzを解く

(use srfi-1)

(define (fizzbuzz x)
        (cond ((zero? (modulo x 15)) "FizzBuzz")
              ((zero? (modulo x 3)) "Fizz")
              ((zero? (modulo x 5)) "Buzz")
              (else x)))

(for-each print
          (map fizzbuzz (iota 100 1)))
トラックバック - http://sicp.g.hatena.ne.jp/mokehehe/20071124