Hacker News new | ask | show | jobs
by mdellabitta 2919 days ago
I was taught basic counting, addition, and subtraction using a finger-abacus system called Chisanbop: https://en.wikipedia.org/wiki/Chisanbop

Now I'm plagued by off-by-one errors in my mental math, particularly when it comes to intervals. If you ask me how many days there are between now and Christmas, I will be uncertain about the answer unless I individually count them all off on my fingers.

6 comments

Yeah, that's not an uncommon malady. That's why off-by-one errors are one of the two most common errors in computer programming, along with naming things and cache invalidation.
Thanks for the chuckle.
Just use little inductive proofs. How many days lie between day 3 and day 37? Is it 37-3=34 or maybe 37-3-1=33?

Well, between day 1 and day 3 there is 1 day. By finite induction between day n>3 and day 1, there are n-2 days, and analogously between days n>k>1 there are n-k-1 days.

It's embarrassing but that's what I routinely do when declaring and indexing arrays. I imagine an array with 2 items (index 0 and index 1) and say "that's got length 2 and maximum index 1", so for my length 50 array, the maximum index will be 49. Similarly for intervals and 1-based arrays, etc. All of that talking to myself over and over again! I almost never get off-by-1 errors though. It's a good reason to use iterators instead of for loops.
I do this when I need to know how many elements are in a spreadsheet list that spans (say) row 18 to 33.

"well, if it spanned to row 19, there would be two elements, so N elements end at row 17+N, so 33-17 is 16, so there are 16 elements."

That's painstaking and I should fix it, lol.

The number of options here is small enough (three) you should memorize it.

Subtract the start and stop. If the start and stop are both excluded, subtract 1. If one of them is included, make no change. If both are included, add 1.

Excluded start and stops happen when you have external boundaries. Like, your last day on the old project was the 10th, and your first day on the new one is the 15th. You had no project for 15-10-1=4 days.

One included happens when you're measuring between numbers. If you start working at 2 and finish at 8, you worked 8-2=6 hours.

Double inclusion counts when you have internal boundaries, or are counting how many things are "touched". If you work on something from the 11th to the 15th, you worked on it 15-11+1=5 days. (Also, your example.)

Stop position - start position + (number of included positions - 2) = total

I can usually get away with visualizing indices as being just before a memory cell (i.e. on the boundary between cells), whereas lengths are spans of cells. For example:

          | H | e | l | l | o |

    Index 0   1   2   3   4   5

   Length |<--------5-------->|
This makes it easy to visualize that 1-based indexing has indices centered on the memory cell, so calculating a span requires reducing the subtractor by 1.
> I was taught basic counting, addition, and subtraction using a finger-abacus system called Chisanbop: https://en.wikipedia.org/wiki/Chisanbop

I was just taught counting using it, it was a quick bonus math class one day.

It is super useful for counting things off without losing place. Even being able to go up to 10 on just one hand is useful.

I think everybody are uncertain about such a question, when it is not between 1st and 24th of december.
Clearly it is the difference between the two numbers plus one if both are to be included in the result and the difference minus one if both are excluded. That is because the conventional difference excludes the one being subtracted but includes the other one. Think of it as set difference.
I kinda do the same thing, except I tap my other fingers on my thumb instead of holding them over a table. I might start doing that though.