Я пытаюсь получить 3х3 шахматную доску для проблемы Четыре рыцарей. Вот код на языке ракетокне может понять ошибку в DrRacket
#lang racket
(define N 3)
(define nexts ; construct the graph
(let ([ds (for*/list ([x 2] [x* '(+1 -1)] [y* '(+1 -1)])
(cons (* x* (+ 1 x)) (* y* (- 2 x))))])
(for*/vector ([i N] [j N])
(filter values (for/list ([d ds])
(let ([i (+ i (car d))] [j (+ j (cdr d))])
(and (< -1 i N) (< -1 j N) (+ j (* N i)))))))))
(define (tour x y)
(define xy (+ x (* N y)))
(let loop ([seen (list xy)] [ns (vector-ref nexts xy)] [n (sub1 (* N N))])
(if (zero? n) (reverse seen)
(for/or ([next (sort (map (λ(n) (cons n (remq* seen (vector-ref nexts n)))) ns)
< #:key length #:cache-keys? #t)])
(loop (cons (car next) seen) (cdr next) (sub1 n))))))
(define (draw tour)
(define v (make-vector (* N N)))
(for ([n tour] [i (in-naturals 1)]) (vector-set! v n i))
(for ([i N])
(displayln (string-join (for/list ([j (in-range i (* N N) N)])
(~a (vector-ref v j) #:width 2 #:align 'right))
" "))))
(draw (tour (random N) (random N)))
И это дает мне эту ошибку for: expected a sequence for n, got something else: #f
и выделяет этот раздел моего кода:
(define (draw tour)
(define v (make-vector (* N N)))
(for ([n tour] [i (in-naturals 1)]) (vector-set! v n i))
(for ([i N])
(displayln (string-join (for/list ([j (in-range i (* N N) N)])
(~a (vector-ref v j) #:width 2 #:align 'right))
" "))))
И я не уверен, что проблема есть. Это для класса, и я не знаком с языком ракетки. Любая помощь будет оценена по достоинству. Благодаря
Я не уверен, что он должен иметь первый элемент, поскольку он случайным образом генерируется. Если я изменю N на любое число выше 4, оно работает, но не под, и мне нужно, чтобы он работал для 3 – butimnotarapper
@butimnotarapper. Я обновил свой ответ. Вы не найдете решений для любой начальной позиции на досках 3x3 и 4x4, так как их нет. – Sylwester