Hacker News new | ask | show | jobs
by lopmotr 2919 days ago
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.
2 comments

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.