14 марта — всемирный день числа Пи. Придуманный в 1989 году и официально признанный в 2009, этот день отмечают многими способами, из которых самые популярные — поедание круглых пирогов и обсуждение вещей, связанных с числом Пи. Было бы странно, если бы не нашлось пары-тройки языков программирования, основанных на числе Пи или хотя бы названных в его честь. О них я и расскажу — надо же поддержать традицию :-)
У Brainfuck множество диалектов практически на все случаи жизни, диалект Pi среди них тоже есть. Команды языка записываются в число Пи в виде неправильных цифр в случайных разрядах следующим образом.
Для каждой команды выбирается разряд, в который она будет записана (разряды упорядочены так же, как команды в исходном коде). Берется таблица соответствия команд и цифр
и в ней строка команд сдвигается на одну вправо, начиная с команды над цифрой, которая находится в выбранном разряде в правильном числе Пи. Например, если выбран второй разряд после десятичной точки, правильная цифра в нем — 4, и таблица соответствия принимает следующий вид:
Теперь по нужной команде выбираем соответствующую ей цифру и заменяем на нее правильную в выбранном разряде. Результат записи программы — число, похожее на Пи, но местами отличающееся от него. Так, программа «Hello, World!», которая на Brainfuck записывается вот так:
на Pi запишется вот так:
Необычный даже для эзотерических языков, этот язык существует только в виде теоретического описания. Идея языка основана на известной теории о том, что в числе Пи можно найти любую информацию, если подобрать правильную кодировку. В данном случае Пи записывается в двоичном представлении
Исходный код программы на Another Pi Language представляет собой пару чисел: индекс бита, с которого следует начинать чтение, и количество байт, которые следует прочитать. Прочитанные байты переводятся в символы с соответствующими ASCII-кодами, и полученный текст интерпретируется как исходный код на каком-то другом языке (язык должен быть указан вместе с парой чисел).
Теоретически в числе Пи можно найти любую последовательность битов любой длины, то есть код любой, сколь угодно сложной программы. Этот язык даже будет Тьюринг-полным (поскольку на нем можно выполнить любое задание, которое можно выполнить на других языках). Другое дело, что по сложности программирования на нем он сможет поспорить с Malbolge. Впрочем, в отличие от Malbolge, «Hello, World!» на Another Pi Language пишется легко и изящно:
Для «интерпретации» этого кода:
Еще несколько примеров разной длины:
(последние два примера найдены с помощью сервиса Search Pi)
Нечто среднее между инструментом разработки и философией создания новых языков программирования. Основан на идее расширяемости семантики и синтаксиса языков программирования средствами самих языков.
Небольшой подарок ко дню Пи: Pi Day Challenge 2011 — ежегодно обновляющаяся серия загадок, связанных с числом Пи.
1. Pi — диалект Brainfuck
У Brainfuck множество диалектов практически на все случаи жизни, диалект Pi среди них тоже есть. Команды языка записываются в число Пи в виде неправильных цифр в случайных разрядах следующим образом.
Для каждой команды выбирается разряд, в который она будет записана (разряды упорядочены так же, как команды в исходном коде). Берется таблица соответствия команд и цифр
< > + — . , [ ]
0 1 2 3 4 5 6 7 8
и в ней строка команд сдвигается на одну вправо, начиная с команды над цифрой, которая находится в выбранном разряде в правильном числе Пи. Например, если выбран второй разряд после десятичной точки, правильная цифра в нем — 4, и таблица соответствия принимает следующий вид:
< > + — . , [ ]
0 1 2 3 4 5 6 7 8
Теперь по нужной команде выбираем соответствующую ей цифру и заменяем на нее правильную в выбранном разряде. Результат записи программы — число, похожее на Пи, но местами отличающееся от него. Так, программа «Hello, World!», которая на Brainfuck записывается вот так:
++++++[>++++++++++++<-]>.>++++++++++[>++++++++++<-]>+.+++++++..+++.>++++[>++++++
+++++<-]>.<+++[>----<-]>.<<<<<+++[>+++++<-]>.>>.+++.------.--------.>>+.
на Pi запишется вот так:
3.141592653589793238462623382272502824197169299275107820904924592337816406386238
99262833482534311206728234808621328230264709314460935058223872535941812844111745
00841022019385311055296426229289549302819244388109726652334471204756422337867231
65221231909345628566933460342610454226248213391607264249148273720587036656315582
17288153092396282225439171532436789559536003133023024882044652108412695192151163
94330573703656595909530921261173839326137921051125420742623799227495273538857227
24892227938133011749109833675362442656243086321294946795024737130702479860343702
77453921711629317375838467480846766440513202056822724526351082178577132275778260
91736271767204684409312229532301462492853110307922896892089235450199501120290219
65862034218129813624774731309964518707241349993993372978039951049734732816036348
59504445345544690330263252250825304468003522193158817101
2. Another Pi Language
Необычный даже для эзотерических языков, этот язык существует только в виде теоретического описания. Идея языка основана на известной теории о том, что в числе Пи можно найти любую информацию, если подобрать правильную кодировку. В данном случае Пи записывается в двоичном представлении
11.
00100100 00111111 01101010 10001000 10000101 10100011 00001000 11010011
00010011 00011001 10001010 00101110 00000011 01110000 01110011 01000100
10100100 00001001 00111000 00100010 00101001 10011111 00110001 11010000
00001000 00101110 11111010 10011000 11101100 01001110 01101100 10001001
Исходный код программы на Another Pi Language представляет собой пару чисел: индекс бита, с которого следует начинать чтение, и количество байт, которые следует прочитать. Прочитанные байты переводятся в символы с соответствующими ASCII-кодами, и полученный текст интерпретируется как исходный код на каком-то другом языке (язык должен быть указан вместе с парой чисел).
Теоретически в числе Пи можно найти любую последовательность битов любой длины, то есть код любой, сколь угодно сложной программы. Этот язык даже будет Тьюринг-полным (поскольку на нем можно выполнить любое задание, которое можно выполнить на других языках). Другое дело, что по сложности программирования на нем он сможет поспорить с Malbolge. Впрочем, в отличие от Malbolge, «Hello, World!» на Another Pi Language пишется легко и изящно:
3 1 HQ9+
Для «интерпретации» этого кода:
- читаем 1 байт, начиная с 3-го бита записи. Первая единица считается нулевым байтом, поэтому начинаем со второго нуля после запятой: 01001000;
- переводим в десятичное число (72) и в символ с таким ASCII-кодом (H);
- интерпретируем полученный символ как код программы на HQ9+ — а для этого замечательного языка это и есть команда вывода «Hello, World!» на печать. Удачно, правда?
Еще несколько примеров разной длины:
- канонический пример «99 бутылок пива»
113 1 HQ9+ (9)
- прочитать символ и вывести его же на печать
102168614(+-1) 2 Brainfuck (,.)
- бесконечный цикл
3234901746(+-1) 3 Boolfuck (*[])
(последние два примера найдены с помощью сервиса Search Pi)
3. Язык паттернов Pi
Нечто среднее между инструментом разработки и философией создания новых языков программирования. Основан на идее расширяемости семантики и синтаксиса языков программирования средствами самих языков.
4. Бонус :-)
Небольшой подарок ко дню Пи: Pi Day Challenge 2011 — ежегодно обновляющаяся серия загадок, связанных с числом Пи.