Short: Solves a 'Countdown' arithmetic problem Author: gilles (dot) bannay (at) free.fr (Gilles BANNAY) Uploader: flype44 gmail com (Philippe CARPENTIER) Type: misc/math Version: 1.67 Architecture: m68k-amigaos >= 2.0 Distribution: Aminet DESCRIPTION: Solves a 'Countdown' arithmetic problem (in english) or 'Le Compte Est Bon' (in french). The target must be fitted arithmetically with the argument list and the operators +, -, *, / (and optionally exponant). See Help() function below for all options. PRINCIPLE: Solves [target] from [a1, a2, a3, a4, a5, a6]. Solves [67] from [15, 8, 50, 4, 5, 21]. One possible answer could be : 5 * 15 = 75 75 - 8 = [67] SYNTAX: CEB a1 a2 a3 a4 a5 a6 [target] [options] AMIGA PORT: You probably all knows the TV game on which you need solves arithmetically a number from six random numbers. This program, CEB, written by Gilles BANNAY, is a resolver for this game. It was last updated in 2012. It was originally compiled for GCC compiler (intel-linux), using : gcc -march=i686 -O2 -fomit-frame-pointer -oceb ceb.c I compiled it on Amiga with the SAS/C Compiler 6.59 (m68k-amiga), without any modification. sc ceb.c TO ceb_ANY LINK CPU=ANY MATH=STANDARD CHKABORT NOICONS STRIPDEBUG OPT OPTGO sc ceb.c TO ceb_020 LINK CPU=68020 MATH=STANDARD CHKABORT NOICONS STRIPDEBUG OPT OPTGO sc ceb.c TO ceb_040 LINK CPU=68040 MATH=STANDARD CHKABORT NOICONS STRIPDEBUG OPT OPTGO sc ceb.c TO ceb_060 LINK CPU=68060 MATH=STANDARD CHKABORT NOICONS STRIPDEBUG OPT OPTGO ENGLISH VERSION: Executable MD5 Size ceb_en_ANY 9ffe2fa2c27dcce0185886c42aacfc11 27936 bytes ceb_en_020 06fe97e8480260865708cc83a024af0d 27672 bytes ceb_en_040 df1758e1bd951956ba2bf9ec5ed8b021 27660 bytes ceb_en_060 b7547d83a0212cec3f4b1ed42ceff89e 27684 bytes FRENCH VERSION: Executable MD5 Size ceb_fr_ANY 05a78fd08cd74888af63fb5fff46e212 27980 bytes ceb_fr_020 bac3b367f5611dea794c7e1a3622353a 27716 bytes ceb_fr_040 6046a476413aaf6f55b0871b730ea656 27704 bytes ceb_fr_060 f82b87ec44f52838b8f39944a8b860a0 27728 bytes HISTORY: V 1.00 (GBY) 11-Mar-1998 Mod: creation V 1.01 (GBY) 02-Mai-1998 Add: Linux portage V 1.10 (GBY) 03-Mai-1998 Fix: display issue when lines<5 V 1.20 (GBY) 05-Mai-1998 Opt: rewrite EssaiOp() for speed Add: BorlandC 4.5 portage Add: verbose in multi-line format (-v option) V 1.30 (GBY) 01-Sep-2000 Opt: add some tests in EssaiOp() Opt: don't explore 2*2 after 2+2 V 1.31 (GBY) 01-Sep-2000 Add: excluding mode ('-x[P]' option) V 1.40 (GBY) 02-Sep-2000 Mod: rewrite code V 1.41 (GBY) 02-Sep-2000 Opt: using SWAP V 1.42 (GBY) 06-Sep-2000 Add: variable arguments number ('-a[N]' option) V 1.43 (GBY) 07-Sep-2000 Add: diagnostic mode ('-d' option) V 1.44 (GBY) 08-Sep-2000 Add: using mode ('-u[N]' option) Fix: special case for -u0 et -u1 Add: optimize mode ('-o' option) V 1.45 (GBY) 15-Sep-2000 Add: mapping mode for statistics V 1.50 (GBY) 23-Jan-2001 Mod: 16 bits compiler portage Mod: max arguments number = 64. V 1.51 (GBY) 23-May-2006 Add: operators selection (-s[+*-/] option) V 1.52 (GBY) 01-Mar-2007 Add: exponant operator selection (-s[+*-/e] option) V 1.53 (GBY) 16-Mar-2007 Add: verbose in one-line format (-v1 option) Add: test overflow. V 1.54 (GBY) 18-Mar-2007 Add: associativity V 1.60 (GBY) 19-Mar-2007 Fix: -s option (- without + or / without *) V 1.61 (GBY) 09-Avr-2011 Add: -g option global V 1.62 (GBY) 11-Avr-2011 Fix: bugfix end variable init V 1.63 (GBY) 30-Avr-2011 Add: -w option (with) V 1.64 (GBY) 01-May-2011 Mod: merge 1.62 & 1.63 version for performance Fix: Operation with 0^0=1 is allowed. V 1.65 (GBY) 14-Sep-2012 Add: -f option (fractionnal) V 1.66 (GBY) 29-Sep-2012 Opt: power_frac() uses nthroot() in place of exp & log V 1.67 (GBY) 22-Oct-2012 Opt: Elag tree with 'first' parameter HELP ENGLISH: CEB a1 a2 a3 a4 a5 a6 [target] [options] Solves a 'Countdown' or a 'Compte Est Bon' problem. The target must be fitted arithmetically with the six arguments 'a1'..'a6' and the operators +, -, *, /, ^. a1..a6 six numerical positive arguments. [target] target number to fit. When 'target' is not present CEB returns a statistics for the targets from 0 to 999. [options] Permits to define some default parameters: -aN set the number of arguments to N (default is 6) -bP set the begin limit for statistics (default is 0) -d prints debug information -eP set the end limit for statistics (default is 999) -f fractionnal numbers allowed -g global mode -o optimizes the number of arguments used -s[+*-/e] set the allowed operators list (default is +*-/) -uP using P arguments or less (default is N) -v displays the solution (multi-lines format) -v1 displays the solution (one-line format) -wP with P arguments or more (default is 1) -xP search up to Pth unfit target (no default) HELP FRENCH: CEB a1 a2 a3 a4 a5 a6 [cible] [options] Permet de resoudre un probleme du type 'Le Compte Est Bon'. La cible doit etre atteinte arithmetiquement avec les six nombres 'a1'..'a6' et les operateurs +, *, -, /, ^ a1..a6 Six arguments numeriques positifs. [cible] Nombre positif a atteindre. Si 'cible' n'est pas precisee, retourne pour les cibles de 0 a 999 une statistique des solutions. [options] Permet de modifier certaines valeurs par defaut: -aN fixe a N le nombre d'arguments (6 par defaut) -bP fixe a P la borne min pour stat (0 par defaut) -d mode debug -eP fixe a P la borne max pour stat (999 par defaut) -f nombres fractionnaires autorises -g mode global -o recherche avec nombre d'arguments minimum -s[+*-/e] liste des operateurs autorises (+*-/ par defaut) -uP avec au plus P arguments utilises (N par defaut) -v affiche la solution (en multi-lignes) -v1 affiche la solution (en une ligne) -wP avec au moins P arguments utilises (1 par defaut) -xP recherche jusqu'au Pieme recalcitrant. EXAMPLES: Below are some examples, among others. There are lots of options, so better try by yourself, that's part of the fun :) Beware with some combinations that would be unlogical, i noticed some cases that produce very very long calcs, or abnormally long. 1. What you certainly want to see for a very first try is the following example. It ask how to solves the target [342] by using the [+, -, /, *] arithmetic operators and by using the numbers [15, 49, 8, 50, 4, 5]. > ceb 15 49 8 50 4 5 342 -v 4 + 50 = 54 5 * 54 = 270 49 + 15 = 64 8 + 64 = 72 270 + 72 = 342 2. Given 6 initial numbers, but no target number, CEB returns statistics for the targets from 0 to 999. Here, for example, 838, 953, and 955 are invalid targets. All other targets from 0 to 999 have a solution. > ceb 15 49 4 50 8 4 unfit = 838 953 955 Success = 99.70%, 3 unfit in 0-999. 3. Some other set of numbers, which have a solution for any number from 0 to 999. > ceb 15 49 8 50 4 5 unfit = Success = 100.00%, 0 unfit in 0-999. 4. Same as previous, and let's see if it have at least one solution for the target number 342. > ceb 15 49 4 50 8 4 342 Solved ! 5. Same as previous, with the solution, in one-line format. > ceb 15 49 8 50 4 5 342 -v1 ((5 * (4 + 50)) + (8 + (49 + 15))) = 342 6. The solution found is not necessarily the best one. It's only the 'first' one the algorithm finds. But you can ask explicitely for the shortest solution with -o. > ceb 15 49 8 50 4 5 342 -v1 -o ((8 * 49) - 50) = 342 7. Or the opposite, to ask the longest solution, using -wP. > ceb_en_060 15 49 8 50 4 5 342 -v -w6 4 + 50 = 54 5 * 54 = 270 49 + 15 = 64 8 + 64 = 72 270 + 72 = 342 8. To use less or more than 6 initial numbers, use the -aN parameter. > ceb 15 49 8 50 342 -a4 -v1 -o ((8 * 49) - 50) = 342 9. To force use only some arithmetic operators, use the -s parameter. This of course will changes the possible solutions. > ceb 15 49 8 50 4 5 131 -v1 -o -s+- (5 + (4 + (50 + (8 + (49 + 15))))) = 131 > ceb 15 49 8 50 4 5 131 -v1 -o -s-* ((4 * (49 - 15)) - 5) = 131 > ceb 50 60 70 80 2 3 9 -v1 -o -s+-*/ (2 + (70 / (60 - 50))) = 9 > ceb 50 60 70 80 2 3 9 -v1 -o -s+-*/e (3 ^ 2) = 9 > ceb 50 60 70 80 3 3 27 -v1 -o -s+-*/e (3 ^ 3) = 27