Pull to refresh

Единство формы и содержания

Reading time 2 min
Views 44K
Прислал мне тут один программист смешную круглую программку на языке C, там был #define определяющий подчерк, а потом из подчерков и минусов был нарисован круг:

            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
        _-_-_-_-_-_-_-_
            _-_-_-_


При вычислении этого выражения получалось число π. Ну на самом деле, там чего-то съехало и вместо π получалось 0.250, но не в этом дело.



Сначала я хотел «отладить» эту программку, но подумал, что таких программ, где кодом нарисована какая-то картинка, вообще-то много. А ведь можно придать этому геометрический смысл!

Сказано — сделано, вот программа для вычисления числа π:
#define O o++;
#define K k++;
double o = 0;
double k = 0;

main()
{

          O O O O O O               K K K K K K K K
      O O O O O O O O O O           K K K K K K K K
    O O O O O O O O O O O O         K K K K K K K K
    O O O O O O O O O O O O         K K K K K K K K
  O O O O O O O O O O O O O O       K K K K K K K K
  O O O O O O O O O O O O O O       K K K K K K K K
  O O O O O O O O O O O O O O       K K K K K K K K
O O O O O O O O O O O O O O O O     K K K K K K K K
O O O O O O O O O O O O O O O O     K K K K K K K K
O O O O O O O O O O O O O O O O
O O O O O O O O O O O O O O O O
  O O O O O O O O O O O O O O
  O O O O O O O O O O O O O O
  O O O O O O O O O O O O O O
    O O O O O O O O O O O O
    O O O O O O O O O O O O
      O O O O O O O O O O
          O O O O O O

printf("%f\n",o/k);
}


Получается 3.1666…, но если нарисовать картинку побольше, то точность возрастет.

Площадь круга πR², то есть если поделить площадь круга на площадь квадрата, сторона которого равна радиусу этого круга, то получится π. Берем две переменных и рисуем круг инкрементами одной переменной, а квадрат инкрементами другой. В результате, соотношение этих переменных равно соотношению площадей фигур.

UPDATE: Собственно, вдохновившая меня программка, также оказалась с геометрическим смыслом.
Её историю и полный текст можно найти тут: International Obfuscated C Code Contest,
а пояснения есть в комментариях к этому посту.

Однако, он от меня ускользнул. Кстати, в комментариях приведен вариант, подправленный под современные препроцессоры, но в нём геометрический смысл уже частично утерян, так как диаметр круга уже зашит в константу (0xF).

Остаётся посыпать голову пеплом и порадоваться, что мой вариант более прозрачный, и что я, пусть и не прямо (и даже не сознавая этого), но сослался-таки на первоисточник идеи.
Tags:
Hubs:
+72
Comments 35
Comments Comments 35

Articles