challenge あみだくじ

次のような書式で与えられた「あみだくじ」があります。
(あみだくじはコード中に埋め込んでも、標準入力や
外部ファイルから読み込んでも、書きやすい方法でかまいません)

A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |

このあみだくじをたどって
A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |
B D C A E
のように結果を表示させるプログラムを作ってください。

Posted feedbacks - Scheme

9:user> (print-result amidakuji)
A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |
B D C A E
=> #<undef>
10:user> 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(define amidakuji
  (string-append
   "A B C D E\n"
   "| | |-| |\n"
   "|-| | |-|\n"
   "| |-| |-|\n"
   "|-| |-| |\n"
   "|-| | | |\n"
   ))

(define (first-state line)
  (map string->symbol (string-split line #\space)))

(define (update-state line prev-state)
  (let1 amida (cdr (string-split line #\|))
    (fold-right (lambda (s a k)
                  (if (string=? a "-")
                    (cons* (car k) s (cdr k))
                    (cons s k)))
                '() prev-state amida)))

(define (solve amida)
  (call-with-input-string amida
    (lambda (in)
      (port-fold
       (cut update-state <> <>)
       (first-state (read-line in))
       (cut read-line in)))))

(define (print-result amida)
  (display amida)
  (print (string-join (map symbol->string (solve amida)) " ")))

Index

Feed

Other

Link

Pathtraq

loading...