; MzScheme version of Reverse game
; See http://e-scribe.com/news/193
; My first Scheme program; I'm sure this will be embarassing later

(begin
  (define (shuffle seq)
                    (if (null? seq) '()
                        (let ((pick (+ 1 (random (length seq)))))
                          (cons (list-ref seq (- pick 1)) (shuffle (drop-nth seq pick)))
                        )))

  (define (drop-nth seq n)
    (append (left-slice seq (- n 1)) (list-tail seq n)))

  (define (sorted? seq)
                    (if (or (null? seq) (null? (cdr seq))) #t
                        (and (< (car seq) (cadr seq))
                             (sorted? (cdr seq)))))

  (define (left-slice seq n)
                       (reverse (list-tail (reverse seq) (- (length seq) n))))

  (define (flip seq n)
                 (append (reverse (left-slice seq n)) (list-tail seq n)))

  (define (play numbers count)
                 (display numbers)
                 (newline)
                 (display "How many to flip? ")
                 (let ((howmany (read)))
                   (set! numbers (flip numbers howmany)))
                 (if (sorted? numbers)
                   (display (string-append "Done! That took you " (number->string count) " steps."))
                   (play numbers (+ 1 count))))

  (play (shuffle '(1 2 3 4 5 6 7 8 9)) 1))