# Programming like it's 1984

Suppose you need to crack a four-digit password. Suppose also that you live in the 1980s and you know BASIC.There are two system-provided functions to help you: GetFourDigits and CheckPasswordMatch.

GetFourDigits accepts four integers and joins them into a password.

CheckPasswordMatch returns TRUE if you provided the correct password, FALSE otherwise.

That was the task Bob, from Stranger Things, had to do to save himself and the ones with him. While being chased by demodogs...

We're going to dissect his program in this post. Here is a screenshot from his code.

Although variable declaration is not mandatory in BASIC, he started by declaring one. (I'm using a different dialect and formatting from his:)

10

**DIM**FourDigitPassword

**AS INTEGER**

Then, he started four loops, so each variable would vary from zero to nine:

20

**FOR**I = 0

**TO**9

30

**FOR**J = 0

**TO**9

40

**FOR**K = 0

**TO**9

50

**FOR**L = 0

**TO**9

Then he passes these four variables to the GetFourDigits function:

60 FourDigitPassword = GetFourDigits(I, J, K, L)

What does this function do? We don't know, but we'll come back to it later.

Then he checks whether he got the correct password using the CheckPasswordMatch function.

If it is a match, he doesn't need to continue guessing the password, so he breaks from the four loops to display the password:

70

**IF**CheckPasswordMatch(FourDigitPassword) =

**TRUE THEN**

80

**GOTO**140

90

**END IF**

100

**NEXT**L

110

**NEXT**K

120

**NEXT**J

130

**NEXT**I

140

Then he ends the program:

150

**END**

Here we note he used best practices for that time, numbering the lines so he could trace it if he ever needed. In fact, I'm sure he needed.

Now, taking as face value that the password was indeed four digits, what would GetFourDigits look like?

Naively, we could suppose it was along the lines below:

**FUNCTION**GetFourDigits(D1, D2, D3, D4)

GetFourDigits = D1 * 1000 + D2 * 100 + D3 * 10 + D4

**END FUNCTION**

The problem is when we feed it with the four variables in their very first iteration, all of them would be zeros, so we would get zero as an answer.

But 0 does not have four digits!

So maybe it returned a string instead of an integer:

**FUNCTION**GetFourDigits$(D1, D2, D3, D4)

GetFourDigits$ = LTRIM$(STR$(D1)) + LTRIM$(STR$(D2)) + LTRIM$(STR$(D3)) + LTRIM$(STR$(D4))

**END FUNCTION**

Now, when assigning the returned string to an integer variable, it would be converted to an integer, so the returned value of "0000" would become 0.

Then, when passing 0 to CheckPasswordMatch, if it was expecting to receive a string, it would convert 0 to "0".

The fix is simple: Just change the variable declaration to string:

10

**DIM**FourDigitPassword

**AS STRING**

As he managed to get the password, we can only suppose it did not start with a zero.

Also, due to his time constraints, I'm sure we can all forgive him for his minor missteps.

Andrej Biasic

2020-05-20