annotate lisp/play/mpuz.el @ 110410:f2e111723c3a

Merge changes made in Gnus trunk. Reimplement nnimap, and do tweaks to the rest of the code to support that. * gnus-int.el (gnus-finish-retrieve-group-infos) (gnus-retrieve-group-data-early): New functions. * gnus-range.el (gnus-range-nconcat): New function. * gnus-start.el (gnus-get-unread-articles): Support early retrieval of data. (gnus-read-active-for-groups): Support finishing the early retrieval of data. * gnus-sum.el (gnus-summary-move-article): Pass the move-to group name if the move is internal, so that nnimap can do fast internal moves. * gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for nnimap usage. * nnimap.el: Rewritten. * nnmail.el (nnmail-inhibit-default-split-group): New internal variable to allow the mail splitting to not return a default group. This is useful for nnimap, which will leave unmatched mail in the inbox. * utf7.el (utf7-encode): Autoload. Implement shell connection. * nnimap.el (nnimap-open-shell-stream): New function. (nnimap-open-connection): Use it. Get the number of lines by using BODYSTRUCTURE. (nnimap-transform-headers): Get the number of lines in each message. (nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the number of lines. Not all servers return UIDNEXT. Work past this problem. Remove junk from end of file. Fix typo in "bogus" section. Make capabilties be case-insensitive. Require cl when compiling. Don't bug out if the LIST command doesn't have any parameters. 2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change) * nnimap.el (nnimap-get-groups): Don't bug out if the LIST command doesn't have any parameters. (mm-text-html-renderer): Document gnus-article-html. 2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix) * mm-decode.el (mm-text-html-renderer): Document gnus-article-html. * dgnushack.el: Define netrc-credentials. If the user doesn't have a /etc/services, supply some sensible port defaults. Have `unseen-or-unread' select an unread unseen article first. (nntp-open-server): Return whether the open was successful or not. Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ). Save result so that it doesn't say "failed" all the time. Add ~/.authinfo to the default, since that's probably most useful for users. Don't use the "finish" method when we're reading from the agent. Add some more nnimap-relevant agent stuff to nnagent.el. * nnimap.el (nnimap-with-process-buffer): Removed. Revert one line that was changed by mistake in the last checkin. (nnimap-open-connection): Don't error out when we can't make a connection nnimap-related changes to avoid bugging out if we can't contact a server. * gnus-start.el (gnus-get-unread-articles): Don't try to scan groups from methods that are denied. * nnimap.el (nnimap-possibly-change-group): Return nil if we can't log in. (nnimap-finish-retrieve-group-infos): Make sure we're not waiting for nothing. * gnus-sum.el (gnus-select-newsgroup): Indent.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 18 Sep 2010 10:02:19 +0000
parents 1d1d5d9bd884
children cc035ccb9275 376148b31b5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
659
505130d1ddf8 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 232
diff changeset
1 ;;; mpuz.el --- multiplication puzzle for GNU Emacs
505130d1ddf8 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 232
diff changeset
2
101004
6f10422080eb Replace last-command-char with last-command-event.
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
3 ;; Copyright (C) 1990, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 105829
diff changeset
4 ;; 2009, 2010 Free Software Foundation, Inc.
838
c8798ebd7d95 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 791
diff changeset
5
19963
2f60572de4d1 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 18383
diff changeset
6 ;; Author: Philippe Schnoebelen <phs@lsv.ens-cachan.fr>
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
7 ;; Overhauled: Daniel Pfeiffer <occitan@esperanto.org>
791
203c23c9f22c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 659
diff changeset
8 ;; Keywords: games
203c23c9f22c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 659
diff changeset
9
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
94675
949bd6ad1ba4 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
6736
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
94675
949bd6ad1ba4 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
14 ;; the Free Software Foundation, either version 3 of the License, or
949bd6ad1ba4 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
15 ;; (at your option) any later version.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
6736
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
20 ;; GNU General Public License for more details.
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
21
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
22 ;; You should have received a copy of the GNU General Public License
94675
949bd6ad1ba4 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
2308
f287613dfc28 Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1217
diff changeset
25 ;;; Commentary:
f287613dfc28 Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1217
diff changeset
26
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
27 ;; `M-x mpuz' generates a random multiplication puzzle. This is a
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
28 ;; multiplication example in which each digit has been consistently replaced
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
29 ;; with some letter. Your job is to reconstruct the original digits. Type
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
30 ;; `?' while the mode is active for detailed help.
2308
f287613dfc28 Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1217
diff changeset
31
791
203c23c9f22c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 659
diff changeset
32 ;;; Code:
203c23c9f22c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 659
diff changeset
33
21363
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
34 (defgroup mpuz nil
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
35 "Multiplication puzzle."
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
36 :prefix "mpuz-"
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
37 :group 'games)
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
38
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 (random t) ; randomize
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
41 (defcustom mpuz-silent 'error
104848
1382a0cd8022 Remove leading * from defcustom and defface docs.
Glenn Morris <rgm@gnu.org>
parents: 104390
diff changeset
42 "Set this to nil if you want dings on inputs.
50861
0d21b78dd68e (mpuz-silent): Don't quote nil and t in docstrings.
Juanma Barranquero <lekktu@gmail.com>
parents: 45113
diff changeset
43 t means never ding, and `error' means only ding on wrong input."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
44 :type '(choice (const :tag "No" nil)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
45 (const :tag "Yes" t)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
46 (const :tag "If correct" error))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
47 :group 'mpuz)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
48
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
49 (defcustom mpuz-solve-when-trivial t
104848
1382a0cd8022 Remove leading * from defcustom and defface docs.
Glenn Morris <rgm@gnu.org>
parents: 104390
diff changeset
50 "Solve any row that can be trivially calculated from what you've found."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
51 :type 'boolean
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
52 :group 'mpuz)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
53
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
54 (defcustom mpuz-allow-double-multiplicator nil
104848
1382a0cd8022 Remove leading * from defcustom and defface docs.
Glenn Morris <rgm@gnu.org>
parents: 104390
diff changeset
55 "Allow 2nd factors like 33 or 77."
21363
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
56 :type 'boolean
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
57 :group 'mpuz)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58
63238
5592f504d53f Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-398
Miles Bader <miles@gnu.org>
parents: 62770
diff changeset
59 (defface mpuz-unsolved
43825
5f6458644514 Use defface instead of facemenu-get-face.
Eli Zaretskii <eliz@gnu.org>
parents: 43770
diff changeset
60 '((((class color)) (:foreground "red1" :bold t))
5f6458644514 Use defface instead of facemenu-get-face.
Eli Zaretskii <eliz@gnu.org>
parents: 43770
diff changeset
61 (t (:bold t)))
104848
1382a0cd8022 Remove leading * from defcustom and defface docs.
Glenn Morris <rgm@gnu.org>
parents: 104390
diff changeset
62 "Face to use for letters to be solved."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
63 :group 'mpuz)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
64
63238
5592f504d53f Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-398
Miles Bader <miles@gnu.org>
parents: 62770
diff changeset
65 (defface mpuz-solved
43825
5f6458644514 Use defface instead of facemenu-get-face.
Eli Zaretskii <eliz@gnu.org>
parents: 43770
diff changeset
66 '((((class color)) (:foreground "green1" :bold t))
5f6458644514 Use defface instead of facemenu-get-face.
Eli Zaretskii <eliz@gnu.org>
parents: 43770
diff changeset
67 (t (:bold t)))
104848
1382a0cd8022 Remove leading * from defcustom and defface docs.
Glenn Morris <rgm@gnu.org>
parents: 104390
diff changeset
68 "Face to use for solved digits."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
69 :group 'mpuz)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
70
63238
5592f504d53f Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-398
Miles Bader <miles@gnu.org>
parents: 62770
diff changeset
71 (defface mpuz-trivial
43825
5f6458644514 Use defface instead of facemenu-get-face.
Eli Zaretskii <eliz@gnu.org>
parents: 43770
diff changeset
72 '((((class color)) (:foreground "blue" :bold t))
5f6458644514 Use defface instead of facemenu-get-face.
Eli Zaretskii <eliz@gnu.org>
parents: 43770
diff changeset
73 (t (:bold t)))
104848
1382a0cd8022 Remove leading * from defcustom and defface docs.
Glenn Morris <rgm@gnu.org>
parents: 104390
diff changeset
74 "Face to use for trivial digits solved for you."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
75 :group 'mpuz)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
76
63238
5592f504d53f Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-398
Miles Bader <miles@gnu.org>
parents: 62770
diff changeset
77 (defface mpuz-text
43825
5f6458644514 Use defface instead of facemenu-get-face.
Eli Zaretskii <eliz@gnu.org>
parents: 43770
diff changeset
78 '((t (:inherit variable-pitch)))
104848
1382a0cd8022 Remove leading * from defcustom and defface docs.
Glenn Morris <rgm@gnu.org>
parents: 104390
diff changeset
79 "Face to use for text on right."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
80 :group 'mpuz)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83 ;; Mpuz mode and keymaps
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84 ;;----------------------
21363
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
85 (defcustom mpuz-mode-hook nil
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
86 "Hook to run upon entry to mpuz."
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
87 :type 'hook
f1fc193b6958 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 19963
diff changeset
88 :group 'mpuz)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 (defvar mpuz-mode-map nil
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 "Local keymap to use in Mult Puzzle.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 (if mpuz-mode-map nil
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
94 (setq mpuz-mode-map (make-sparse-keymap))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
95 (define-key mpuz-mode-map "a" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
96 (define-key mpuz-mode-map "b" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
97 (define-key mpuz-mode-map "c" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
98 (define-key mpuz-mode-map "d" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
99 (define-key mpuz-mode-map "e" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
100 (define-key mpuz-mode-map "f" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
101 (define-key mpuz-mode-map "g" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
102 (define-key mpuz-mode-map "h" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
103 (define-key mpuz-mode-map "i" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
104 (define-key mpuz-mode-map "j" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
105 (define-key mpuz-mode-map "A" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
106 (define-key mpuz-mode-map "B" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
107 (define-key mpuz-mode-map "C" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
108 (define-key mpuz-mode-map "D" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
109 (define-key mpuz-mode-map "E" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
110 (define-key mpuz-mode-map "F" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
111 (define-key mpuz-mode-map "G" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
112 (define-key mpuz-mode-map "H" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
113 (define-key mpuz-mode-map "I" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
114 (define-key mpuz-mode-map "J" 'mpuz-try-letter)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
115 (define-key mpuz-mode-map "\C-g" 'mpuz-offer-abort)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
116 (define-key mpuz-mode-map "?" 'describe-mode))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 (defun mpuz-mode ()
1217
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
119 "Multiplication puzzle mode.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120
232
c0bd9c7f9c42 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 142
diff changeset
121 You have to guess which letters stand for which digits in the
1217
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
122 multiplication displayed inside the `*Mult Puzzle*' buffer.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123
1217
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
124 You may enter a guess for a letter's value by typing first the letter,
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
125 then the digit. Thus, to guess that A=3, type `A 3'.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126
1217
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
127 To leave the game to do other editing work, just switch buffers.
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
128 Then you may resume the game with M-x mpuz.
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
129 You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 (interactive)
62770
93e71f3dcd14 * play/5x5.el (5x5-mode):
Lute Kamstra <lute@gnu.org>
parents: 62249
diff changeset
131 (kill-all-local-variables)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132 (setq major-mode 'mpuz-mode
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
133 mode-name "Mult Puzzle"
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
134 tab-width 30)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 (use-local-map mpuz-mode-map)
62770
93e71f3dcd14 * play/5x5.el (5x5-mode):
Lute Kamstra <lute@gnu.org>
parents: 62249
diff changeset
136 (run-mode-hooks 'mpuz-mode-hook))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 ;; Some variables for statistics
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 ;;------------------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 (defvar mpuz-nb-errors 0
232
c0bd9c7f9c42 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 142
diff changeset
142 "Number of errors made in current game.")
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 (defvar mpuz-nb-completed-games 0
232
c0bd9c7f9c42 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 142
diff changeset
145 "Number of games completed.")
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 (defvar mpuz-nb-cumulated-errors 0
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 "Number of errors made in previous games.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 ;; Some variables for game tracking
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 ;;---------------------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 (defvar mpuz-in-progress nil
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 "True if a game is currently in progress.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
156 (defvar mpuz-found-digits (make-bool-vector 10 nil)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 "A vector recording which digits have been decrypted.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
159 (defvar mpuz-trivial-digits (make-bool-vector 10 nil)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
160 "A vector recording which digits have been solved for you.")
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
161
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 (defmacro mpuz-digit-solved-p (digit)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
163 `(or (aref mpuz-found-digits ,digit)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
164 (aref mpuz-trivial-digits ,digit)))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 ;; A puzzle uses a permutation of [0..9] into itself.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 ;; We use both the permutation and its inverse.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 ;;---------------------------------------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 (defvar mpuz-digit-to-letter (make-vector 10 0)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 "A permutation from [0..9] to [0..9].")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 (defvar mpuz-letter-to-digit (make-vector 10 0)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 "The inverse of mpuz-digit-to-letter.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 (defmacro mpuz-to-digit (letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 (list 'aref 'mpuz-letter-to-digit letter))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 (defmacro mpuz-to-letter (digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 (list 'aref 'mpuz-digit-to-letter digit))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 (defun mpuz-build-random-perm ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 "Initialize puzzle coding with a random permutation."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 (let ((letters (list 0 1 2 3 4 5 6 7 8 9)) ; new cons cells, because of delq
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 (index 10)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 elem)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 (while letters
4400
a549089c0d15 (mpuz-random): Remove.
Paul Eggert <eggert@twinsun.com>
parents: 4345
diff changeset
188 (setq elem (nth (random index) letters)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 letters (delq elem letters)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 index (1- index))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 (aset mpuz-digit-to-letter index elem)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 (aset mpuz-letter-to-digit elem index))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 2451
diff changeset
195 ;; A puzzle also uses a board displaying a multiplication.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 ;; Every digit appears in the board, crypted or not.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 ;;------------------------------------------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 (defvar mpuz-board (make-vector 10 nil)
4345
49e68bc65e26 * mpuz.el (mpuz-board): Doc fix.
Jim Blandy <jimb@redhat.com>
parents: 3591
diff changeset
199 "The board associates to any digit the list of squares where it appears.")
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
201 (defun mpuz-put-number-on-board (number row &rest l)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
202 "Put (last digit of) NUMBER on ROW and COLUMNS of the puzzle board."
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
203 (let (digit)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
204 (while l
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
205 (setq digit (% number 10)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
206 number (/ number 10))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
207 (aset mpuz-board digit `((,row . ,(car l)) ,@(aref mpuz-board digit)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
208 (setq l (cdr l)))))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
210 (defun mpuz-check-all-solved (&optional row col)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 "Check whether all digits have been solved. Return t if yes."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
212 (catch 'solved
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
213 (let (A B1 B2 C D E squares)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
214 (and mpuz-solve-when-trivial
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
215 (not row)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
216 (while
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
217 (cond ((or (and (setq B1 (or B1 (mpuz-check-all-solved 4 7))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
218 B2 (or B2 (mpuz-check-all-solved 4 9))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
219 E (or E (mpuz-check-all-solved 10))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
220 A (or A (mpuz-check-all-solved 2)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
221 B1 B2)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
222 (and E (or A (and B1 B2))))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
223 (mpuz-solve)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
224 (mpuz-paint-board)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
225 (throw 'solved t))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
226 ((and (setq D (or D (mpuz-check-all-solved 8))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
227 C (or C (mpuz-check-all-solved 6)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
228 D (not E))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
229 (mpuz-solve 10))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
230 ((and E (not (eq C D)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
231 (mpuz-solve (if D 6 8)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
232 ((and A (not (eq B2 C)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
233 (mpuz-solve (if C 4 6) (if C 9)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
234 ((and A (not (eq B1 D)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
235 (mpuz-solve (if D 4 8) (if D 7)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
236 ((and (not A) (or (and B2 C) (and B1 D)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
237 (mpuz-solve 2)))))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
238 (mpuz-paint-board)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
239 (mapc (lambda (digit)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
240 (and (not (mpuz-digit-solved-p digit)) ; unsolved
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
241 (setq squares (aref mpuz-board digit))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
242 (if row
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
243 (if col
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
244 (member (cons row col) squares)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
245 (assq row squares))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
246 squares) ; and appearing in the puzzle!
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
247 (throw 'solved nil)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
248 [0 1 2 3 4 5 6 7 8 9]))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 t))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 ;; To build a puzzle, we take two random numbers and multiply them.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 ;; We also take a random permutation for encryption.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 ;; The random numbers are only use to see which digit appears in which square
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 ;; of the board. Everything is stored in individual squares.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 ;;---------------------------------------------------------------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 (defun mpuz-random-puzzle ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 "Draw random values to be multiplied in a puzzle."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 (mpuz-build-random-perm)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 (fillarray mpuz-board nil) ; erase the board
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
261 ;; A,B,C,D & E, are the five rows of our multiplication.
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
262 ;; Choose random values, discarding cases with leading zeros in C or D.
75669
6986faa706ca (mpuz-random-puzzle): Fix potential lockup when
David Kastrup <dak@gnu.org>
parents: 75347
diff changeset
263 (let* ((A (if mpuz-allow-double-multiplicator (+ 112 (random 888))
6986faa706ca (mpuz-random-puzzle): Fix potential lockup when
David Kastrup <dak@gnu.org>
parents: 75347
diff changeset
264 (+ 125 (random 875))))
6986faa706ca (mpuz-random-puzzle): Fix potential lockup when
David Kastrup <dak@gnu.org>
parents: 75347
diff changeset
265 (min (1+ (/ 999 A)))
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
266 (B1 (+ min (random (- 10 min))))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
267 B2 C D E)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
268 (while (if (= B1 (setq B2 (+ min (random (- 10 min)))))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
269 (not mpuz-allow-double-multiplicator)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
270 (setq C (* A B2)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
271 D (* A B1)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
272 E (+ C (* D 10)))
14040
187735b53d52 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 6736
diff changeset
273 ;; Individual digits are now put on their respective squares.
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
274 ;; [NB: A square is a pair (row . column) of the screen.]
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
275 (mpuz-put-number-on-board A 2 9 7 5)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
276 (mpuz-put-number-on-board (+ (* B1 10) B2) 4 9 7)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
277 (mpuz-put-number-on-board C 6 9 7 5 3)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
278 (mpuz-put-number-on-board D 8 7 5 3 1)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
279 (mpuz-put-number-on-board E 10 9 7 5 3 1)))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 ;; Display
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 ;;--------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 (defconst mpuz-framework
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 "
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 . . .
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
286 Number of errors (this game): 0
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 x . .
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 -------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 . . . .
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
290 Number of completed games: 0
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 . . . .
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
292 --------- Average number of errors: 0.00
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 . . . . ."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 "The general picture of the puzzle screen, as a string.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 (defun mpuz-create-buffer ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 "Create (or recreate) the puzzle buffer. Return it."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
298 (let ((buf (get-buffer-create "*Mult Puzzle*"))
63238
5592f504d53f Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-398
Miles Bader <miles@gnu.org>
parents: 62770
diff changeset
299 (face '(face mpuz-text))
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
300 buffer-read-only)
105829
328150f0cf76 * url-util.el (url-insert-entities-in-string):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 104848
diff changeset
301 (with-current-buffer buf
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
302 (erase-buffer)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
303 (insert mpuz-framework)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
304 (set-text-properties 13 42 face)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
305 (set-text-properties 79 105 face)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
306 (set-text-properties 128 153 face)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
307 (mpuz-paint-board)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
308 (mpuz-paint-errors)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
309 (mpuz-paint-statistics))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
310 buf))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
311
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
312 (defun mpuz-paint-number (n &optional eol words)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
313 (end-of-line eol)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
314 (let (buffer-read-only)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
315 (delete-region (point)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
316 (progn (backward-word (or words 1)) (point)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
317 (insert n)))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 (defun mpuz-paint-errors ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 "Paint error count on the puzzle screen."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 (mpuz-switch-to-window)
104390
c6ae8d43800c Use forward-line, not goto-line.
Glenn Morris <rgm@gnu.org>
parents: 101004
diff changeset
322 (goto-char (point-min))
c6ae8d43800c Use forward-line, not goto-line.
Glenn Morris <rgm@gnu.org>
parents: 101004
diff changeset
323 (forward-line 2)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
324 (mpuz-paint-number (prin1-to-string mpuz-nb-errors)))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 (defun mpuz-paint-statistics ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 "Paint statistics about previous games on the puzzle screen."
104390
c6ae8d43800c Use forward-line, not goto-line.
Glenn Morris <rgm@gnu.org>
parents: 101004
diff changeset
328 (goto-char (point-min))
c6ae8d43800c Use forward-line, not goto-line.
Glenn Morris <rgm@gnu.org>
parents: 101004
diff changeset
329 (forward-line 6)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
330 (mpuz-paint-number (prin1-to-string mpuz-nb-completed-games))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
331 (mpuz-paint-number
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
332 (format "%.2f"
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
333 (if (zerop mpuz-nb-completed-games)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
334 0
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
335 (/ (+ 0.0 mpuz-nb-cumulated-errors)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
336 mpuz-nb-completed-games)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
337 3 2))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 (defun mpuz-paint-board ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 "Paint board situation on the puzzle screen."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 (mpuz-switch-to-window)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
342 (mapc 'mpuz-paint-digit [0 1 2 3 4 5 6 7 8 9])
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 (goto-char (point-min)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 (defun mpuz-paint-digit (digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 "Paint all occurrences of DIGIT on the puzzle board."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 (let ((char (if (mpuz-digit-solved-p digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 (+ digit ?0)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
349 (+ (mpuz-to-letter digit) ?A)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
350 (face `(face
63238
5592f504d53f Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-398
Miles Bader <miles@gnu.org>
parents: 62770
diff changeset
351 ,(cond ((aref mpuz-trivial-digits digit) 'mpuz-trivial)
5592f504d53f Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-398
Miles Bader <miles@gnu.org>
parents: 62770
diff changeset
352 ((aref mpuz-found-digits digit) 'mpuz-solved)
5592f504d53f Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-398
Miles Bader <miles@gnu.org>
parents: 62770
diff changeset
353 ('mpuz-unsolved))))
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
354 buffer-read-only)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
355 (mapc (lambda (square)
104390
c6ae8d43800c Use forward-line, not goto-line.
Glenn Morris <rgm@gnu.org>
parents: 101004
diff changeset
356 (goto-char (point-min))
c6ae8d43800c Use forward-line, not goto-line.
Glenn Morris <rgm@gnu.org>
parents: 101004
diff changeset
357 (forward-line (1- (car square))) ; line before column!
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
358 (move-to-column (cdr square))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
359 (insert char)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
360 (set-text-properties (1- (point)) (point) face)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
361 (delete-char 1))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
362 (aref mpuz-board digit))))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 (defun mpuz-get-buffer ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 "Get the puzzle buffer if it exists."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 (get-buffer "*Mult Puzzle*"))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 (defun mpuz-switch-to-window ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 "Find or create the Mult-Puzzle buffer, and display it."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
370 (let ((buf (mpuz-get-buffer)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
371 (or buf (setq buf (mpuz-create-buffer)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
372 (switch-to-buffer buf)
45113
f929d5e6ced1 (mpuz-switch-to-window): Set buffer-read-only directly.
Richard M. Stallman <rms@gnu.org>
parents: 43825
diff changeset
373 (setq buffer-read-only t)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 (mpuz-mode)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 ;; Game control
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 ;;-------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 (defun mpuz-start-new-game ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 "Start a new puzzle."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 (message "Here we go...")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 (setq mpuz-nb-errors 0
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 mpuz-in-progress t)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 (fillarray mpuz-found-digits nil) ; initialize mpuz-found-digits
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
385 (fillarray mpuz-trivial-digits nil)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 (mpuz-random-puzzle)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 (mpuz-switch-to-window)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 (mpuz-paint-board)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 (mpuz-paint-errors)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 (mpuz-ask-for-try))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391
1217
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
392 ;;;###autoload
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
393 (defun mpuz ()
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 "Multiplication puzzle with GNU Emacs."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 ;; Main entry point
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 (interactive)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 (mpuz-switch-to-window)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 (if mpuz-in-progress
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 (mpuz-offer-abort)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
400 (mpuz-start-new-game)))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 (defun mpuz-offer-abort ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403 "Ask if user wants to abort current puzzle."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 (interactive)
65689
96187e7edd1b 2005-09-25 Romain Francoise <romain@orebokech.com>
Romain Francoise <romain@orebokech.com>
parents: 64993
diff changeset
405 (if (y-or-n-p "Abort game? ")
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
406 (let ((buf (mpuz-get-buffer)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
407 (message "Mult Puzzle aborted.")
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
408 (setq mpuz-in-progress nil
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
409 mpuz-nb-errors 0)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
410 (fillarray mpuz-board nil)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
411 (if buf (kill-buffer buf)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
412 (mpuz-ask-for-try)))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 (defun mpuz-ask-for-try ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 "Ask for user proposal in puzzle."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
416 (message "Your try?"))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
417
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
418 (defun mpuz-ding (error)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
419 "Dings, unless global variable `mpuz-silent' forbids it."
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
420 (cond ((eq mpuz-silent t))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
421 ((not mpuz-silent) (ding t))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
422 (error (ding t))))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 (defun mpuz-try-letter ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 "Propose a digit for a letter in puzzle."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 (interactive)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 (if mpuz-in-progress
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 (let (letter-char digit digit-char message)
101004
6f10422080eb Replace last-command-char with last-command-event.
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
429 (setq letter-char (upcase last-command-event)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 digit (mpuz-to-digit (- letter-char ?A)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 (cond ((mpuz-digit-solved-p digit)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
432 (message "%c already solved." letter-char)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
433 (mpuz-ding t))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 ((null (aref mpuz-board digit))
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
435 (message "%c does not appear." letter-char)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
436 (mpuz-ding t))
2451
a149f1464f40 (mpuz-try-letter): Use read-char to read digit.
Richard M. Stallman <rms@gnu.org>
parents: 2308
diff changeset
437 ((progn (message "%c = " letter-char)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 ;; <char> has been entered.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 ;; Print "<char> =" and
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 ;; read <num> or = <num>
2451
a149f1464f40 (mpuz-try-letter): Use read-char to read digit.
Richard M. Stallman <rms@gnu.org>
parents: 2308
diff changeset
441 (setq digit-char (read-char))
a149f1464f40 (mpuz-try-letter): Use read-char to read digit.
Richard M. Stallman <rms@gnu.org>
parents: 2308
diff changeset
442 (if (eq digit-char ?=)
a149f1464f40 (mpuz-try-letter): Use read-char to read digit.
Richard M. Stallman <rms@gnu.org>
parents: 2308
diff changeset
443 (setq digit-char (read-char)))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 (or (> digit-char ?9) (< digit-char ?0))) ; bad input
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
445 (message "%c = %c" letter-char digit-char)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
446 (mpuz-ding t))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 (t
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 (mpuz-try-proposal letter-char digit-char))))
65689
96187e7edd1b 2005-09-25 Romain Francoise <romain@orebokech.com>
Romain Francoise <romain@orebokech.com>
parents: 64993
diff changeset
449 (if (y-or-n-p "Start a new game? ")
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
450 (mpuz-start-new-game)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
451 (message "OK. I won't."))))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 (defun mpuz-try-proposal (letter-char digit-char)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 "Propose LETTER-CHAR as code for DIGIT-CHAR."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 (let* ((letter (- letter-char ?A))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 (digit (- digit-char ?0))
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
457 (correct-digit (mpuz-to-digit letter))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
458 (game mpuz-nb-completed-games))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 (cond ((mpuz-digit-solved-p correct-digit)
24859
0291983fe62f (mpuz-try-proposal): Fix message call.
Karl Heuer <kwzh@gnu.org>
parents: 21363
diff changeset
460 (message "%c has already been found." (+ correct-digit ?0)))
0291983fe62f (mpuz-try-proposal): Fix message call.
Karl Heuer <kwzh@gnu.org>
parents: 21363
diff changeset
461 ((mpuz-digit-solved-p digit)
0291983fe62f (mpuz-try-proposal): Fix message call.
Karl Heuer <kwzh@gnu.org>
parents: 21363
diff changeset
462 (message "%c has already been placed." digit-char))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 ((= digit correct-digit)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
464 (message "%c = %c correct!" letter-char digit-char)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
465 (mpuz-ding nil)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
466 (aset mpuz-found-digits digit t) ; Mark digit as solved
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
467 (and (mpuz-check-all-solved)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
468 (mpuz-close-game)))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 (t ;;; incorrect guess
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
470 (message "%c = %c incorrect!" letter-char digit-char)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
471 (mpuz-ding t)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 (setq mpuz-nb-errors (1+ mpuz-nb-errors))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 (mpuz-paint-errors)))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 (defun mpuz-close-game ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 "Housecleaning when puzzle has been solved."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 (setq mpuz-in-progress nil
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 mpuz-nb-cumulated-errors (+ mpuz-nb-cumulated-errors mpuz-nb-errors)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 mpuz-nb-completed-games (1+ mpuz-nb-completed-games))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480 (mpuz-paint-statistics)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
481 (let ((message (format "Puzzle solved with %d error%s. That's %s"
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
482 mpuz-nb-errors
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
483 (if (= mpuz-nb-errors 1) "" "s")
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
484 (cond ((= mpuz-nb-errors 0) "perfect!")
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
485 ((= mpuz-nb-errors 1) "very good!")
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
486 ((= mpuz-nb-errors 2) "good.")
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
487 ((= mpuz-nb-errors 3) "not bad.")
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
488 ((= mpuz-nb-errors 4) "not too bad...")
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
489 ((< mpuz-nb-errors 10) "bad!")
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
490 ((< mpuz-nb-errors 15) "awful.")
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
491 (t "not serious.")))))
87170
e50a2e215441 * erc-stamp.el (erc-echo-timestamp):
David Kastrup <dak@gnu.org>
parents: 78227
diff changeset
492 (message "%s" message)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 (sit-for 4)
65689
96187e7edd1b 2005-09-25 Romain Francoise <romain@orebokech.com>
Romain Francoise <romain@orebokech.com>
parents: 64993
diff changeset
494 (if (y-or-n-p (concat message " Start a new game? "))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 (mpuz-start-new-game)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
496 (message "Good Bye!"))))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
498 (defun mpuz-solve (&optional row col)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
499 "Find solution for autosolving."
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
500 (mapc (lambda (digit)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
501 (or (mpuz-digit-solved-p digit)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
502 (if row
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
503 (not (if col
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
504 (member (cons row col) (aref mpuz-board digit))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
505 (assq row (aref mpuz-board digit)))))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
506 (aset mpuz-trivial-digits digit t)))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
507 [0 1 2 3 4 5 6 7 8 9])
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
508 t)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
510 (defun mpuz-show-solution (row)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 "Display solution for debugging purposes."
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
512 (interactive "P")
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 (mpuz-switch-to-window)
43770
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
514 (mpuz-solve (if row (* 2 (prefix-numeric-value row))))
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
515 (mpuz-paint-board)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
516 (if (mpuz-check-all-solved)
a6103ef77add (mpuz-unsolved-face, mpuz-solved-face)
Eli Zaretskii <eliz@gnu.org>
parents: 42206
diff changeset
517 (mpuz-close-game)))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518
18383
11218164bc54 Add provide call.
Richard M. Stallman <rms@gnu.org>
parents: 18314
diff changeset
519 (provide 'mpuz)
11218164bc54 Add provide call.
Richard M. Stallman <rms@gnu.org>
parents: 18314
diff changeset
520
93975
1e3a407766b9 Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 87649
diff changeset
521 ;; arch-tag: 2781d6ba-89e7-43b5-85c7-5d3a2e73feb1
659
505130d1ddf8 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 232
diff changeset
522 ;;; mpuz.el ends here