Как стать автором
Обновить

История тернарного оператора

Алгоритмы *
Из песочницы
Да, во он ? :, давайте разберемся почему он именно такой, а не другой. Единственное питонщикам не будет столь интересно это читать ибо у нас них он выглядит так:

print True if 1 > 2 else False

Четко и понятно «в лоб», с появлением его в python читал в блогах много рассуждений почему он такой, где же стандартный ? : подобный.

Давайте разберемся…

Вообщем-то суть всем ясна, сокращает рутинные условия на 1 действие, хотя писать так:

$var = $a > $n ? $b < $a ? 1 : 0 : null;


Я бы не стал, ибо не читабельно сразу…

Почему я об этом рассказываю?


Однажды, на лабе по теории алгоритмов я впервые столкнулся с машинами Тьюринга и Поста, что придя домой, я начал страстно поглощать инфу по этой теме (ну так меня задело не знаю почему), и хочу поделится этим со всеми.

Сама запись? : в компьютерном мире появилась в начале 20-ого века, предложил её Эмиль Леон Пост (машина Поста, алгебра Поста это все его труды) как запись условной операции в своей машине.

Машина Поста


Абстрактная машина, которая умеет устанавливать и удалять значения ячеек(переменных), передвигаться к нужной ячейке, самое обычное goto, тут же на основе передвижения можно организовать цикл (подобие while), и условная операция. Есть еще машина Тьюринга, аналогия Поста, но вариант Поста настолько прост и гениален что я хочу рассказать именно про него.

Для тех кто не понял, это не какая не программа, не реальная машина размером со шкаф, как думают многие, это абстракция — и это здорово.

Представьте какие-то ящики построенные в ряд (лента), при чем у ящиков есть свой адрес(массив), например мы смотрим на ящик с индексом 0. Так вот, по обе стороны этих ящиков бесконечно. Мы продолжаем смотреть на этот ящик(мы каретка) и на подобии seek мы можем перемещаться на одну итерацию влево или вправо(а там этих ящиков бесконечность).

В ящике может быть 0 или 1. По умолчанию там везде 0, но мы заранее можем поставить 1 в те ящики которые нам нужны. Если фантазии хватило это все представить в голове, идем дальше…

Программирование


Да, это вполне обычное программирование, да же без компьютера, синтаксис простой:

i c n

i — номер команды
c — команда
n — следующая команда (можно указывать любую по счету)

Например:
Катерку ставим на позицию 1 в ленте, все секции стоят в «0». В секцию 10 сносим «1». Пишем программу:

1. V 2 // ставим метку, и переходим ко второй команде
2 . → 3 // сдвигаемся вправо, и переходим к команде 3 
3. ? 1:4 // если метка пуста переходим к 1, иначе 4
4. !  // завершение программы


Грубо говоря было

0000000001

Мы изначально стояли на первом нуле… теперь посмотрите еще раз код, поняли что произошло?

В конце получим 1111111111

Это самый простой пример, «Hello, world» на машине поста!

А вот и он наш тернарный оператор в действии, и та самая запись которая сохранилась до сих пор.

Вот список команд
Y — поставить метку
X — удалить метку
стрелочки перехода естественно
? x: y — если ячейка пуста, перейти к х, иначе y.

Попробуйте написать несложные программы… например ставить метки вот так 10101010, по умолчанию стоим на 0.
Теги:
Хабы:
Всего голосов 41: ↑23 и ↓18 +5
Просмотры 12K
Комментарии Комментарии 14