diff --git a/+ b/+ new file mode 100644 index 0000000..f6cb3f3 --- /dev/null +++ b/+ @@ -0,0 +1,16 @@ +# Predict, Resolve & Tally +A minimal bash utility to work with predictions. + +## Example of use +```bash +$ predict +> Statement: Before 1 July 2020 will SpaceX launch its first crewed mission into orbit? +> Probability (%): 50 +> Date of resolution (year/month/day): 2020/07/01 +``` + +```bash +$ resolve +Before 10 April 2020 will former Catalan President Carles Puigdemont return to Spain? (2020/04/10) +> (TRUE/FALSE) TRUE +``` diff --git a/PRT b/PRT new file mode 100644 index 0000000..2d96290 --- /dev/null +++ b/PRT @@ -0,0 +1,57 @@ +pendingPredictions=/home/pendingPredictions.txt +pendingPredictionsTemp="${pendingPredictions}.t" +resolvedPredictions=/home/resolvedPredictions.txt + +function predict(){ + read -p "> Statement: " statement + read -p "> Probability (%): " probability + read -p "> Date of resolution (year/month/day): " date + echo UNRESOLVED,$date,$probability,$statement >> $pendingPredictions +} + +function resolve(){ + > $pendingPredictions + while IFS= read -r -u9 line || [[ -n "$line" ]]; do + + resolutionState="$(cut -d',' -f1 <<<"$line")" + date="$(cut -d',' -f2 <<<"$line")" + probability="$(cut -d',' -f3 <<<"$line")" + statement="$(cut -d',' -f4 <<<"$line")" + + today=$(date +"%Y/%m/%d") + if [[ "$today" > "$date" ]]; + then + # Already passed + echo $statement "("$date")" + read -p "> (TRUE/FALSE) " resolutionState + echo $resolutionState,$date,$probability,$statement >> $resolvedPredictions + else + # Not yet passed + echo $line >> $pendingPredictionsTemp + fi + done 9< "$pendingPredictions" + mv $pendingPredictionsTemp $pendingPredictions +} + +function tally(){ + + numTRUEtens=0 + numFALSEtens=0 + for i in {0..100} + do + + regExPatternTRUE="TRUE.*,${i}," + regExPatternFALSE="FALSE.*,${i}," + numTRUE="$(grep -c -e $regExPatternTRUE $resolvedPredictions)" + numFALSE="$(grep -c -e $regExPatternFALSE $resolvedPredictions)" + + numTRUEtens=$((numTRUEtens+numTRUE)) + numFALSEtens=$((numFALSEtens+numFALSE)) + if [ $(( $i % 10 )) -eq 0 ] && [ $i -ne 0 ] ; then + echo $((i-10)) to $i : $numTRUEtens TRUE and $numFALSEtens FALSE + numTRUEtens=0 + numFALSEtens=0 + fi + done + +} diff --git a/README.md b/README.md index fa6c2d0..d9b9230 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,79 @@ -# PredictResolveTally -A minimal bash utility to work with predictions +# Predict, Resolve & Tally +A minimal bash utility to make predictions, resolve, and tally them. PRT only has 57 lines of code and plays rough with the user. + +## Example of use + +Open a terminal, with Ctrl+Alt+T + +The command predict creates a new prediction: + +```bash +$ predict +> Statement: Before 1 July 2020 will SpaceX launch its first crewed mission into orbit? +> Probability (%): 50 +> Date of resolution (year/month/day): 2020/07/01 +``` + +The command resolve resolves all predictions whose dates have passed. + +```bash +$ resolve +Before 10 April 2020 will former Catalan President Carles Puigdemont return to Spain? (2020/04/10) +> (TRUE/FALSE) TRUE +``` + +The command tally tallies how you did for all resolved predictions. + +```bash +$ tally +0 to 10 : 0 TRUE and 10 FALSE +10 to 20 : 0 TRUE and 5 FALSE +20 to 30 : 1 TRUE and 3 FALSE +30 to 40 : 2 TRUE and 7 FALSE +40 to 50 : 10 TRUE and 11 FALSE +50 to 60 : 10 TRUE and 10 FALSE +60 to 70 : 7 TRUE and 0 FALSE +70 to 80 : 10 TRUE and 2 FALSE +80 to 90 : 10 TRUE and 1 FALSE +90 to 100 : 1 TRUE and 0 FALSE +``` + +## Installation + +### 1. Add the following to your .bashrc + +Add the following at the end of your .bashrc file, where filePathWay is the location of the PRT file, so that you can use the predict, resolve and tally commands from any terminal. Lines which start with # are comments. +``` +[ -f /filePathWay/PRT ] && . /filePathWay/PRT +``` + +For example: + +``` +[ -f /home/nuno/Documents/PRT ] && . /home/nuno/Documents/PRT +``` + +Google "where is my .bashrc file stackoverflow" if you don't know where your file + +### 2. Change the directory. + +Change the first 3 lines so that the program uses the directory of your choice. For example, in my system they might be: + +``` +pendingPredictions=/home/nuno/Documents/Forecasting/pendingPredictions.txt +pendingPredictionsTemp="${pendingPredictions}.t" +resolvedPredictions=/home/nuno/Documents/Forecasting/resolvedPredictions.txt +``` + +## Gotchas +- CSV: Statements, predictions and probabilities are saved, internally, as a csv file. This means that you can choose between: + - Not using commas in your statements + - Modifying the program so that it becomes more complicated, but suits your needs better +- Dates: Dates are in the year/month/day format, so that they can be compared alphanumerically as strings. That is, an earlier date, in this format, would come earlier in a dictionary than a later date. + - 2020/7/1 is not a valid date, because it would come after 2020/10/01. Write dates using two digits for both month and dates, like: 2020/07/01. + - Alternatively, write a date parser to suit your needs. It's not difficult, but it's very annoying. +- Bash + - This program runs in [bash shells](https://en.wikipedia.org/wiki/Bash_(Unix_shell)), common in Unix systems. +- Windows & Mac + - You can install bash for Windows (I like the distribution in [git for Windows](https://git-scm.com/download/win)). See also [these](https://stackoverflow.com/questions/6413377/is-there-a-way-to-run-bash-scripts-on-windows) [two](https://stackoverflow.com/questions/6883760/git-for-windows-bashrc-or-equivalent-configuration-files-for-git-bash-shell) stackoverflow answers. +- The tally function is really simple; it only accepts predictions with 1% granularity, and it aggregates them with 10% granularity. It might become more complicated in the future.