Пи в языках программирования

    14 марта — всемирный день числа Пи. Придуманный в 1989 году и официально признанный в 2009, этот день отмечают многими способами, из которых самые популярные — поедание круглых пирогов и обсуждение вещей, связанных с числом Пи. Было бы странно, если бы не нашлось пары-тройки языков программирования, основанных на числе Пи или хотя бы названных в его честь. О них я и расскажу — надо же поддержать традицию :-)

    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 — ежегодно обновляющаяся серия загадок, связанных с числом Пи.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 25

      +1
      Спасибо автору, что напомнил об этом празднике!
      *пошел готовить пирог, еще ни разу не пробовал этого делать на день пи*.
        –8
        Две недели назад тока праздновали. Сколько можно то habrahabr.ru/blogs/statistics/114906/
          +2
          По американскому календарю. Год.месяц.число. Отбросим год. 3.14 — 14 марта. А причем там 4 марта?
            +1
            Предыдущий автор утверждал, что 4 марта «исполняется ровно 250 лет с того дня, как немецкий физик и математик Иоганн Генрих Ламберт, отвлёкшись от своих трактатов по оптике и астрономии, доказал, что Пи является иррациональным числом. » Со всем уважением к Pi, но это больше напоминает день граненого стакана для математиков.
              +5
              А вы видели, кто — предыдущий автор?)
                +1
                Теперь я понимаю почему говорят «это же alizar !». )
                Было в комментах к «тому самому топику» :)
                  0
                  Где-то было расширения для хабра, что-бы маркировать ализаровские топики…
              0
              А я всё жду 31-го Апреля, чтобы отпраздновать по российскому каленьдарю -_-'
            +8
            Схожу-ка выпить π-ва в честь такого иррационального праздника:)
              +1
              «Исходный код программы на Another Pi Language представляет собой пару чисел: индекс бита, с которого следует начинать чтение, и количество байт, которые следует прочитать.»
              Больше похоже не на ЯП а на алгоритм сжатия. Надо другу DVD-фильм переслать. Кидаешь в ICQ индекс бита и количество байт данной последовательности в числе пи. А он у себя нужную последовательность вычленяет и сохраняет…
                +7
                Что-то мне подсказывает, что для записи индекса бита все же потребуется не меньше данных, чем сам фильм занимает.
                  0
                  Скорее всего так и будет… Для решения этой проблемы индекс бита будет передаваться в виде: (x1 в степени n1) + (x2 в степени n2) +… + С.
                  Формулой можно будет передать ооочень большую цифру в более компактной форме…
                    0
                    Нет.
                    Точнее формулой можно передавать большие числа короткой записью, но не все, а только особенные (а в Another Pi Language числа скорее всего не будут обладать закономерностями).
                    Если б любое число можно было записать формулой короче, то это было бы универсальным способом архивации.
                      0
                      Для всех таких «не подходящих» чисел в формуле в конце "… + C", где С некая константа.
                +2
                … объем пиццы с радиусом ц и высотой а равен пи*ц*ц*а (с)БашОрг
                  0
                  π***ец красотищща
                    0
                    А про более известный π-calculus забыли то :)
                      +2
                        +1
                        It's time to eat some chocolate Pi!
                        0
                        У меня день рождения в этот великий день :)
                        И ещё Альберт Эйнштейн родился 14 марта :)
                          +1
                          Кстати, не забываем, что по-английски π читается как /paɪ/.
                            0
                            Вот код на Русском Языке Программирования:
                            число Пи (через формулу Валлиса)
                            ---------------------------
                            Вывод:
                            пи2 равно 3.14316070553226
                            ===========================
                            
                            колво = 1000
                            пи = 2
                            знак1 = 1
                            счетчик1 = 1
                            
                            начало
                              знак1 = знак1 * -1
                              знак2 = знак1 + 1
                              знак2 = знак2 / 2
                            
                              знак3 = знак1 * -1
                              знак3 = знак3 + 1
                              знак3 = знак3 / 2
                            
                              счетчик1 = счетчик1 + 1
                              счетчик2 = счетчик1 + знак2
                              счетчик3 = счетчик1 + знак3
                            
                              числзнам = счетчик2 / счетчик3
                              пи = пи * числзнам
                            
                              колво = колво - 1
                            цикл колво
                            
                            пи2 = 2 * пи
                            показать пи2
                            

                            Only users with full accounts can post comments. Log in, please.