Warning: mkdir(): No space left on device in /var/www/tgoop/post.php on line 37

Warning: file_put_contents(aCache/aDaily/post/misha_writes_code/--): Failed to open stream: No such file or directory in /var/www/tgoop/post.php on line 50
Миша пишет код@misha_writes_code P.98
MISHA_WRITES_CODE Telegram 98
Помните, был такой Brainfuck?

Так вот оказывается, что printf и его параметры являются тьюринг полным языком. А это значит, что подобрав аргументы верно, можно реализовать любую вычислимую функцию. Ну или простыми словами - напрограммировать что угодно.

На самом деле это не совсем честное утверждение, так как в нем нет цикла. Но

while(1) printf(.....)

уже получается тьюринг полным.

Идея принадлежит победителю контеста IOCCC 2020, на котором он сделал крестики нолики используя как раз хак с printf. Назвал он этот подход Printf Oriented Programming.

Если вы не понимаете, как это работает, то я тоже. Но базовый концепт такой.

Все дело в спецификаторе %n, из-за которого printf кладет в соответствующий указатель количество напечатанных на данный момент символов. Что как раз и удается заабъюзить.

%n позволяет сохранять результат промежуточных вычислений и используя его можно реализовать некоторые булевы операции (на самом деле все). В статье автор приводит пример OR и NOT. А эта пара операций является функционально полной - то есть с их помощью можно сделать булеву формулу, удовлетворяющую любой таблице истинности.

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

Казалось бы, прикольно, но и при чем тут Brainfuck? Вместо ответа приведу просто следующую строку.

Пример printf реализующего OR:

printf("%1$s%2$s%3$hhn", A, B, C)

В результате этого printf в C будет лежать A OR B.

В общем жестко, но крайне прикольно. ioccc - кладезь запарных идей.

P.S. кстати, итоговая форматная строка printf для крестиков ноликов после раскрытия всех макросов получается больше 100к символов в длину.
🔥5👍3



tgoop.com/misha_writes_code/98
Create:
Last Update:

Помните, был такой Brainfuck?

Так вот оказывается, что printf и его параметры являются тьюринг полным языком. А это значит, что подобрав аргументы верно, можно реализовать любую вычислимую функцию. Ну или простыми словами - напрограммировать что угодно.

На самом деле это не совсем честное утверждение, так как в нем нет цикла. Но


while(1) printf(.....)

уже получается тьюринг полным.

Идея принадлежит победителю контеста IOCCC 2020, на котором он сделал крестики нолики используя как раз хак с printf. Назвал он этот подход Printf Oriented Programming.

Если вы не понимаете, как это работает, то я тоже. Но базовый концепт такой.

Все дело в спецификаторе %n, из-за которого printf кладет в соответствующий указатель количество напечатанных на данный момент символов. Что как раз и удается заабъюзить.

%n позволяет сохранять результат промежуточных вычислений и используя его можно реализовать некоторые булевы операции (на самом деле все). В статье автор приводит пример OR и NOT. А эта пара операций является функционально полной - то есть с их помощью можно сделать булеву формулу, удовлетворяющую любой таблице истинности.

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

Казалось бы, прикольно, но и при чем тут Brainfuck? Вместо ответа приведу просто следующую строку.

Пример printf реализующего OR:

printf("%1$s%2$s%3$hhn", A, B, C)

В результате этого printf в C будет лежать A OR B.

В общем жестко, но крайне прикольно. ioccc - кладезь запарных идей.

P.S. кстати, итоговая форматная строка printf для крестиков ноликов после раскрытия всех макросов получается больше 100к символов в длину.

BY Миша пишет код




Share with your friend now:
tgoop.com/misha_writes_code/98

View MORE
Open in Telegram


Telegram News

Date: |

To view your bio, click the Menu icon and select “View channel info.” How to build a private or public channel on Telegram? It’s easy to create a Telegram channel via desktop app or mobile app (for Android and iOS): Your posting frequency depends on the topic of your channel. If you have a news channel, it’s OK to publish new content every day (or even every hour). For other industries, stick with 2-3 large posts a week. While some crypto traders move toward screaming as a coping mechanism, many mental health experts have argued that “scream therapy” is pseudoscience. Scientific research or no, it obviously feels good.
from us


Telegram Миша пишет код
FROM American