#+STARTUP: align * The new writing challenge - how it works There are three numbers that enter into the challenge: base words, quota words, and target words. The base is the minimal number of words to write every day to count as a writing day. The quota is the number of words you must write to meet the challenge. It is a dynamic value which increases as you write more and decreases as you write less. The target is the number of words you must write to reach your word goal by the end of the challenge. So for NaNoWriMo, the target is definitely 1667. The base can be whatever you wish, but 250 seems good as a general number, for NaNo as well as other challenges. The base should /not/ be set too high. The whole point is to make each and every day a writing day, and not make it so burdensome that it's easier to skip. In non-NaNoWriMo-like situations, you may well want to set the target equal to the base. It's up to you. However, if you have a deadline for, say, a 10,000 word novelette, you can set the target accordingly by dividing the number of days to deadline by the required word count. You must write at least the 'base words' every day to keep your chain going. If you write at least 'base words' you get a score addition equal to your new chain count, but never less than a one point addition. Chain count increases by 1 if you meet quota exactly. It increases by less than 1 if you're under quota but still at least at the base words count. Chain count increases by more than 1 if you exceed quota. Chain count will always increase if you meet base word count. Quota then changes for the next day. The value is the multiple of the most recent chain count times the increment value. The increment value shouldn't be set too high. 4 is a good number; this would mean an increase of about 120 over the course of the month if you write to quota each day. If you don't do the base word count, on the first day you miss, chain count goes to -1. The chain count decreases by one for each missed day in a row. The total score is decreased on each missed day by the chain count. So as you miss more days, score drops faster. Quota gets reset to the base word count. Score never goes below zero, though (it's like a total reset when you reach zero). When you starting meeting the base word count again, chain count is changed to a positive number with the scoring and quota rules as above. Sensitivity to being under or over quota is fairly low. The recommended logbase value is 100 which yields log 100 of words/quota). You do get a boost for being way over quota and less of a boost for being under, but the real sensitivity of the method is to writing the base amount every day for as many days in a row as possible. For this reason a low value of logbase (which would lead to bigger chain count changes) isn't recommended. The target influences score but not chain count. Score is increased or decreased based on both daily performance vs. target and cumulative word count vs. cumulative target. The parameter tdlogbase controls daily sensitivity, and tclogbase controls cumulative sensitivity. Make these large numbers (like 1000) to largely cancel these score effects if you don't want them. 100 for tdlogbase and 200 for tclogbase are recommended for moderate but not excessive influence. Note that it is possible for score to decrease even if base and or quota are met in a given day, due to target influences. Getting way behind on cumulative target will have lasting effects. Point counts can get pretty large with sustained writing. The method should be reset after each "challenge" period, which might be 30, 60, or at most 90 days. A month is probably best. This method is derived and modified from the original Hawai`i challenge (by Tony Pisculli) which, while truly excellent, was fairly static and used fewer tracking and scoring factors. The new method is more in line with what you'd expect from an MIT engineer. The advantage of the new method is that it is dynamic and adjusts to performance. The more you write, the more you need to write to get bigger bonuses. If you slack off, you still need to write minimums but there is some mercy on the quota. Bonuses are sustained by being built in to the chain count. This makes the new method a "stretch" method. However, using log 100 instead of log 10 ensures that the "stretch" is reasonable. Bugs: They are here. Obviously haven't found them yet. Let me know. Comments and improvements (especially to the formatting, which I particularly don't care for) are welcome. Please email writingchallenge@bobnewell.net. Bob Newell Honolulu, Hawai`i Version: 0.01 alpha, 17 October 2013 * The challenge spreadsheet #+CONSTANTS: base=250 target=1667 increment=4 logbase=100. tdlogbase=100. tclogbase=200. | <3> | <7> | <8> | <7> | <7> | <5> | <6> | <6> | <7> | | Day | Words | Quota | Chain | Cum Wds | Targ | Cum T | Plus/min | Score | |-----+---------+----------+---------+---------+-------+--------+--------+---------| | 1 | | 250 | | | 1667 | 1667 | | | | 2 | | | | | | | | | | 3 | | | | | | | | | | 4 | | | | | | | | | | 5 | | | | | | | | | | 6 | | | | | | | | | | 7 | | | | | | | | | | 8 | | | | | | | | | | 9 | | | | | | | | | | 10 | | | | | | | | | | 11 | | | | | | | | | | 12 | | | | | | | | | | 13 | | | | | | | | | | 14 | | | | | | | | | | 15 | | | | | | | | | | 16 | | | | | | | | | | 17 | | | | | | | | | | 18 | | | | | | | | | | 19 | | | | | | | | | | 20 | | | | | | | | | | 21 | | | | | | | | | | 22 | | | | | | | | | | 23 | | | | | | | | | | 24 | | | | | | | | | | 25 | | | | | | | | | | 26 | | | | | | | | | | 27 | | | | | | | | | | 28 | | | | | | | | | | 29 | | | | | | | | | | 30 | | | | | | | | | | 31 | | | | | | | | | #+TBLFM: $3='(if (eq "@-1$2" "") "" (calcFunc-max $base (+ $base (* $increment @-1$4))));L::$4='(if (eq "$2" "") "" (if (>= $2 $base) (calcFunc-max 0. (+ 1. (+ (calcFunc-max 0. @-1$4) (string-to-number (calc-eval "log(div($2,$3),$logbase)"))) )) (if (> @-1$4 0) -1 (- @-1$4 1))));L::$5='(if (eq "$2" "") "" (+ $2 @-1$5));L::$6='(if (eq "@-1$2" "") "" $target);L::$7='(if (eq "@-1$2" "") "" (+ $target @-1$7));L::$8='(if (eq "$2" "") "" (- $5 $7));L::$9='(if (eq "$2" "") "" (if (> $4 0) (calcFunc-max 0 (+ (string-to-number (calc-eval "log(div($5,$7),$tclogbase)")) (string-to-number (calc-eval "log(div($2,$6),$tdlogbase)")) (calcFunc-max $4 1) @-1$9)) (calcFunc-max 0 (+ @-1$9 $4))));L::@3$3=$base;N::@3$4='(if (eq "@3$2" "") "" (if (>= @3$2 $base) (+ 1.0 (string-to-number (calc-eval "log(div(@3$2, @3$3),$logbase)"))) -1.));L::@3$5='(if (eq "@3$2" "") "" @3$2);L::@3$6=$target;N::@3$7=$target;N::@3$8='(if (eq "@3$2" "") "" (- @3$5 @3$7));L::@3$9='(if (eq "@3$2" "") "" (if (> @3$4 0) (calcFunc-max 0 (+ (string-to-number (calc-eval "log(div(@3$5,@3$7),$tclogbase)")) (string-to-number (calc-eval "log(div(@3$2,@3$6),$tdlogbase)") ) @3$4)) @3$4));L * End Notes Usage: 1. At start of challenge, edit the #+CONSTANTS line to suit. Press C-c C-c. 2. Each day enter word count and then recalculate with C-u C-u C-c *. 3. Uh, save the file... Keep copy for use in making new challenges. Important: You MUST (require 'calc-ext) in your startup.