Question: I understand that there are three types of programming languages:

* Machine languages
* Assembly languages
* high-level languages

And that:

* Machine languages have no abstraction
* Assembly language have little abstraction
* High-level languages have much abstraction (data types being the difference maker?)

---

Is there a standard or model or taxonomy of programming languages different than machine-assembly-highlevel?

In other words, is this taxonomy necessary or are there more "sophisticated" or "complex" categorizations?

Answer: 
Yes, it is pointless and absurd to implement an algorithm to "guess the number" using [the most common kind of Turing machine](https://en.wikipedia.org/wiki/Turing_machine#Formal_definition), whose head can read any cell on the tape, since, as you pointed out, there is no way to enforce the condition that the algorithm/the machine should not read "the number", which must be a part of the input.

Of course, that does not mean an algorithm that can "guess the number" (efficiently) without reading the number is not useful. For example, the binary search algorithm is used in many places in real life such as [git-bisect](https://git-scm.com/docs/git-bisect) or binary-search routines in the built-in libraries of many programming languages.

Rather, that just means that kind of Turing machine is not the right [model of computation](https://en.wikipedia.org/wiki/Model_of_computation) for that particular problem.

### What is a model of computation?

> 
> In computer science ... a model of computation is a model which describes how an output of a mathematical function is computed given an input. A model describes how units of computations, memories, and communications are organized.
> 
> 
> 

### Which model of computation is for "guess the number"?

One suitable choice for "guess the number" is [an oracle machine](https://en.wikipedia.org/wiki/Oracle_machine).

> 
> An oracle machine ... can be visualized as a Turing machine with a black box, called an oracle, which is able to solve certain problems in a single operation.
> 
> 
> 

A version of the problem of "guess the number" can be stated as the following.

A number has been chosen between integer $low$ and integer $high$. There is an oracle which, given integer $k$, answers the question "is the chosen number smaller than $k$?". How can we design an oracle-machine with that oracle that will find the chosen number given input $low$ and $high$? The less number of times the oracle is used, the better the oracle-machine is.

Beside enabling a solution, the oracle above is used to, in your words, ensure 'the 'privacy' of tokens".

### There are [many models of computation](https://en.wikipedia.org/wiki/Model_of_computation#Models)

There are many different kinds of computational problems. There are also many models of computation. A problem/proposition/argument makes sense only in some models of computation.

Among all models of computation, (that common kind of) Turing machine is the simplest that "can" compute anything that is "effectively computable", basically. That is why you are directed to learn it. However, that does not imply we should/may express and solve every algorithmic problem with it. For another example, it does not make much sense to implement quantum computation on a conventional Turing machine.

### Exercise. What is the most popular model of computation?

By "the most popular model of computation", I mean the one that is used, implicitly or explicitly, when big $O$-notations representing time-complexity or space-complexity are mentioned on almost all millions of web pages on programming. It is certainly not Turing machine.
The way I understand your question, you are wondering why there is a need to do some extra computation (binary search in your case) if the TM can simply read the input, and it will already know the number to be searched, thus performing binary search is not necessary. This might not always be the case.

Consider, the situation, such that the input is the hash value $x'$ of the number that the TM will guess, instead of the actual number $x$. Here we assume that the hashing algorithm used to produce $x'$, is built internally to the TM, that is the TM can perform a hash. Now, as you might imagine, simply reading $x'$ will not help the TM to know what $x$ is. We will force it to actually guess. Although at this point, binary search might not be possible since the TM will not be able to know if the number is less than or greater than the middle value of the range. But instead it must perform the guessing brute-force, trying all values from the range. That is, the TM will start with the lowest value, compute its hash, test if it is equal with the input. If it is, then the TM guessed the number, otherwise it moves to the next number in the range and repeat until it found the right value or exhaust the range.

As a side note, the idea here is very much similar to what you would expect from log-in systems. Even though they can validate the password you enter when logging-in, they actually do not know your actual password, since they only store the hash of the password you initially set.

---

As @jaxad0127 in the comment suggested, you can change the hash function to be some other function $f()$ that is difficult to invert but preserves order. That is, for any two numbers $x\_1$ and $x\_2$ such that $x\_1 \lt x\_2 $, it is always guaranteed that $f(x\_1) \lt f(x\_2)$. This would now allow you to perform binary search. But still, reading the input $x'=f(x)$ will not give the TM any idea as to what the $x$ is and would be better-off performing binary search.