2010-02-15 4 views
1

나는 스페인어와 Lisp을 가르쳐주고 싶다. 아래에 표시된 데이터가 과 같이 여러 단어 목록이 있습니다. 어떻게 이런 식으로 데이터에서 퀴즈를 만들 수 있습니까?Common Lisp에서 퀴즈를 생성 하시겠습니까?

 
amarillo? [ ] blue [ ] yellow [ ] gray [ ] pink 
azul?  [ ] red  [ ] blue [ ] green [ ] orange 
. 
. 
. 
verde?  [ ] purple [ ] gold [ ] green [ ] black 

아이디어는 3 개 무작위로 선택 잘못된 답변 대답을 포함 무작위로하는 것입니다. 이상적으로는, 부정확 한 답은 반복적으로 이 아닙니다.

 
amarillo|yellow 
azul|blue 
blanco|white 
dorado|golden 
gris|gray 
marrón|brown 
naranja|orange 
negro|black 
oro|gold 
púrpura|purple 
rojo|red 
rosa|pink 
verde|green 
+1

어려운 부분은 무엇인가? –

답변

7

유니 코드를 지원하는 LispWorks 사용.

색상 번역입니다.

(defparameter *word-data* 
"amarillo|yellow 
azul|blue 
blanco|white 
dorado|golden 
gris|gray 
marrón|brown 
naranja|orange 
negro|black 
oro|gold 
púrpura|purple 
rojo|red 
rosa|pink 
verde|green") 

몇 최상위 변수 : 번역 테이블과 두 개의 색 이름

(defvar *translation* (make-hash-table :test #'equalp)) 
(defvar *all-english-colors* nil) 
(defvar *all-spanish-colors* nil) 

번역 데이터를 파싱 테이블을 채우는 목록 및 목록 :

(defun parse-word-data (&optional (data *word-data*)) 
    (with-input-from-string (stream data) 
    (loop for line = (read-line stream nil nil) 
      while line 
      do (let ((pos (position #\| line))) 
       (setf (gethash (subseq line 0 pos) *translation*) 
        (subseq line (1+ pos))) 
       (pushnew (subseq line 0 pos) *all-spanish-colors* 
         :test #'equalp) 
       (pushnew (subseq line (1+ pos)) *all-english-colors* 
         :test #'equalp))))) 

것은 찾기 스페인어 단어 번역 :

(defun translate-s->e (word) 
    (gethash word *translation*)) 
(defun test() 
    (loop for sc in *all-spanish-colors* 
     for ec = (translate-s->e sc) 
     do (apply #'format 
        t 
        "~%~a~1,[email protected][ ] ~a~1,[email protected][ ] ~a~1,[email protected][ ] ~a~1,[email protected][ ] ~a" 
        sc 
        (compute-choices ec (random-english-colors ec)))) 
    (terpri)) 
: -

(defun compute-choices (answer answers &optional (n 3)) 
    (let ((pos (random (1+ n)))) 
    (append (subseq answers 0 pos) 
      (list answer) 
      (subseq answers pos)))) 

테스트

(defun random-english-colors (answer &optional (n 3)) 
    (random-elements (remove answer *all-english-colors* :test #'equal) n)) 

계산 선택 :

(defun random-elements (list &optional (n 1)) 
    (let ((elements nil) 
     (all-elements list)) 
    (loop repeat n 
      for r = (random (length all-elements)) 
      for e = (elt all-elements r) 
      do (push e elements) 
      do (setf all-elements (remove e all-elements :test #'equal))) 
    elements)) 

세 임의 영어 색상을 선택 :

은 목록에서 n은 임의의 요소를 선택,403,210 계산 데이터 :

(parse-word-data) 

테스트 :

CL-USER 212 > (test) 

verde   [ ] green  [ ] yellow  [ ] orange  [ ] brown 
rosa   [ ] yellow  [ ] orange  [ ] pink  [ ] golden 
rojo   [ ] gold  [ ] golden  [ ] brown  [ ] red 
púrpura   [ ] gold  [ ] red   [ ] orange  [ ] purple 
oro    [ ] orange  [ ] gold  [ ] red  [ ] white 
negro   [ ] gold  [ ] black  [ ] golden  [ ] purple 
naranja   [ ] red   [ ] gray  [ ] orange  [ ] gold 
marrón   [ ] orange  [ ] pink  [ ] brown  [ ] red 
gris   [ ] brown  [ ] green  [ ] gray  [ ] orange 
dorado   [ ] golden  [ ] pink  [ ] blue  [ ] gray 
blanco   [ ] blue  [ ] red   [ ] white  [ ] gold 
azul   [ ] brown  [ ] blue  [ ] green  [ ] purple 
amarillo  [ ] red   [ ] yellow  [ ] brown  [ ] black 
+0

이 솔루션은 훌륭합니다. 감사! –

관련 문제