Компания Wolfram Research открыла сервис Tweet-a-Program: интересных программ на языке Wolfram Language, длина которых не превышает 140 символов

в 6:46, , рубрики: twitter, wolfram language, Программирование, функциональное программирование

Компания Wolfram Research открыла сервис Tweet a Program: интересных программ на языке Wolfram Language, длина которых не превышает 140 символов

В языке Wolfram Language небольшой код может делать крайне много. Используя это, мы сделали сервис, который позволит вам получить от этого удовольствие, сегодня мы открываем его — Tweet-a-Program.

Этот сервис соединяет в себе программы на языке Wolfram Language длиной в одно сообщение твиттера и возможность их автоматической отправки в @WolframTaP. Наш Твиттер-бот запустит вашу программу в Wolfram Cloud (Облаке Wolfram), после чего опубликует результат.

Hello World from Tweet-a-Program: GeoGraphics[Text[Style["Hello!",150]],GeoRange->"World"]

Каждый может сделать на языке Wolfram Language, которая будет не длиннее одного твита. Скажем, ниже вы видите программу длиной в 78 символов, которая делает заполняет куб раскрашенными сферами:

Graphics3D[Table[{RGBColor[{i,j,k}/5],Sphere[{i,j,k},1/2]},{i,5},{j,5},{k,5}]]

Можно с легкостью делать интересные орнаменты:

