Компанія 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 ви можете дізнатися тут.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.