新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

マヨイドーロを解いてみた

マイドーロでもマヨロードでもない。マヨイドーロ。scheme で解いてみた。

(define (myload0) `((Z C B)))
(define (myload1) `((Y A 'B) (Y A B 'C B)))

(define (myload n)
  (cond ((= n 0) (myload0))
        ((= n 1) (append (myload1) (myload0)))
        (else (myload-n n))))

(define (myload-n n)
  (letrec ((myload-n-local
             (lambda (n rv-top rv-all)
               (if (= n 0) rv-all
                 (let ((next-result (myload-next rv-top)))
                   (myload-n-local
                     (- n 1)
                     next-result
                     (append next-result rv-all)))))))
    (myload-n-local (- n 1)
                    (myload1)
                    (append (myload1) (myload0)))))

(define (next-goal elm0)
  (if (eq? elm0 'Y) 'Z 'Y))

(define (search-next-route goal route)
  (if (eq? goal 'Z)
    (if (eq? route 'A)
      `(Z C B 'A)
      `(Z C 'B))
    (if (eq? route 'C)
      `(Y A B 'C)
      `(Y A 'B))))

(define (myload-next lst)
  (let ((goal (next-goal (caar lst))))
    (letrec ((myload-one
               (lambda (elm0)
                 (let* ((route0 (cadr elm0))
                        (route0-remain (cddr elm0))
                        (route1 (caddr elm0))
                        (route1-remain (cdddr elm0))
                        (route1-exist? (symbol? route1))
                        (next-route0 (search-next-route goal route0))
                        (next-route1 (if route1-exist?
                                       (search-next-route goal route1) '()))
                        (rv0 (append next-route0 route0-remain))
                        (rv1 (append next-route1 route1-remain))
                        (rv (list rv0)))
                   (if route1-exist? (cons rv1 rv) rv))))

             (myload-next0
               (lambda (lst0 rv)
                 (if (null? lst0) rv
                   (let ((top-elm (car lst0))
                         (remain-lst (cdr lst0)))
                     (myload-next0 remain-lst
                                   (append (myload-one top-elm) rv)))))))

      (myload-next0 lst '()))))

(define (print-one r-load)
  (let ((load-x (reverse r-load)))
    (display "$X")
    (letrec ((print-one0
               (lambda (r-load0)
                 (let ((elm0 (car r-load0))
                       (remain0 (cdr r-load0)))
                   (display "\\rightarrow ")
                   (if (symbol? elm0)
                     (display elm0)
                     (begin
                       (display "\\dot{")
                       (display (cadr elm0))
                       (display "}")))
                   (if (not (null? remain0))
                     (print-one0 remain0))))))
      (print-one0 load-x)
      (print "$"))))

(define (print-all all-load)
  (if (null? all-load)
    #t
    (begin
      (print-one (car all-load))
      (print)
      (print-all (cdr all-load)))))

(print-all (myload 8))

出力は TeX。あっているかどうか不明。2H くらいかかったかな、、、

結果を張り付ける。
f:id:ryos36:20151219153318p:plain

え? Y に至る経路の数をだすだけなの?Y も Z も全部書き出しちゃった。参考までに書くと、ドットは反転した場所。数学的な意味はないので念のため。

あとバッククォートじゃないほうがいい。無駄なアロケート(というのかどうかしらんが)してしまうので。