【问题标题】:Generating a quiz in Emacs Lisp?在 Emacs Lisp 中生成测验?
【发布时间】:2010-02-28 09:16:37
【问题描述】:

请原谅“重复”的问题。我也希望在 Emacs Lisp 中解决这个问题,如果我只是为这两个主题标记它,我可能只会得到一个答案。 Emacs 的答案应该足够不同,以至于值得拥有它。

我想自学西班牙语,我有几个单词列表,比如 数据如下所示。如何从以下数据中生成测验 看起来像这样?

阿马里洛? [ ] 蓝色 [ ] 黄色 [ ] 灰色 [ ] 粉色 蔚蓝? [ ] 红色 [ ] 蓝色 [ ] 绿色 [ ] 橙色 . . . 佛得角? [ ] 紫色 [ ] 金色 [ ] 绿色 [ ] 黑色

这个想法是随机包含 3 个随机选择的答案 不正确的答案。理想情况下,错误答案不会太 重复。

阿马里洛|黄色 蔚蓝|蓝色 白|白 多拉多|金色 灰色|灰色 栗色|棕色 纳兰贾|橙色 黑人|黑人 黄金|黄金 紫癜|紫色 罗霍|红色 罗莎|粉色 翠绿|绿色

【问题讨论】:

  • 我投了赞成票。使用 elisp 和 emacs-lisp 标记内容需要多长时间?
  • 这个stackoverflow.com/questions/2264267/… 是他提到的另一个问题。如果你保持你的测验是文本的,那么 Emacs Lisp 对于这样的东西会不那么冗长,因为它有处理输出和操作字符串的原语。

标签: elisp


【解决方案1】:

好的,所以我假设您在 Emacs 缓冲区中打开了一个文件中的输入。

(defun insert-quiz (a-buffer) (交互式“bBuffer 名称:”) (let* ((question-pairs (split-string (with-current-buffer a-buffer (buffer-string))))) (测验答案 (mapcar (lambda (x) (cadr (split-string x "|"))) question-pairs)) (插入 (应用#'concat (地图车 (λ (x) (let ((q-pair (split-string x "|"))) (make-question (car q-pair) (answers-list quiz-answers (cadr q-pair))))) 问题对)))))

insert-quiz 是一个交互式函数,它接受一个缓冲区名称,并使用该缓冲区中的内容为您生成一个测验,然后在该点插入该测验作为副作用。它调用了一些较小的函数,我将在下面解释。

(defun make-question(问题答案) (应用#'格式 "%-16s[ ] %-16s[ ] %-16s[ ] %-16s[ ] %s \n" (附加 (列表(连接问题“?”)) 答案)))

make-question 接受一个问题和一个答案列表,并将它们格式化为测验的一行。

(defun answers-list (quiz-answers right-answer) (替换(n-wrong-answers quiz-answers 正确答案) (列出正确答案) :start1 (随机 3)))

answers-list 列出测验中所有可能的答案和正确答案,并使用 n-wrong-answers 创建一个包含四个答案的列表,其中一个是正确答案。

(defun n-wrong-answers (answer-list right-answer & optional answers) (如果(= 4(列表长度答案)) 答案 (n个错误答案 答案列表 正确答案 (add-to-list 'answers (random-wrong-answer answer-list right-answer)))))

n-wrong-answers 获取测验中所有可能答案的列表和正确答案,然后使用 random-wrong-answer 返回四个唯一不正确答案的列表。

(defun random-wrong-answer (answer-list right-answer) (let ((gen-answer (nth (random (list-length answer-list)) answer-list))) (if (and gen-answer (not (string= gen-answer right-answer))) 基因答案 (随机错误答案答案列表正确答案))))

最后,在最低级别,random-wrong-answer 获取测验中所有可能答案的列表,并返回一个错误答案。

将上述函数加载到 Emacs 中后,使用 M-x insert-quiz 并键入您输入的缓冲区的名称(您将获得制表符完成)。更改 insert-quiz 函数以使其采用文件名而不是打开的缓冲区名并不难。

您在上面列出的输入将产生:

阿马里洛? [ ] 黄色 [ ] 橙色 [ ] 灰色 [ ] 红色 蔚蓝? [ ] 金色 [ ] 紫色 [ ] 蓝色 [ ] 橙色 布兰科? [ ] 粉色 [ ] 红色 [ ] 白色 [ ] 黑色 多拉多? [ ] 黄色 [ ] 金色 [ ] 红色 [ ] 橙色 格里斯? [ ] 红色 [ ] 粉红色 [ ] 灰色 [ ] 绿色 马龙? [ ] 棕色 [ ] 黄色 [ ] 白色 [ ] 金色 纳兰贾? [ ] 橙色 [ ] 金色 [ ] 黑色 [ ] 金色 黑人? [ ] 粉色 [ ] 黑色 [ ] 蓝色 [ ] 白色 奥罗? [ ] 红色 [ ] 金色 [ ] 紫色 [ ] 棕色 紫癜? [ ] 紫色 [ ] 橙色 [ ] 灰色 [ ] 黑色 罗霍? [ ] 灰色 [ ] 红色 [ ] 黑色 [ ] 粉红色 罗莎? [ ] 红色 [ ] 绿色 [ ] 粉红色 [ ] 黄色 佛得角? [ ] 绿色 [ ] 紫色 [ ] 红色 [ ] 棕色

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多