В этой задаче пользователи по очереди выполняют три довольно простых задачи кодирования на языках программирования, которые могут быть постепенно стареющими.
В первом ответе должен использоваться язык программирования, созданный в 2015 году. Если есть хотя бы один ответ из языка 2015 года, в ответах могут использоваться языки программирования, сделанные в 2014 году. Аналогичным образом, ответы, использующие языки 2013 года, не допускаются. пока не будет хотя бы одного ответа 2014 года.
Как правило, использование языка программирования года Y не допускается до тех пор, пока не будет представлен ответ с использованием языка года Y + 1. Единственное исключение - Y = 2015.
Нахождение года вашего языка
Чтобы ответить на этот вопрос, вы должны знать год, в который ваш язык программирования был «сделан». Это, конечно, субъективный термин; некоторые языки были разработаны в течение нескольких лет, и многие языки продолжают обновляться каждый год. Пусть год, в который был «сделан язык», станет первым годом, когда внедрение этого языка появилось в широкой публике.
Например, Python был «сделан в 1991 году» , хотя его разработка продолжалась с 1989 года, а версия 1.0 не была выпущена до 1994 года.
Если этот год все еще субъективен, просто используйте свой здравый смысл, чтобы выбрать наиболее подходящий год. Не увязайте в небольших разногласиях по поводу выбора года. Пожалуйста, предоставьте ссылку на источник, который говорит, когда ваш язык был сделан.
Различные версии или стандарты языка программирования (например, Python 1, 2, 3) считаются одним и тем же языком с одним и тем же начальным годом.
Таким образом, если ваш язык не является 2015 годом, вы можете отправить свой ответ только после того, как будет представлен ответ, языком которого является год, предшествующий вашему.
Если действительный ответ того же года, что и ваш, уже существует, вы можете ответить. Неважно, был ли ваш язык разработан ранее или позже в этом году.
Задачи
Вы должны выполнить Задачи с 1 по 3. Задача 0 не является обязательной.
Эти задачи были более или менее выбраны, чтобы соответствовать трем важным аспектам программирования: обеспечение вывода (Задача 1), циклическое выполнение (Задача 2) и рекурсия (Задача 3).
Задача 0 - История языков (необязательно)
Напишите хотя бы параграф, объясняющий историю выбранного вами языка программирования: кто его разработал, почему, как и т. Д. Это особенно рекомендуется, если вы лично были рядом, когда появился этот язык, и, возможно, даже сыграли свою роль в его разработке. Не стесняйтесь рассказывать личные анекдоты о влиянии языка на вас или вашу работу, или что-то в этом роде.
Если вы слишком молоды, чтобы много знать об истории своего языка без особых исследований, рассмотрите возможность оставить заметку для пожилых пользователей, в которой говорится, что они могут отредактировать ваше сообщение и добавить его в историю из первых рук.
Задача 1 - «Привет, мир!» Вариант
Напишите программу, которая печатает
[language name] was made in [year made]!
в стандартную область вывода вашего языка (стандартный вывод для самых последних языков).
Например, если бы язык был Python, вывод был бы:
Python was made in 1991!
Задача 2 - ASCII Art N
Напишите программу, которая позволяет пользователю вводить нечетное положительное целое число (вы можете предположить, что ввод всегда действителен) и печатает букву N в формате ASCII, созданную с использованием символа N
.
Если входное значение равно 1, выходное значение равно:
N
Если входное значение равно 3, выходное значение равно:
N N
NNN
N N
Если входное значение равно 5, выходное значение равно:
N N
NN N
N N N
N NN
N N
Если входное значение равно 7, выходное значение равно:
N N
NN N
N N N
N N N
N N N
N NN
N N
Шаблон продолжается так. Вывод может содержать завершающие пробелы.
Задача 3 - GCD
Напишите программу, которая позволяет пользователю вводить два положительных целых числа (вы можете предполагать, что ввод всегда действителен) и печатает их наибольший общий делитель . Это определяется как наибольшее положительное целое число, которое делит оба числа без остатка. Его можно легко рассчитать с помощью евклидова алгоритма .
Примеры:
8
, 12
→ 4
12
, 8
→ 4
3
, 30
→ 3
5689
, 2
→ 1
234
, 876
→6
Вы можете использовать встроенную функцию, но попробуйте выяснить, была ли она в первой версии вашего языка. Если нет, попробуйте не использовать его.
правила
- Вы можете отвечать несколько раз, но каждый новый ответ должен использовать язык, составленный не менее чем за 5 лет до языка в вашем последнем ответе. Поэтому, если вы ответили языком 2015 года, вы не сможете ответить снова, пока не будут разрешены языки 2010 года. Если вы начнете с ответа 2010 года, вы не сможете сделать ответ 2015 года своим вторым ответом, потому что 2015 год не раньше 2010 года.
- Если возможно, напишите свой код так, чтобы он работал в самой первой версии вашего языка (или как можно более старой версии). (Это не является обязательным требованием, поскольку поиск старых компиляторов / интерпретаторов для некоторых языков может быть затруднен.)
- Воздержитесь от публикации языка, который уже был опубликован, за исключением тех случаев, когда в опубликованном ответе есть значительные ошибки или у вас совсем другой способ выполнения задач.
- Гольф ваш код это хорошо, но не обязательно.
- Завершающий перевод строки в вывод любой программы - это нормально.
- Для задач 2 и 3 все входные значения ниже некоторого разумного максимума, такого как 2 16, должны работать (как минимум 256).
- Ваш язык должен был существовать до того, как этот вопрос был опубликован.
- Очень старые языки программирования могут иметь разные формы ввода и вывода, чем мы думаем сегодня. Это отлично. Выполняйте задания в меру своих возможностей в контексте вашего языка.
счет
Оценка вашего представления:
upvotes - downvotes + (2015 - languageYear) / 2
Таким образом, 0,5 добавляется к подсчету голосов за каждый год до 2015 года, что дает преимущество старым языкам. Представление с самым высоким счетом выигрывает.
Список ответов
В приведенном ниже фрагменте стека перечислены все действительные ответы в зависимости от их языкового года.
Вы должны начать свой пост с этой строки Markdown, чтобы убедиться, что она указана правильно:
#[year] - [language name]
Например:
#1991 - Python
Название языка может быть в ссылке (это будет та же ссылка в списке ответов):
#1991 - [Python](https://www.python.org/)
Ответы, которые не соответствуют этому формату или имеют год, который еще не разрешен, или получены от пользователя, который уже ответил за последние 5 лет, помечаются как недействительные.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>$(function(){function e(e,r){var a="https://api.stackexchange.com/2.2/questions/48476/answers?page="+e.toString()+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter=!YOKGPOBC5Yad160RQxGLP0r4rL";$.get(a,r)}function r(e){if(e.items.forEach(function(e){var r=e.link,a=e.owner.display_name,i=e.body.match(/<h1\b[^>]*>(\d{4}) - (.*?)<\/h1>/);if(i&&i.length>=3)var h=parseInt(i[1]),u=i[2];h&&u&&n>=h&&h>=t&&(!d.hasOwnProperty(e.owner.user_id)||d[e.owner.user_id]-h>=p)?(d[e.owner.user_id]=h,h==t&&--t,o.hasOwnProperty(h)||(o[h]=[]),o[h].push({language:u,user:a,link:r,score:e.score+(n-h)/2})):s.push(' <a href="'+r+'">'+a+"</a>")}),e.has_more)runQuery(++a,r);else{for(var i=n,h=[];o.hasOwnProperty(i);){for(var u=$("<tr>").append($("<td>").text(i.toString())),l=$("<td>"),c=$("<td>"),g=$("<td>"),f=0;f<o[i].length;f++){var v=o[i][f];l.append(v.language),c.append($("<a>").html(v.user).attr("href",v.link)),g.append(v.score),f+1<o[i].length&&(l.append("<br><br>"),c.append("<br><br>"),g.append("<br><br>"))}u.append(l).append(c).append(g),h.push(u),--i}$("#answers").find("tbody").append(h),s.length>0?$("#invalid").append(s):$("#invalid").remove()}}var a=1,n=2015,t=n-1,p=5,o={},s=[],d={};e(1,r)})</script><style>html *{font-family: Helvetica, Arial, sans-serif;}table{border: 4px solid #a4a; border-collapse: collapse;}th{background-color: #a4a; color: white; padding: 8px;}td{border: 1px solid #a4a; padding: 8px;}div{font-size: 75%;}</style><table id='answers'> <tr> <th>Year</th> <th>Language</th> <th>User (answer link)</th> <th>Score</th> </tr></table><div id='invalid'><br>Invalid Answers:</div>
источник
Ответы:
2013 - Dogescript
Dogescript - это язык, созданный в 2013 году Заком Брюггеманом. Это не более чем синтаксическая замена Javascript, чтобы он читался как внутренние монологи меметического Shiba Inus.
Привет дож
ASCII Art
НОД
источник
s[i]
немного тоже!2015 - Сетчатка
Retina - это язык программирования на основе регулярных выражений, который я написал, чтобы иметь возможность конкурировать в задачах PPCG с ответами только на регулярные выражения, без лишних накладных расходов при вызове регулярного выражения в некотором главном языке. Сетчатка завершена по Тьюрингу. Чтобы доказать это, я реализовал системный решатель с 2 тегами, а также Правило 110 . Он написан на C #, поэтому он поддерживает как .NET-вариант (по умолчанию), так и ECMAScript-вариант (с помощью флага).
Retina может работать в нескольких режимах, но наиболее подходящим для вычислений (и полного по Тьюрингу) является режим замены. В режиме замены вы даете Retina четное количество исходных файлов. Затем они объединяются в пары, причем первая из каждой пары является регулярным выражением, а вторая заменой. Затем они выполняются по порядку, манипулируя вводом шаг за шагом. Регулярному выражению также может предшествовать конфигурация (ограниченная с помощью
`
). Наиболее важная опция (которая делает Retina Turing-complete) заключается в том+
, что Retina применяет замену в цикле, пока результат не перестанет меняться. В следующих примерах я также использую;
, что подавляет вывод на промежуточных этапах.В каждом из следующих представлений каждая строка помещается в отдельный исходный файл. (В качестве альтернативы вы можете использовать новую
-s
опцию и поместить все строки в один файл.) Пустые файлы / строки представлены как<empty>
. Файлы / строки, содержащие один пробел, представлены как<space>
.Объяснения довольно длинные, поэтому я перенес их в конец поста.
Программы
"Привет, мир!" Вариант
ASCII Art N
Это предполагает, что STDIN завершается с новой строки.
НОД
Это требует, чтобы STDIN не заканчивался символом новой строки.
Пояснения
"Привет, мир!" Вариант
Это довольно тривиально. Он не требует ввода (т. Е. Пустой строки), ничего не соответствует и заменяет его на
Retina was made in 2015!
. Можно также заставить это работать для произвольного ввода, заменяя образец,[\s\S]*
например. Это бы отбросило STDIN и заменило бы все это выводом.ASCII Art N
Это имеет довольно много этапов. Идея состоит в том, чтобы преобразовать входные данные в унарные, создать блок N x N из
N
s, а затем «вырезать» два треугольника. Давайте пройдемся по отдельным этапам. Помните, что;
просто подавляет промежуточные выходы, но+
заставляет замену применяться в цикле.Просто: добавьте a
#
к входу. Это будет использоваться в качестве маркера при конвертации в унарный.Это преобразует одну цифру в унарный. Он берет уже преобразованные цифры
(\d*)
и повторяет их 10 раз. Затем он принимает следующую цифру и добавляет соответствующее количество цифр. Фактическое значение цифр на данном этапе не имеет значения. Когда#
достигает конца числа, регулярное выражение больше не совпадает, и преобразование завершено. Например, номер127
будет обработан какгде последняя строка содержит ровно 127 цифр символов.
Два простых этапа, которые избавляются от этого,
#
а затем преобразуют все цифры вN
. В следующем7
примере я буду использовать входные данные . Итак, теперь у нас естьСледующий этап
заменяет каждую
N
на всю строку (помните, что она содержит завершающий символ новой строки), а также удаляет сам конечный символ новой строки. Следовательно, это превращает один ряд в квадратную сетку:Теперь верхний треугольник. Во-первых, мы начинаем с того, что превращаем N в правом нижнем углу в пробел:
Взгляд в будущее гарантирует, что мы модифицируем правильное
N
. Это даетИ сейчас
является регулярным выражением, которое соответствует
N
над или в верхнем левом углу пробела и заменяет его пробелом. Поскольку замена повторяется, это, по сути, заливка, которая превращает 3-й октант из исходного пространства в большее количество пространств:И, наконец, мы повторяем то же самое с нижним треугольником, но используем другой символ, чтобы уже существующие пробелы не вызывали неправильную заливку:
устанавливает семя:
затем
выполняет заливку
И наконец
Превращает их
S
в пространства, и мы сделали:НОД
GCD в унарном языке на самом деле очень тривиально с регулярным выражением. Большая часть этого состоит из десятичного в унарное и унарное в десятичное преобразование. Это можно сделать более компактно, но это не кодекс, так что ...
Эти этапы, по сути, такие же, как и выше, за исключением того, что оба входных числа преобразуются, и результат использует
1
s вместоN
s (не то, что это имеет значение). Так что, если вход был18 24
, то это произвело быВ настоящее время
это все вычисления GCD. Мы сопоставляем общий делитель, фиксируя число
1
s, а затем используя обратные ссылки, чтобы гарантировать, что оба числа могут быть записаны путем повторения этой строки (и ничего больше). Из-за того, что в движке регулярных выражений работает возврат (то есть,.+
это жадный алгоритм), он всегда будет автоматически давать наибольший общий делитель. Поскольку совпадение охватывает всю строку, мы просто напишем первую группу захвата, чтобы получить наш GCD.Наконец, унарное в десятичное преобразование ...
Добавьте маркер
#
, разделитель:
и все цифры в строку. Это необходимо, потому что вы не можете создавать новые символы условно при замене регулярных выражений. Если вам нужна условная замена, вам нужно извлечь символы из самой строки, поэтому мы поместим их туда.Это обратное унарному расширению ранее. Мы находим наибольшее кратное 10, которое вписывается в текущую строку. Затем мы выбираем следующую цифру на основе остатка и делим кратное число на 10, перемещая маркер по цифрам.
И, наконец, просто шаг очистки, чтобы избавиться от маркера, разделителя и вспомогательных цифр.
источник
2013 - Snap !
Snap ! это язык на основе Scratch , сделанный в университете Беркли. Это обновление до Scratch с первоклассными данными и пользовательскими блоками (функциями). Как и в Scratch, он основан не на тексте, а на визуальных «блоках», которые объединяются.
Snap ! , написанный на JavaScript, является преемником BYOB, который был написан на Squeak Smalltalk. Snap ! была бета-версия для общественного потребления в марте 2013 года .
Snap ! на самом деле не эзотерический язык. Он используется как язык программирования для курса AP CS « Красота и радость вычислений» (BJC) в Беркли и других.
Я помог с тестированием и прочим.
Вариант "Hello World"
ASCII Art "N"
Это использует stdlib для некоторых блоков.
Довольно простой цикл здесь. Принимает вход. Затем мы просто складываем все вместе и говорим это (результат для n = 5):
Я позволил себе использовать 2 пробела вместо 1, потому что Snap! не говорит вещи в монопространстве.
НОД
Евклидов алгоритм не очень быстрый, но работает и довольно прост. (Извините, я сделал опечатку в имени блока. Теперь я закрыл вкладку без сохранения. Она просто останется.)
Это определение функции будет затем производить этот блок:
источник
2007 - ЛОЛКОД
История языка
LOLCODE был создан в 2007 году Адамом Линдси, исследователем из Университета Ланкастера. Его синтаксис основан на мемах lolcats, популяризированных Cheezburger, Inc.
"Привет, мир!" Вариант
ASCII Art N
Значения читаются как строки (YARNs) из stdin, используя
GIMMEH
. Их можно преобразовать в числовые (NUMBR), умножив на 1.Значения выводятся в стандартный вывод с помощью
VISIBLE
. По умолчанию добавляется новая строка, но ее можно отключить, добавив восклицательный знак.НОД
SMOOSH
выполняет конкатенацию строк.источник
IM IN YR toilet UPPIN YR butt
Хорошие имена переменныхx1
,x2
и т.д.1982 - PostScript
PostScript - это язык для создания векторной графики и печати.
Adobe была основана в 1982 году, и их первым продуктом был PostScript. Язык использовался в принтерах: принтер интерпретирует команды для создания растрового изображения, которое затем распечатывается на странице. Это было очень распространенным компонентом лазерных принтеров в 1990-х годах. Но очевидно, что он сильно загружает процессор на принтере, и, поскольку компьютерные процессоры стали более мощными, имело больше смысла выполнять растеризацию на компьютере, чем на принтере. PostScript в значительной степени исчез на потребительских принтерах, хотя все еще существует на многих более высококачественных принтерах.
Стандарт, заменивший PostScript, - это малоизвестный формат, называемый PDF.
PostScript вышел из моды к тому времени, когда я начал программировать, но я немного научился, когда учился в университете, как еще один способ создания документов для TeX. Он сильно отличался от других языков программирования, которые я использовал (обратная инфиксная запись, стек, печать на страницу вместо консоли), но было приятно стряхнуть этот старый язык для развлечения.
Поскольку PostScript является языком печати, более целесообразно использовать его для печати чего-либо, а затем отправлять вывод на консоль.
Задание 1
Первые несколько строк настраивают холст для рисования. Затем
moveto
команда говорит PS рисовать в определенной позиции иshow
печатает строку на странице. Обратите внимание, что скобки отмечают строку в PostScript, а не кавычки.Задача 2
Я написал функцию для рисования «ASCII art» N, но функции PostScript не могут получить аргумент. Вместо этого вы помещаете свои аргументы в стек, а затем возвращаете их обратно. Это
/x exch def
линия.Пример: предположим , что стек
8 9 2
. Сначала мы помещаем имя/x
в стек, так что стек есть8 9 2 /x
.exch
Оператор меняет местами два значения стека, так что теперь стек8 9 /x 2
. Затемdef
выскальзывает два верхних значения стека и определяет/x
значение2
. Стек сейчас8 9
.Когда я начал использовать PostScript, меня это немного смутило. Я читал о стеке как о теоретической концепции, но впервые использовал его на практике.
Остальная часть функции - это некоторый код для рисования: начинайте с правого нижнего угла, заполняя строку по порядку слева направо и по диагонали.
Задача 3
Опять же, я использовал форму алгоритма Евклида, но я забыл, что PostScript имеет встроенный оператор по модулю, поэтому мне пришлось написать свой собственный. Это оказалось полезным напоминанием об ограничениях стекового программирования. Моя первая реализация
modulo
была основана на рекурсии:это нормально, пока вы не попытаетесь запустить его, когда
x
он большой иy
маленький (например, 5689 и 2). В стеке может быть только до 250 элементов, поэтому я дул далеко за пределы стека. К сожалению. Я должен был вернуться к чертежной доске на этом.Сам код GCD довольно прост. Но так же, как функции не могут принимать аргументы, они не имеют возвращаемых значений. Вместо этого вы должны поместить результат в стек, где кто-то другой может выложить его позже. Это то, что делают строки
a
andb a gcd
: когда они закончили оценку, они помещают значение в стек.Если вы поместите весь код в документ и распечатаете его, это будет выглядеть так:
источник
2009 - > <>
Вдохновленный Befunge,> <> (Fish) - это двумерный язык на основе эзотерических стеков, т. Е. Поток программ может быть вверх, вниз, влево или вправо. Начальная версия> <> признаки многопоточности , где
[
и]
создала и закончила темы, но для простоты причины этих инструкции были изменены , чтобы создавать и удалять новые стеки соответственно.Текущий официальный переводчик для> <> можно найти здесь . К сожалению, ссылка на старого переводчика на Esolang Wiki не работает.
"Привет, мир!" Вариант
Обратите внимание, что строка записана в обратном направлении -> <> технически не имеет строк, а единственным типом данных является странное сочетание char, int и float.
"
переключает разбор строк, помещая каждый символ в стек, пока не будет выполнено закрытие"
.Затем вторая половина кода увеличивает длину стека
l
, проверяет, равен ли он нулю,?!
и если да, то программа завершается;
. В противном случае указатель инструкции продолжается, выводя вершину стекаo
перед выполнениемbb+0.
, что приводит к телепортации указателя в положение(22, 0)
непосредственно передl
созданием цикла.ASCII Art N
С интервалом для ясности. Вы можете попробовать это в новом онлайн-переводчике здесь и увидеть, как указатель команд вращается - просто не забудьте ввести число в текстовое поле «Начальный стек». Если вы работаете через интерпретатор Python, используйте
-v
флаг для инициализации стека, напримерДля этой программы мы помещаем ввод
n
в регистр&
и нажимаем 0, что мы будем называтьi
«итерациями». Остальная часть программы представляет собой гигантский цикл, который выглядит следующим образом:Затем мы повторяем цикл с самого начала.
Стрелки
^>v<
изменяют направление потока программы, а зеркала/\
отражают направление потока программы.НОД
Вот пример того, как может выглядеть программа> <> для игры в гольф. Еще раз, вы можете попробовать это в онлайн-интерпретаторе (например, введите два значения через запятую в поле «Начальный стек»
111, 87
) или с помощью-v
флага интерпретатора Python, напримерЭта программа использует евклидов алгоритм. Вот GIF, который я подготовил ранее:
Обратите внимание, что> <> является тороидальным, поэтому, когда выполняется нижняя левая
v
инструкция, указатель инструкции опускается вниз, оборачивается и снова появляется сверху.Редактировать: заставив код работать полностью справа налево , @randomra удалось побрить три байта с
Думаю, я не играл в гольф достаточно :)
источник
><>
палиндром.2012 - Элемент
Это язык, который я изобрел в начале 2012 года как простой язык для игры в гольф. Под этим я подразумеваю, что перегрузка операторов практически отсутствует. Операторы также проще и их меньше, чем большинство современных языков для игры в гольф.
Наиболее интересными особенностями этого языка являются его структуры данных. Есть два стека и хеш, которые используются для хранения информации.
M-стек - это основной стек, где выполняются арифметические и большинство других операций. Когда данные вводятся или печатаются, это то, куда они идут или извлекаются.
C-стек является стеком управления. Это где логическая арифметика имеет место. Верхние значения c-стека используются циклами If и While в качестве условия.
Хэш - это место, где хранятся переменные.
;
И~
хранить и извлекать данные из хэша, соответственно.Элемент очень слабо типизированный язык. Он использует способность Perl свободно интерпретировать числа как строки и наоборот.
Пока я в этом, я мог бы также включить всю документацию для языка. Вы можете найти оригинальный переводчик 2012 года, написанный на Perl, прямо здесь . Обновление: я создал более удобную версию, которую вы можете найти прямо здесь .
Задача 1 - Распечатать текст
Одна из самых неудобных частей языка - отсутствие разделителей строк, поэтому в этой строке требуются escape-символы. В
`
конце печатает строку.Задача 2 - ASCII Art N
Здесь вы увидите некоторые манипуляции со стеком. Чтобы облегчить форматирование объяснения, я заменим символ новой строки на
L
и пробел наS
.После некоторой экстремальной игры с этим ответом я нашел 39-байтовое решение, хотя оно намного сложнее.
Задача 3 - GCD
Это стековый метод.
источник
2012 - Юлия
История языка
Джулия была разработана в 2012 году Джеффом Безансоном, Стефаном Карпински и Вирал Шахом, в то время как Джефф учился в Массачусетском технологическом институте (MIT) под руководством профессора Алана Эдельмана. Они были мотивированы стремлением к языку программирования, который был бы открытым, быстрым и динамичным (среди прочего) при сохранении простоты использования в различных приложениях. Продуктом стала Джулия, свежий подход к высокопроизводительным научным вычислениям.
"Привет, мир!" Вариант
Печать на STDOUT в Юлии довольно проста!
ASCII Art N
Код имеет отступ для удобства чтения, но Юлия не накладывает никаких ограничений на пробелы.
НОД
Последняя вещь, перечисленная в функции, возвращается неявно.
источник
1988 - Mathematica
Или я должен назвать это Wolfram Language ?
Задача 0
Создатель Mathematica - Стивен Вольфрам, основатель и генеральный директор Wolfram Research. До разработки Mathematica он был физиком. В физике было огромное количество алгебраических вычислений, поэтому он стал пользователем Macsyma .
Вольфрам получил докторскую степень в 1979 году, когда ему было 20 лет. Он подумал, что ему нужен лучший CAS, чем Macsyma, чтобы заниматься физикой, поэтому он начал писать SMP («Программа символьной манипуляции»). Первая версия SMP была выпущена в 1981 году. SMP была предшественницей Mathematica. Хотя это оказало глубокое влияние на Mathematica, ни один из его кодов никогда не использовался для Mathematica.
В 1986 году Вольфрам решил написать «окончательную вычислительную систему». Он начал писать код в 1986 году и основал Wolfram Research в 1987 году. Наконец, Mathematica 1.0 была выпущена 23 июня 1988 года.
Я не нашел Mathematica 1.0. На самом деле Mathematica 1.0 не имела ни версии для Windows, ни для Linux. Но я нашел Mathematica 2.0 на китайском сайте. Это все еще может быть запущено на Windows XP.
Задание 1
Или просто:
Задача 2
В сегодняшней Mathematica мы можем написать:
Так же, как Юлия и R , это матричное решение. В Mathematica вы можете определить разреженную матрицу, используя сопоставление с образцом.
Однако он
SparseArray
был представлен в Mathematica 5.0, поэтому мы не можем использовать его в Mathematica 1.0.Вот решение, которое работает в Mathematica 1.0:
Мы не можем писать,
f[i_, 1 | i_ | n] = "N"
потому чтоAlternatives
был представлен в Mathematica 2.0.Задача 3
Мы можем просто использовать встроенную функцию:
Или мы можем использовать определение GCD:
Или мы можем использовать LCM , хотя чаще всего LCM вычисляется из GCD:
Или мы можем использовать евклидов алгоритм с сопоставлением с образцом:
Или как анонимная функция:
Все вышеперечисленные функции были введены в Mathematica 1.0.
источник
1999 - XSLT
World Wide Web Consortium (W3C) создал XSLT для преобразования XML в HTML, текст и т.д. Следующие примеры предполагают ввод заключен в
<input>..</input>
тегах.Задание 1
Этот прост. Он соответствует
input
тегу на верхнем уровне и заменяет его желаемым выводом.Задача 2
Этот определяет 2 рекурсивных шаблона,
loop
иspaces
.loop
с параметрамиi
иn
сгенерирует желаемый результатn
, начиная с позицииi
.spaces
с параметромn
будет генерироватьn
пробелы.Задача 3
Вход для этого должен быть в
<input><num>..</num><num>..</num></input>
тегах.Это просто рекурсивный шаблон,
gcd
который использует евклидов алгоритм.источник
2014 - CJam
CJam был создан пользователем PPCG aditsu и был выпущен в апреле 2014 года .
"Привет, мир!" Вариант
CJam автоматически печатает содержимое стека в конце программы
ASCII Art N
Объяснение кода:
Принимает высоту / ширину N в качестве ввода через STDIN. Попробуйте онлайн здесь
НОД
Принимает два числа в качестве ввода через STDIN. Попробуйте онлайн здесь
источник
ri_S*0'NtW'Nta1$*\,Sf*'Nf+..e>N*
современного CJam.1990 - Haskell
Haskell - популярный (или я должен сказать: самый популярный ?) Чисто функциональный язык. Он выделяется из основного потока своей необычной моделью оценки (по умолчанию все лениво или, технически, не строго) и своей системой типов на основе Хиндли-Милнера, которая даже сейчас остается одной из самых мощных.
Задание 1
Задача 2
Демонстрация, распечатайте весь бесконечный список (пока пользователь не прекратит работу или мир не закончится ...)
Конечно, вы можете легко добраться до одного из них, получив доступ только к одному элементу из бесконечного списка:
Задача 3
источник
1972 - ИНТЕРКАЛ
А ты думал, что Фортран и Кобол были странными. Это безумие!
Задание 1
Я не буду пытаться объяснить систему ввода и вывода INTERCAL; Просто прочитайте это и надеюсь, что вы не умрете.
Задача 2
Боже мой Это заняло у меня немного времени, чтобы понять. Номера этикеток - беспорядок и поэтому отражают это. Я не буду пытаться объяснить это, если кто-то не спросит.
Задача 3
Это немного проще. Из-за ... странности INTERCAL, вы должны ввести цифры, как это:
Например, чтобы получить GCD 42 и 16, я бы ввел:
Он также печатает число римскими цифрами ... потому что это INTERCAL для вас!
источник
PLEASE GIVE UP
, Я сделал это уже .-.1967 - APL
В 1957 году в Гарвардском университете Кен Айверсон начал разработку математической записи для манипулирования массивами. В 1960-х его нотация была превращена в язык программирования в IBM. Первая частичная реализация была создана в 1963 году, и она даже использовалась в старшей школе для обучения студентов трансцендентным функциям. Полная, пригодная для использования реализация должна была ждать до 1965 года. В течение двух лет она использовалась только внутренне IBM. В 1967 году IBM выпустила публичный интерпретатор APL, работавший на компьютере IBM 1130, который был закончен в 1966 году. Вы можете понять, как трудно выбрать год для этого, однако, я думаю, что это должен быть 1967 год, поскольку это первый год, полная реализация была сделана доступной для общественности. Если кто-то действительно не согласен, я могу это изменить.
Исходный код для APL \ 360, онлайн , как и эмулятор. Это то, что я использовал для проверки этих примеров. Он датируется 1967 годом, и наряду с APL \ 1130 (для вышеупомянутого IBM 1130) это более или менее настоящий оригинал. Как и следовало ожидать, это очень примитивно. В нем отсутствует поддержка таких тонкостей, как строчные буквы, любые операторы работают только со встроенными функциями, а набор встроенных функций очень редок (в частности,
∨
есть толькоor
и не удваивается, какgcd
). Оригинальное полное описание доступно здесь , однако я заметил, что версия, которую я имел, даже не полная в отношении этого документа, которой нет⍎
среди других.Я предоставил программы как в формате Unicode (чтобы вы могли их прочитать), так и в оригинальной кодировке (чтобы вы могли вырезать и вставить их в окно APL эмулятора).
Невероятно, но эти программы работают правильно без каких-либо изменений (кроме кодировки) в современных версиях Dyalog, NARS2000 и GNU APL. Так что я думаю, что нашел способ написать переносной APL: просто притворись, что это 1967 год!
Задание 1:
Unicode:
APL \ 360:
Задача 2:
Unicode:
APL \ 360:
Задача 3:
Я решил это стандартным рекурсивным способом. Теоретически, вы могли бы сделать что-то умное и ориентированное на массив, как ответ J; на практике, однако, он использует O (N) памяти и быстро перегружает аппаратное и программное обеспечение эпохи Flower-Power.
Unicode:
APL \ 360:
источник
1996 - Окамль
Ждал больше суток, чтобы кто-нибудь заполнил 1996 год, чтобы я мог заполнить Ruby. Ну, почему бы не изучить OCaml тогда, похоже на haskell ...
Привет, мир
ASCII
Изменчивые строки!
НОД
Нет
==
и инфиксmod
, это милоисточник
2005 - Прелюдия
Prelude - очень забавный язык, исходный код которого состоит из нескольких «голосов», которые исполняются параллельно и в которых мне действительно нравится решать проблемы . Он предназначен для представления ASCII его родного языка Fugue , который фактически принимает файлы .midi в качестве исходного кода и кодирует инструкции, найденные в Prelude, в качестве интервалов в мелодиях голосов.
Прелюдия довольно минималистична, но Тьюринг завершен (при условии, что вы используете как минимум 2 голоса). Как я уже сказал, голоса (строки кода) выполняются одновременно, столбец за столбцом. Каждый голос работает в своем собственном стеке, который инициализируется бесконечным числом нулей. Prelude поддерживает следующие инструкции:
Некоторые дополнительные заметки:
^
верхний голос копирует с нижнего голоса (и наоборот).?
и!
в одном столбце выполняются сверху вниз.?
и!
читать и писать символы с соответствующим кодом символа. Однако интерпретатор Python также имеет в своем коде переключатель для печати самих чисел. В целях тестирования я на самом деле использую модифицированную версию, которая также может читать цифры вместо символов. Но консенсус здесь заключается в том, что числовой ввод / вывод фактически может быть задан в виде байтовых значений, поэтому эти модификации не являются необходимыми для создания допустимых программ, работающих с числами.(
и)
не должны быть на одном голосе. Голос, используемый для условия, всегда тот, где(
появляется. Следовательно, вертикальное положение)
совершенно не имеет значения.(
, выполняется только один раз перед началом цикла и независимо от того, введен ли цикл. Точно так же любая инструкция в том же столбце, что и a)
, выполняется в конце каждой итерации, независимо от того, будет ли цикл завершен после этой итерации.Сначала я покажу вам три программы без особых комментариев. Вы можете найти подробные объяснения ниже.
Программы
"Привет, мир!" Вариант
Если вы используете интерпретатор Python, убедитесь в этом
NUMERIC_OUTPUT = False
.ASCII Art N
Для удобства использования эта программа получает преимущества от чтения ввода в виде чисел, но вывод не должен быть числовым. Так что если вы используете модифицированный интерпретатор Python, установите
НОД
Это лучше всего использовать со всеми числовыми входами / выходами, т.е.
Пояснения
"Привет, мир!" Вариант
Это довольно просто. Я использую 3 голоса, чтобы последовательно генерировать коды символов для всех символов в
Prelude was made in 2005!
. Я начинаю с вычислений8 + 9*8 = 80
, которые представляют собой код символаP
:После этого я в основном просто копирую предыдущий код символа и добавляю или вычитаю разницу к следующему. Вот код, но с каждым
!
заменяется символом, который печатается (и_
для пробелов и%
для цифр):Финал
55+!
печатает завершающий перевод строки только потому, что он лучше.Как примечание, количество голосов для этой задачи довольно произвольно, но 3 довольно удобно, потому что это наибольшее число, при котором каждый голос может напрямую получить доступ к голосу друг друга.
ASCII Art N
С 5 голосами, это определенно одна из самых сложных программ, которые я написал до сих пор. Голоса примерно имеют следующие цели:
N-1
для использования во внутреннем цикле.32
позволяет удобно печатать пробелы.78
для удобной печатиN
с.Давайте рассмотрим код по частям. Во-первых, я создаю
32
как-4 + 9*4
и78
как6 + 9*8
:Теперь я печатаю один
N
(потому что он всегда нужен) во время чтения вводаN
и сохраненияN-1
иN-2
первых двух голосов:Далее есть условная петля
N-1
. В конце цикла второй голос всегда уменьшается до0
, и цикл завершается после первой итерации. Так что по сути, это толькоif(N > 1){...}
. После цикла мы печатаем один завершающий перевод строки. Напомним, что теперь у нас есть следующая структура:Внутри этого условия мы сначала
N-2
пробелы и одинN
для завершения первого ряда, и мы также сохраняемN-1
первый голос для будущего использования:Теперь настоящее мясо кода. Во-первых, есть внешний цикл, который печатает
N-1
строки. Для каждой строки мы сначала печатаем новую строку иN
. Затем мы зациклимN-2
время, печатая либо пробелы, либоN
s (подробнее об этом позже). И наконец мы печатаем другоеN
:Наконец, самое интересное: печать каждой строки (и получение
N
правильной позиции ). На самом деле в Prelude нет if / else, поэтому я должен создать его сам, используя два цикла для разных голосов. Условие может быть легко получено путем вычитания переменной внутреннего и внешнего цикла - мы получаем,0
если хотим печатать,N
и что-то ненулевое, если хотим печатать пробел.Основная идея if / else в Prelude состоит в том, чтобы поставить цикл после соответствующего значения - кода «if» (или отличного от нуля) и немедленно выйти из него, нажав a
0
. В другом голосе вы сохраняете ненулевое значение и еще один цикл после цикла «если». Во время цикла «if» вы ставите ноль поверх этого другого голоса, чтобы предотвратить выполнение «else». Существует некоторая гибкость в том, помещаете ли вы нулевые значения поверх ненулевых значений или просто отбрасываете ненулевое значение, если ниже ноль, но это общая идея. Возможно, вам также придется выполнить некоторую очистку после этого, если вы хотите продолжать использовать соответствующий голос. Вот как выглядит код:Вот и все!
НОД
Это «просто» итеративная реализация евклидова алгоритма. Но модуль в Prelude немного раздражает, в основном потому, что вы не можете легко проверить, является ли число положительным или отрицательным. Этот код делает использование сигнум реализации я написал некоторое время назад . Т.е. большая часть кода просто превращает число в
-1
,0
или1
. Это можно легко превратить в условие для положительных или отрицательных чисел путем сложения или вычитания1
.Так что на этот раз у нас четыре голоса. Первый голос просто отслеживает
b
и содержит основное условие завершения (т. Е. Цикл завершается, когдаb
становится0
). Второй голос содержитa
и с помощью голосов три и четыре вычисленияa % b
, прежде чем поменять местами результат с предыдущимb
. Наконец,!
печатаетa
когдаb == 0
.Давайте сначала посмотрим на часть signum :
Номер ввода
n
находится на первом из этих голосов (второй голос в полной программе). Результат закончится на нижнем голосе. Ожидается, что два других голоса будут пустыми (то есть заполнены нулями). Обратите внимание: еслиn == 0
оба цикла пропускаются, а нижний голос все еще содержит то0
, что мы хотим.Если
n
не ноль, вводится первый маленький цикл. Мы нажимаем ноль, чтобы немедленно выйти из него, помещаем две копииn
в средний голос и1
в нижний голос. Теперь основная идея состоит в том, чтобы увеличивать одну из копийn
, уменьшая другую,n
пока одна из них не достигнет нуля. При этом1
нижний голос постоянно переворачивает свой знак (что легко сделать, вычтя его из-0
под стека). Это настроено так, что когда одно из чисел достигает нуля, нижний голос будет содержать правильный знак.Теперь по модулю реализуется вычитание
b
отa
до отрицательного результата. Когда это произойдет, мы добавим ещеb
раз. Вот это немного:Обратите внимание на конструкцию if / else внизу, которая похожа на ту, которую я использовал для Задачи 2.
источник
2007 - Царапина
Scratch - это язык, созданный MIT для образовательных целей. Я был очень связан с этим в течение 5 лет; Подробнее об этом позже.
Все это можно посмотреть здесь .
Я очень спешу прямо сейчас и объясню фрагменты позже. Надеюсь, они все же говорят сами за себя.
Задание 1
Задача 2
Задача 3
источник
1972 - С
Мы все знаем о Си, не так ли? C был создан в Bell Labs вместе с Unix. Unix был в основном написан на C. Все современные производные Unix все еще в основном написаны на C. Синтаксис C повлиял на многие, многие языки программирования. Это, вероятно, самый старый язык программирования, который все еще широко используется для новых разработок.
Сам C является потомком B, который, я надеюсь, также окажется в этом списке. Не было никакого языка программирования 'A': B - это вариант BCPL, который, в свою очередь, является сокращенным CPL. Ни один из этих языков никогда не был очень популярен. Тем не менее, BCPL был языком, на котором была написана первая программа «Hello World». Другим интересным фактом является то, что у B были
/* */
и//
комментарии и комментарии, но C отбросил//
комментарии. Позже они были вновь введены в C со стандартом C99.Здесь C-программы тестировались на C-компиляторе Unix V5 с 1974 года. Это был самый старый C-компилятор, который я смог найти и приступить к работе, и эти программы не будут компилироваться на современном C-компиляторе. (Одно из внесенных изменений заключается в том, что операторы мутации, такие как
+=
раньше, были написаны=+
.)#include <
...>
еще не существовало. Ни один не сделал большую часть стандартной библиотеки. Я должен был написать свой собственныйatoi
. Я просмотрел некоторый исходный код V5, чтобы выяснить, какие вещи были разрешены, а какие нет. Версия, которую я использовал, была первой, чтобы включитьstruct
s, но так как я не использовал их, и синтаксис, кажется, не сильно изменился до V7 (как K & R C), это могло бы работать и с более ранними версиями.Я приложил все усилия, чтобы написать свой код в том же стиле, который использует исходный код V5. (Не то чтобы это ужасно непротиворечиво.)
Посмотрите здесь ссылки на Unix V5, эмулятор, а также инструкции по получению его работы на современном компьютере.
Задание 1
Задача 2
Задача 3
источник
cat > file.c
. (Конец с Ctrl-D, как всегда). Кроме того , C изменился меньше , чем вы могли бы подумать: если вы своп=*
и=+
вatoi
функциях для современных эквивалентов*=
и+=
, современный GCC компилирует их просто отлично , и они бегут, тоже. Вряд ли каких-либо предупреждений, даже.2009 - Идрис
Idris - это чисто функциональный язык с зависимой типизацией, который подчеркивает, что фактически может использоваться практически для реальных приложений, кроме того, что предлагает чрезвычайно строгие возможности проверки, которые достижимы с зависимыми типами.
Задание 1
Задача 2
Это не программа, а просто функция (точнее, зависимое значение ), производящая искомую букву N в виде двумерного массива.
Задача 3
Обратите внимание, что мне пришлось выбрать имя,
gcd'
потому что, какgcd
оно уже определено в прелюдии Idris.источник
:
и::
, и изменены_
вZ
.Z
на самом деле конструктор0 : Nat
. Подчеркивание используется в Идрисе так же, как в Хаскеле.:)
2014 - Pyth
Поскольку у нас есть CJam, у нас также может быть Pyth для полноты :)
Pyth - это язык игры в гольф от @isaacg, который составлен из Python. Он примечателен процедурностью и использованием префиксных обозначений. Pyth впервые появился около июня 2014 года .
"Привет, мир!" Вариант
Обратите внимание на отсутствие закрывающей кавычки, которая является необязательной, если программа Pyth заканчивается строкой.
ASCII Art N
Попробуйте онлайн . Эквивалент Python:
Или расширенный (первая и третья строки неявны):
НОД
Эта программа использует евклидов алгоритм и принимает два числа, разделенных новой строкой. Попробуйте онлайн .
i.uQ
еще короче, если мы используем встроенный для GCD. Это эквивалентноprint(gcd(*eval(input())))
(принимая два числа через запятую в качестве входных данных).источник
1964 - Дартмутский бейсик
BASIC - это семейство языков программирования высокого уровня общего назначения, философия дизайна которых подчеркивает простоту использования. В 1964 году Джон Дж. Кемени и Томас Е. Курц разработали оригинальный язык BASIC в Дартмутском колледже в Нью-Гемпшире. Они хотели, чтобы студенты в других областях, помимо естественных наук и математики, могли использовать компьютеры.
Я смотрю на это руководство по бейсику 1964 года и на эмулятор Darthmouth Time Sharing System, на котором он работал. Сервер все еще работает, но, к сожалению, регистрация учетной записи кажется невозможной. Пока эти программы теоретически должны работать:
Задание 1
Задача 2
Вывод что-то вроде:
Обратите внимание, как ввод вводится как часть программы (
70 DATA 5
);READ
путь инструкции в верхней части извлекает данные оттуда. Конкатенация строк отсутствует, но в разделе 3.1 руководства описано, какPRINT
результаты записываются в табличные «зоны» на выходе.Задача 3
Медленная версия алгоритма Евклида:
Выведение:
источник
2010 - WTFZOMFG
WTFZOMFG - это эзотерические языки, основанные на Brainfuck. Это было сделано Джеем Сонгдалем в 2010 году. «WTFZOMFG» - это сокращение от «Что это за функция? ,
Вот компилятор для * nix систем .
Задание 1
Задача 2
Объяснение:
Сожалею. Я не умею писать объяснения.
Задача 3
Евклидов алгоритм WTFZOMFG не имеет команды для мода, поэтому я должен использовать
d
(делить),m
(умножить) иs
(вычитать).источник
2009 - Go
Go - это язык программирования, разработанный Google. Разработка началась в 2007 году, но Go был объявлен в ноябре 2009 года.
Go - это статически типизированный язык, на который влияет C, который подчеркивает лаконичность, простоту и безопасность.
Задание 1:
Первая строка объявляет пакет кода. Даже простой пример, когда печать одной строки должна быть частью одной упаковки. И исполняемый файл всегда вызывается
main
.Задача 2:
Go имеет довольно краткое объявление переменной (так
i := 0
же, какvar i int = 0
), и компилятор определяет тип. Обычно эта функция чаще встречается в динамических языках. Используя эту короткую запись, также очень легко назначать функции для переменных (f := func(x int) int {/* Code */}
) и создавать замыкания.Задача 3:
Здесь вы можете увидеть
a, b = b, a%b
синтаксис, который действительно хорош. Я не знаю точного имени, но в Python это называется распаковка кортежей. Используя тот же способ, вы можете вернуть несколько значений из функции (func f() (int, string) { return 42, "Hallo"}
).Еще одна вещь, происходящая в этом коде - это цикл. Цикл for - единственный цикл в Go. Циклы while или do-while-loop не существуют. Но вы можете легко создать эквивалент для цикла while
for condition {}
или бесконечного циклаfor {}
.источник
1991 - Питон
История языка
В конце 1980-х Гвидо ван Россум начал разрабатывать Python как хобби. Его название происходит от летающего цирка Монти Пайтона, британского телешоу, поклонником которого Россум. Первое внедрение Python началось в 1989 году и было выпущено в 1991 году. За последние годы его популярность возросла, и он стал языком выбора для многих вводных курсов по информатике.
"Привет, мир!" Вариант
Обратите внимание на круглые скобки вокруг ввода в
print
. Хотя этот синтаксис работает в Python 2, обычно в Python 2 эти скобки опускаются. Однако они требуются в Python 3. Как предполагает Zach Gates, круглые скобки используются повсеместно, чтобы гарантировать, что код, представленный здесь, будет работать в разных версиях.ASCII Art N
Функции определены с помощью
def
. Конкатенация строк выполняется с использованием+
и повторения строк с*
.НОД
Обратите внимание, что Python требует структурированного пробела.
источник
1968 - Алгол 68
Algol 68 был определен рабочей группой IFIP 2.1 как преемник Algol 60.
Это язык, ориентированный на выражения, в котором все имеет ценность. Он также ортогональн, в котором вы можете использовать любую конструкцию любым способом. Это означает, что выражения могут быть, например, в RHS и LHS присвоения.
Все управляющие структуры имеют сокращенную форму, а также длинную форму с использованием выражений. Это также позволяет определения операторов.
Цели языка цитируются как:
Эти программы были протестированы с помощью интерпретатора Algol 68 Genie , который является полной реализацией языка.
Некоторые особенности, которые современные программисты могут найти разными, заключаются в том, что пустые операторы не допускаются. Вы не можете просто добавить
;
везде. Вы должны использовать этоSKIP
утверждение, если хотите явно ничего не иметь. Это также позволило очень легко кодировать параллельные программы. Алгол 68 также, в частности, использовал обратные ключевые слова в качестве терминаторов, таких как esac , od , fi и т. Д.Язык имел представление, используемое для написания кода, который использовал много шрифтов, представляющих ключевые слова, выделенные жирным шрифтом , и идентификаторы, выделенные курсивом , например. В то время, и, вероятно, до сих пор, ни один компилятор не реализовал эту функцию дизайна. Язык допускает несколько разных конкретных представлений программ, использующих режимы обрезки . Это позволило программам быть подготовленными с использованием ограниченных наборов символов, которые можно было найти в компьютерах в 1960-х годах. Рассмотрим короткий фрагмент программы, который будет представлен в виде:
Это может быть подготовлено для компилятора в режиме простого обрезания как:
В режиме точечного обтекания это будет:
В случае режима обрезки это будет:
Мне очень нравится этот язык, так как я работал над одной из реализаций компилятора, а также программировал на нем исключительно много лет.
Задание 1
Здесь следует отметить двойные скобки. Это связано с тем, что print - это функция, которая принимает единственный аргумент, который является массивом переменной длины объединения всех типов. Внутренние скобки - это конструктор массива. Вот как полиморфизм обрабатывается в этом строго типизированном языке.
В случае стропинга:
Задача 2
В случае стропинга:
Задача 3
В случае стропинга:
источник
1962 - СНОБОЛ
«Стринг-ориентированный и символический язык». Сначала, по-видимому, он назывался «интерпретатор символических выражений», «SEXI», который затем нужно было изменить, чтобы не дать покрасневшим ботаникам эпохи 1960-х при представлении их работы. Правдивая история.
Это был один из первых языков, который мог иметь дело со строками и шаблонами изначально. Действительно, первая версия SNOBOL имела строку как единственный тип данных. Математика была тогда сделана, анализируя. Первоначальная реализация была сделана на IBM 7090. Кажется, она давно прошла, по крайней мере, я не смог ее найти. Что я нашел, так это оригинальную статью, описывающую это, а также интерпретатор SNOBOL3 на Java, который может работать на современном компьютере .
Первый SNOBOL имел в основном только сопоставление с образцом и базовую арифметику. SNOBOL 3 затем добавил функции и изменил ввод / вывод, но в остальном, похоже, остался обратно совместимым. SNOBOL 4 изменил синтаксис, и оттуда он превратился в Icon , который поддерживает сопоставление с образцом, но в остальном выглядит почти как «нормальный» язык программирования.
В написанных мною программах используются только функциональные возможности, описанные в оригинальной статье, поэтому они должны работать с исходным SNOBOL, за исключением ввода-вывода, который я сделал в стиле SNOBOL3, чтобы интерпретатор Java мог их запускать. Из статьи видно, что различие заключается в том, что SNOBOL1 использует сопоставление с шаблоном со специальной
SYS
переменной, тогда как SNOBOL3 использует входные и выходные переменные:SYS .READ *DATA*
DATA = SYSPPT
SYS .PRINT 'A STRING' AND VARIABLES
SYSPOT = 'A STRING' AND VARIABLES
Сделав эти замены, вы получите «настоящий» SNOBOL 1. Конечно, тогда вы не сможете его запустить.
Задание 1
Задача 2
Это показывает математику, обработку строк и управление потоком. SNOBOL3 имеет полезные функции, такие как
EQ
проверка равенства; оригинальный СНОБОЛ не сделал, поэтому я не использовал их.Задача 3
Во-первых, скучный. Единственное, что следует отметить, это проверка меньше, чем, точно показывающая, как на самом деле был ориентированный на строки SNOBOL:
(B - A) '-'
означает «содержит ли результат BA минус?». SNOBOL3 тоже можетLE(B,A)
, а SNOBOL 1 - нет (по крайней мере, в статье это не упоминается).Конечно, когда у вас есть язык, полностью основанный на строках и сопоставлении с образцом, было бы стыдно не использовать сопоставление и замену образца. Таким образом, вот одна из тех унарных основанных GCD, включая процедуры для преобразования в унарные и из них.
источник
2012 - TypeScript
TypeScript - это бесплатный язык программирования с открытым исходным кодом, разработанный и поддерживаемый Microsoft.
Основная цель: любой браузер. Любой хост. Любая ОС. Открытый исходный код. Выпущена в октябре 2012
Привет TypeScript
ASCII Art
НОД
попробуйте это онлайн , и показ этого.
источник
2011 - Дарт
Dart - это язык программирования с открытым исходным кодом, разработанный Google, который разработан в качестве замены Javascript (хотя он компилируется в javascript). Он был представлен Google в 2011 году во время конференции GOTO.
"Привет, мир!" Вариант:
ASCII Art N:
Метод грубой силы работает с 0 (n²), но это не должно иметь большого значения, если вы не используете гигантское число.
НОД
простой метод Евклида, перенесенный из Snap! пример выше.
источник
2010 - ржавчина
Rust - это универсальный мультипарадигмальный скомпилированный язык программирования, разработанный Mozilla Research. Он разработан, чтобы быть «безопасным, параллельным, практическим языком», поддерживающим чисто функциональный, конкурентно-действующий, императивно-процедурный и объектно-ориентированный стили. Википедия
Задание 1
Task2
Объяснение:
заботится о печати только по вертикали (слева и справа
|
) и по диагонали (\
)Задача 3
простая реализация Euclidean_algorithm
источник
2015 - Маффин MC
Muffin MC - полный по Тьюрингу, забавный (но серьезный), функциональный и минималистичный макроязык, написанный Франком Порчером ( http://franckys.com ) в середине февраля 2015 года из-за необходимости в качестве (быстрого) инструмента для расширения возможностей электронная таблица, которая будет использоваться как единственный интерфейсный контроллер для пилотирования и управления всеми операциями, связанными с инвентарем, связанными с торговым сайтом в Prestashop для нового таитянского модного бренда: Mutiny Tahiti ( http://mutinytahiti.com - скоро будет запущен).
Muffin MC является аббревиатурой MU крошечного F Функционального F lexible В линии M Acro C ommand языка.
Чтобы удовлетворить наши требования, основные функции Muffin MC были разработаны на основе гибких и эффективных встроенных семантических конструкций первого класса, таких как итераторы , ленивые вычисления , мультифункциональные функции , строковый продукт .
Muffin MC берет свое начало в (прагматическом) функциональном программировании, FLisp и Perl. Он полностью поддерживает рекурсивность (без какой-либо оптимизации), динамически типизирован и динамически ограничен (мелкое связывание). Он предлагает своим пользователям только одну структуру данных, кроме основных типов данных атомов (атомы, строки, цифры): списки!
Muffin MC семантика списка (вид) заимствует на семантике набора мощности , то есть:
Чтобы с этим смириться, может помочь следующее:
Таким образом, доступ к пустому элементу списка приводит к пустому списку, а не к ошибке! Действительно, Muffin MC старается выбросить как можно меньше ошибок, расширяя таким образом семантику многих традиционных операций.
Задание 1
#(...)
макрокоманда Muffin MC для применения функции в списке непроверенных аргументов, здесь встроенная функцияsay
, заимствованная из Perl.#(say 1 2 3 ...)
функционально идентиченmap {say $_} (1,2,3,...)
Задача 2
Определите функцию
ascii-art()
:Ascii-art()
Кратчайшая рабочая форма (88 байт):=(var val...)
макрокоманда Muffin MC для определения переменной или ее переназначения.$(var)
макрокоманда Muffin MC для доступа к значению переменной Он естественно принимает форму$(v1 v2 ...)
для доступа ко многим переменным одновременно.=(* var1 val1 var2 val2 ...)
является расширением макрокоманды Muffin MC=(...)
для работы с параллельными назначениями.Переменные
_1, _2
, ... динамически ограничены (механизм поверхностного связывания) и автоматически устанавливаются для привязки к аргументам функции. Заимствованные из Perl5, системные переменные#
(количество аргументов) и@
(список аргументов) также устанавливаются автоматически.Функции - это просто переменные, связанные с любым количеством операторов MC Muffin .
Это интересное решение происходит из сочетания двух естественных встроенных функций Muffin MC :
Макрокоманда Muffin MC
I(...)
для определения циклических итераторов, которые впоследствии используются с функциональной формой#(my-iterator want-number-of-values)
,Сдобы MC -струнной продукт конструкция, расширение естественной переменной интерполяции, который, принимая любую строку
"F1 F2 F3..."
, где F я s являются либо булочка MC строковые литералы или булочка MC макрокоманды (ака функциональные формы), будет производить столько же строк , как дается произведение кардинал (F1) х кардинал (F2) х ....Например, если задана переменная xa, которая содержит 2 значения, говорит a и b, а y, а другая переменная, которая содержит 3 значения, говорит, 1 2 3, то при вычислении строки
"x=$(x) y=$(y))"
будет получено 6 различных значений, а именно в таком порядке:Это одна из самых желанных функций проекта MUTINY, для которой был разработан Muffin MC .
Запустить его !
Как это работает
Наш алгоритм основан на следующем:
Учитывая вызов ascii-art (n), {n = 2p + 1 | p integer, p> = 0}, искусство для генерации содержит n строк из n символов, среди которых два, самый левый и самый правый, являются фиксированными и всегда одинаковыми: «N». Это позволяет уменьшить проблему при создании только средних струн. Например, при n = 5 мы бы пропустили 5 следующих средних строк, каждая из которых состоит из n-2 символов (мы заменили пробел на '_' для лучшей визуализации):
Такие средние струны можно легко получить, циклически повторяя последовательность из 4 элементов
('_' '_' '_' 'N')
в 5 группах по 3; При заданном n входе функции такая последовательность состоит из n-2 символов'_'
, за которыми следует символ'N'
. Для циклического перемещения по этой последовательности ничего не требуется, кроме как встраивать последовательность во встроенный итератор Muffin MCI(sequence)
(итератор, который постоянно циклически повторяет свою начальную последовательность значений).Затем мы просто создаем средние строки длиной n-2, запрашивая у нашего итератора следующие n-2 значения (n - 2 символа), которые объединяются для получения ожидаемой средней строки.
N средних строк получают, повторяя n раз вышеописанный процесс, используя карту для сбора n результатов (n строк из n-2 символов).
Мы используем еще один мощный сдобы MC встроенный в конструкцию, а именно строку продукта , чтобы получить окончательные строки п:
"N#(map...)N"
.Вот и все !
Задача 3
Определите функцию
gcd()
:gcd()
«s реальная кратчайшая форма (37 байт - 2bytes усиление благодаря Rodolvertice)Запустить его !
дает 9.
Вот и все.
Спасибо за хорошую игру и, возможно, за ваш интерес. Язык доступен для любого, кто хотел бы поиграть, использовать его или даже расширить его. Просто попросите об этом, и я буду рад отправить его.
ура
Franck
PS. Текущая реализация Muffin MC находится в Perl5. Исходный код содержит около 2000 строк современного Perl, включая комментарии, и поставляется в комплекте с нерегрессионным набором тестов, который отлично подходит для изучения практических конструкций и семантики Muffin MC .
источник