Graphics[Riffle[NestList[Scale[Rotate[#,.1],.9]&,Rectangle[],40],{Black,White}]]

Ниже вы видите программу длиной 44 символа, которая выглядит как маленькое вычисляемое стихотворение:

Graphics3D@Point@Tuples@Table[Range[20],{3}]

Можно сделать программу еще короче, скажем эта программа длиной 36 символов делает подобие фрактала:

NestList[Subsuperscript[#,#,#]&,o,6]

Добавив немного математики можно получить сложные трехмерные структуры:

ContourPlot3D[Cos[{x,y,z}/Norm[{x,y,z}]^2]==0,{x,-0.5,0},{y,0,0.5},{z,-0.5,0}]

ReliefPlot[Arg[Fourier[Table[1/LCM[i,j],{i,512},{j,512}]]]]

Вам не обязательно делать картинки. Ниже, скажем, вы видите первые 1000 знаков числа π, размер которых выбирается в зависимости от величины их модуля(посмотрите как бегут друг за другом девятки!):

Row[Style[#,5#+1]& / @ First[RealDigits[Pi,10,1000]]]

Язык Wolfram Language знает не только о том, как вычислить число π, но также и огромное множество других алгоритмов. В него также встроено огромное количество знаний о реальном мире. Так, непосредственно в языке, вы можете спрашивать о фильмах, странах, химических веществах и многом многом другом. Ниже вы можете видеть программу из 78 символов, которая создает коллаж из флагов Европы, при этом размер флага зависит от населения страны:

ImageCollage[CountryData["Europe","Population"]->CountryData["Europe","Flag"]]

Мы можем сделать эту программу еще короче, если мы будем использовать некоторую форму записи на естественном языке непосредственно внутри программы. В обычном интерфейсе документов Wolfram, известных вам по Mathematica, вы можете сделать это, используя сочетание клавиш CTRL +=, но в Tweet-a-Program вы можете сделать это просто используя конструкцию вида =[...]:

ImageCollage[=[Europe populations]->=[Europe flags]]
ImageCollage[=[Europe populations]->=[Europe flags]]

Язык Wolfram Language знает и о географии. Ниже представлена программа, которая которая отображает круги разного радиуса (последовательность степеней 10) в метрах, при этом центр каждого диска приходится на Эйфелеву башню.

Table[GeoGraphics[GeoDisk[=[Eiffel Tower],Quantity[10^(n+1),"Meters"]],GeoProjection->"Bonne"],{n,6}]
Table[GeoGraphics[GeoDisk[=[Eiffel Tower],Quantity[10^(n+1),"Meters"]],GeoProjection->"Bonne"],{n,6}]

Есть множество видов знаний о реальном мире, встроенных в Wolfram Language, которые могут удивить. Скажем, ниже показана карта кораблекрушений в Атлантическом океане:

GeoListPlot[GeoEntities[=[Atlantic Ocean],"Shipwreck"]]
GeoListPlot[GeoEntities[=[Atlantic Ocean],"Shipwreck"]]

Wolfram Language может также работать и с изображениями. Ниже вы видите программу, которая берет изображения планет солнечной системы, а затем перемешивает их R, G и B каналы, давая на выходе довольно экзотичные картинки.

ColorCombine[RandomSample[ColorSeparate[#]]]&/@EntityValue[=[planets],"Image"]
ColorCombine[RandomSample[ColorSeparate[#]]]&/@EntityValue[=[planets],"Image"]

Ниже вы видите мое изображение, к которому несколько раз был применен алгоритм поиска границ на изображении:

NestList[EdgeDetect,=[Stephen Wolfram image],5]
NestList[EdgeDetect,=[Stephen Wolfram image],5]

Или, можно сделать что-то, относящееся больше к «поп-культуре» (также можно использовать эти изображения, применяя к ним всевозможные алгоритмы обработки и анализа). Ниже вы видите таблицу постеров случайно выбранных фильмов:

Grid[Partition[DeleteMissing[EntityValue[RandomSample[MovieData[],50],"Image"]],6]]

Язык Wolfram Language также очень хорошо умеет работать со словами и текстами. Скажем, программа ниже генерирует «инфографику», показывающую относительные частоты встречи первых букв в словах английского и испанского языков:

Row[Style[#,#2/70]& @ @ @ Tally[ToUpperCase[StringTake[DictionaryLookup[{#,All}],1]]]]&/ @ {"English","Spanish"}

Здесь же программа, в точности по размеру равная твиту, которая вычисляет сглаженную гистограмму распределения частот слов “Alice” и “Queen” в оригинале текста Алисы в стране чудес:

SmoothHistogram[Legended[First/ @ StringPosition[ExampleData @ {"Text","AliceInWonderland"},#],#]&/ @ {"Alice","Queen"},Filling->Axis]

Графы и сети тоже хорошо использовать для Tweet-a-Program. Здесь показана программа, которая создает последовательность графов:

Table[Graph[Table[i->Mod[i^2,n],{i,n}]],{n,105,110}]

А здесь — и снова длина программы не превышает лимита символов в сообщении Твиттера — программа, которая создает облако из случайных полиэдров:

Graphics3D[Table[{RandomColor[],Translate[PolyhedronData[RandomChoice[PolyhedronData[]]][[1]],RandomReal[20,3]]},{100}]]

Какая же самая короткая «интересная программа» на языке Wolfram Language?

В некоторых языках, это может быть «куайн» — программа, которая выводит свой собственный код. Но в языке Wolfram Language квайн выглядит очень тривиально. Так как все выражения представляются в символьном виде, то для того, чтобы создать квайн, достаточно просто ввести любой символ:

x

Применяя встроенные в язык Wolfram Language знания, вы можете создать очень короткие программы, которые делают что-то интересное. Как эта программа из 15 символов, которая создает изображение фрагмента встроенной базы данных по узламтеории узлов:

KnotData[{8,4}]

Некоторые короткие программы очень легко понять:

Grid[Array[Times,{12,12}]]

Забавно создавать «загадочные» программы. Скажем, что делает эта?

NestList[#^#&,x,5]

Или эта?

FixedPointList[#/.{s[x_][y_][z_]->x[z][y[z]],k[x_][y_]->x}&,s[s[s]][s][s][s][k],10]//Column

Или же, несколько более сложная, такая как эта:

Style[[FilledCircle],5#]&/@(If[#1>2,2#0[#1-#0[#1-2]],1]&/ @ Range[50])

Я на самом деле потратив много лет моей жизни, изучая короткие программы и то, что они делают и я создал целую науку о вселенной вычислений, которая описана в моей книге A New Kind of Science. Все это началось более трёх десятилетий назад с компьютерного эксперимента, который я могу сделать с помощью всего лишь одного твита:

GraphicsGrid[Partition[Table[ArrayPlot[CellularAutomaton[n,{{1},0},{40,All}]],{n,0,255}],16]]

Мое самое любимое открытие также можно опубликовать в одном твите:

ArrayPlot[CellularAutomaton[30,{{1},0},100]]

Если вы начнете изучать вселенную вычислений, вы сможете с легкостью обнаружить в ней множество потрясающих вещей:

ArrayPlot[CellularAutomaton[{1635,{3,1}},{{1},0},500],ColorFunction->(Hue[#/3]&)]

Встает основной вопрос — существует ли где-то глубоко во вселенной вычислений программа, которая отображает всю нашу физическую вселенную. И является ли эта программа достаточно короткой, чтобы записать ее в одном твите на языке Wolfram Language?

Но независимо от этого мы уже знаем, что язык Wolfram Language позволяет нам писать удивительные программы, длиной не более одного твита, о невероятном количестве вещей. Потребовалось более четверти века на то, чтобы построить огромное «здание» знаний и автоматизации, которое существуют сейчас в языке Wolfram Language. Но именно это богатство языка дало возможность делать так много даже в «мире твиттера».

В прошлом, только обычные человеческие языки были достаточно богаты для передачи значимой информации посредством того же Твиттера. Но то, что поражает сегодня — что язык Wolfram Language, по-видимому, перешагнул своего рода порог «выразительности», и это позволяет ему так просто создавать интересные и сложные вещи, даже с ограничениями Твиттера. Подобно обычным человеческим языкам, на нем можно говорить о всевозможных вещах и выражать всевозможные идеи. Но в нем есть также кое-что еще: в отличие от обычных человеческих языков в нем все имеет точно определяемое значение, причем то, что мы записываем, является не только читаемым, но и вычисляемым.

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

Интересно сравнить Wolfram Language с обычными человеческими языками. Обычный язык, такой как английский, имеет несколько десятков тысяч достаточно распространенных встроенных слов, исключая имена собственные и т. д. Язык Wolfram Language имеет порядка 5000 именованных встроенных объектов, исключая конструкции на основе Entity (ключи обращения к базам данных), которые можно рассматривать как собственные имена.

Одна важная вещь относительно языка Wolfram Language — и которую он разделяет с обычными человеческими языками — заключается в том, что он не только записывается людьми, но и читается ими же. В нем существует словарь, который нужно помнить, а также несколько принципов, которые нужно запомнить — при этом человеку потребуется лишь немного времени, чтобы изучить их и начать понимать типичные программы на языке Wolfram Language.

Иногда довольно легко дать хотя бы грубый перевод (или «объяснение») программы на языке Wolfram Language на обычный человеческий язык. Но очень часто получается так, что программа на языке Wolfram Language выражает что-то, о чем довольно трудно говорить — по крайней мере кратко — на обычном человеческом языке. И это неизбежно означает, что есть вещи о которых проще думать на языке Wolfram Language, но трудно на обычном языке.

Как и в обычных языках, в языке Wolfram Language есть нечто вроде искусства выражения своих мыслей и их записи. В нем есть чтение и понимание прочитанного. В нем есть написание и составление предложений. В нем всегда можно сказать что-то разными способами, но при этом сказать абсолютно точно, а также есть мера оптимальности ваших предложений — скорость их вычисления.

Как и в обычном человеческом языке, здесь есть понятие элегантности. Вы можете думать как о смысле, так и о внешней его реализации. И вы можете также подумать о чем-то вроде «поэзии кода» на этом языке.

Когда я впервые столкнулся с Tweet-a-Program, это показалось мне чем-то банальным. Но то что я увидел и понял, так это то, что это на самом деле окно в мир нового вида выражений и новой формы взаимодействия между людьми и компьютерами.

Конечно, этот сервис предназначен для развлечения. Мне на самом деле доставляет огромное удовольствие создавать короткие, лаконичные программы, которые создают что-то потрясающее.

И теперь я с нетерпением жду того, чтобы посмотреть что вы все сможете сделать в этом сервисе. Какие виды вещей будут созданы? Какие виды коротких кодов станут популярны? Кого вдохновят эти короткие программы? Какие задачи будут предложены и решены? Какие соревнования будут открыты и какие призы будут разыграны? И какие великие «актеры» и «поэты» появятся в этом мире кода?

Теперь у нас есть программы, помещающиеся всего лишь в один твит, давайте посмотрим что-же они могут делать…

Для того, чтобы разрабатывать и тестировать программы для Tweet-a-Program, вы можете создать бесплатный аккаунт в Wolfram Programming Cloud (Облаке Программирования Wolfram), или же использовать любые другие системы, работающие на языке Wolfram как для рабочего стола, так и Облака. Подробнее о Tweet-a-Program вы можете узнать здесь.

Автор: OsipovRoman

Источник

* - обязательные к заполнению поля