Ich habe versucht, dieses Puzzle https://puzzling.stackexchange.com/questions/40094/who-committed-the-crime mit Racket zu lösen.Lösen eines Puzzlespiels im Racket
Ein Verbrechen wurde von einer Person durchgeführt, es gibt 5 Verdächtige. Jeder Verdächtige wird unter Polygraphen gefragt, wem sie das begangene Verbrechen glaubten.
Ihre Antworten sind wie folgt:
Terry : It wasn't Carl, It was Steve
Steve : It wasn't Matt, It wasn't Carl
Matt : It was Carl, It wasn't Terry
Ben : It was Matt, It was Steve
Carl : It was Ben, It wasn't Terry
Der Polygraph zeigte, dass jeder Verdächtige sagte eine Lüge und eine Wahrheit. Wer hat das Verbrechen begangen?
Folgende ist mein Code:
(define (oneof a b)
(or (and a (not b)) (and b (not a))))
(for ((i 5))
(define templist (list #f #f #f #f #f)) ; make a temporary list of all false;
(set! templist (list-set templist i #t)) ; one by one keep one as true in this loop;
(define t (list-ref templist 0)) ; allocate each person according to above list (one kept true one by one)
(define s (list-ref templist 1))
(define m (list-ref templist 2))
(define b (list-ref templist 3))
(define c (list-ref templist 4))
(when ; test if all statements fit with above assignment:
(and
(oneof (not c) s) ; Terry's statement
(oneof (not m) (not c)) ; Steve's statement
(oneof c (not t)) ; Matt's statement
(oneof m s) ; Ben's statement
(oneof b (not t))) ; Carl's statement
(println (list "t" "s" "m" "b" "c")) ; print allocation if all statement fit in;
(println templist)))
Ausgabe zeigt Matt das Verbrechen begangen:
'("t" "s" "m" "b" "c")
'(#f #f #t #f #f)
Es funktioniert, aber der Code ist zwingend notwendig und nicht sehr funktionell (insbesondere t definieren, definieren s , ... Teil). Wie kann es verbessert werden? Danke für deine Kommentare/Antworten.
Code Überprüfung SO wäre eine bessere Passform. – Sylwester