Рубрика «ненормальное программирование» - 108

Приветствую! %username, ты наверняка слышал про такой язык как tcl и его графический тулкит tk. Язык отличается особой гибкостью (на мой скромный взгляд). Пока нет много времени написать об «облачной» разработке, решил написать мини-статью/мини-урок про одну из возможностей замечательного языка tcl — словарях ( причем, их я не могу вспомнить по книге «Практическое программирование на Tcl/TK», быть может просто читал старую версию). Наиболее полное описание данного типа данных, %username, ты можешь найти по ссылкe.
Читать полностью »

image

Я давно занимаюсь учетной методологией – без малого двадцать лет. Началось с попыток преодолеть ошибки бухгалтерской методологии, которые своей несуразностью мозолили глаза, а закончилось созданием дисциплины под названием экаунтология, включающей в себя, в качестве одного из разделов, теорию компьютерного учета.

Позвольте в рамках обучающего курса по экаунтологии предложить несколько правил компьютерного учета, а чтобы они не выглядели слишком элементарными, привести примеры их злокозненного нарушения в бухгалтерской практике. На Хабре много специалистов, которым доводилось автоматизировать бухгалтерию, – надеюсь, «чудеса» бухгалтерской методологии покажутся им небезынтересными. Должны же люди осознавать, насколько устаревшую методологию они автоматизируют?
Читать полностью »

Если кто-то ещё не знает, что такое хвостовая рекурсия, вот простой пример метода, складывающего в лоб натуральные числа от 1 до n (n≥0):

function add(n,acc) {
  if(n===0) return acc;
  return add(n-1,acc+n);
}

Изначально функция вызывается с параметром acc=0. В случае, если n не равно нулю, метод вызывает сам себя с другими параметрами и возвращает результат. Компилятор (или интерпретатор, или виртуальная машина) могут понять, что текущий вызов функции в стеке уже не нужен, стереть его и заменить следующим вызовом. Таким образом, рекурсия не приводит к разрастанию стека. Строго говоря, хвостовой вызов не обязан обращаться к текущей функции: вызов любой другой тоже может быть хвостовым. Главное условие: вызов функции и возврат её результата должны быть последними действиями в текущей функции. К примеру, в такой реализации метода хвостовой рекурсии нет, так как после вызова происходит ещё сложение:

function add(n) {
  if(n===0) return 0;
  return n+add(n-1);
}

По ряду причин хвостовая рекурсия в JavaScript не поддерживается (обсуждение на эту тему есть на StackOverflow). Поэтому вызов вроде add(100000,0) завершится исключением. На Хабре предпринимались попытки решить эту проблему через setTimeout, но это выглядит не очень честно и не очень красиво. Более изящное решение для языка Python было предложено с использованием «трамплина». Похожий подход для JavaScript рассмотрен здесь. Но мне захотелось, чтобы работало быстро и чтобы функцию можно было записать прямо как в примере выше. Посмотрим, что можно сделать.
Читать полностью »

Несколько дней назад на xkcd.com был опубликован комикс о неэффективных методах сортировки. Alt-текст к нему рассказывал о сортировке методом StackSort, который заключается в том, чтобы скачать со StackOverflow блоки кода, которые можно найти по запросу «сортировать список» и запускать один за другим, пока не найдётся работоспособный вариант. Бред? Ещё бы не бред! Встречайте на Гитхабе реализацию StackSort на JavaScript.
Читать полностью »

image

Вступление

Добрый день, дорогой хабр!
Один из моих знакомых, с которым я работаю, часто использует сервис Clip2Net. Это удобно: делаешь скриншот, и он автоматически загружается в сеть, а ссылочка сразу идет в буфер обмена. И вот слал он мне скриншоты, слал, пока я не заметил одну интересную вещь. Оказалось, ссылки имели нечто общее, почти неуловимое глазу:

clip2net.com/s/2U4cw
clip2net.com/s/2U4cx
clip2net.com/s/2U4bA

А вы заметили приятную плюшку? Исходный код парсера картинок + разбор составляющих под катом.
Читать полностью »

Хак поиска кратчайшего пути в StarCraft

Один из ведущих разработчиков Warcraft и Starcraft Патрик Вайат периодически публикует воспоминания о своей работе в компании Blizzard в 90-е годы. Очень интересно посмотреть изнутри на процесс разработки игр, которые стали впоследствии культовыми. В последней заметке Патрик поведал замечательную историю, как пришлось впопыхах исправлять баги в StarCraft перед выпуском игры и что из этого получилось.
Читать полностью »

В компании Intel разрабатывают не только ПО для «внешних» потребителей — пишутся и программы, которые используются только внутри Intel. Среди них довольно много средств для численного моделирования различных физических процессов, протекающих при изготовлении процессоров — ведь именно последние и являются основной продукцией Интела. В этих программах, конечно, широко используются различные методы вычислительной математики и физики.
Вот некоторое время назад мне понадобилось программно решать одно уравнение методом Ньютона. Казалось бы, все просто, но для этого надо уметь вычислять производную левой части уравнения. Эта левая часть у меня была довольно сложная — даже просто вычисление ее значений в программе было разбросано по нескольким функциям, — и перспектива вычислять производную на бумажке меня не радовала. Перспектива воспользоваться каким-нибудь пакетом символьных вычислений меня радовала не больше — перенабирать все формулы, содержащие к тому же несколько частных случаев, далеко не очень приятно. Вариант вычислять производную численно как разность значений функции в двух соседних точках, деленную на соответствующее приращение независимой переменной, чреват потерей точности и вообще необходимостью подбирать подходящее приращение этой переменной.
Подумав некоторое время, я применил следующий подход. Потом я узнал, что он называется «автоматические дифференцирование», для него существует довольно обширная литература на английском, и ряд библиотек — но на русском я нашел только некоторые научные статьи про применение этого метода, и пост на Хабрахабре, в котором все рассказывается через смесь дуальных и комплексных чисел, и понять который с ходу, на мой взгляд, тяжело. С другой стороны, для понимания и практического применения автоматического дифференцирования не нужны никакие дуальные числа, и этот подход я тут и изложу.
Читать полностью »

Язык 4DL был изобретён в 2001 г. автором Cliff L. Biffle. Как он сам объяснил, придумал он его во-первых, потому, что до этого языков с четырехмерными программами не существовало, а во-вторых, потому что четырёхмерное пространство довольно сложно для понимания, и надо же дать людям возможность потренировать мозги.

Русская Википедия относит этот язык к семейству «фунгеоидных». Это языки, ведущие свой род от языка Befunge, программы в котором записываются в виде символов на прямоугольной решётке и могут выполняться в произвольном направлении. В 4DL для представления программы используется четырёхмерная решётка, и направлений её выполнения, соответственно, 8.

Программа на 4DL может выглядеть, например, вот так:

 X  ,  B  /    B  +  2  B  -  <  ?  T  B  -  T
 y  __ 10 __ __ 7  __ __ A  __ __ __ __ 07 __ __ 
------------------------------------------------------------------
 __ Y  __ __ __ __ __ __ __ __ .  __ x  __ __ x  ||  __ __ __ __ __ __ __ __ __ __ 20 __ __ __ __ __
 t  X  __ __ __ q  +  2  q  -  <  ?  Z  q  -  Z  ||  z  __ __ __ __ __ __ __ __ .  b  .  x  __ __ x

Эта программа написана не на «базовом» языке, а на его расширении, но об этом позже.
Читать полностью »

Двое английских учёных Peter Bentley и Christos Sakellariou создали компьютер, который подобно мозгу человека выполняет инструцкии не последовательно, а сегментами в случайном порядке.
По словам учёных, такой механизм позволяет этому компьютеру адаптироваться к критическим ситуациям и обходить их без остановки работы.
Читать полностью »

Привет,
в этом посте я расскажу рецепт добавления функциональности в Перл.

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

f(0) = 1
f(n) = n * f(n-1)

Функциональные языки программирования позволяют определять такие функции достаточно просто, в Erlang это делается следующим образом:

factorial(0) ->
    1;
factorial(N) ->
    N * factorial(N-1).

А теперь попробуем сделать нечто похожее, что позволяло бы нам писать код вида:

#!/usr/bin/perl -I./lib
use strict;
use bigint;
 
use Recurrent;
 
recurrent fib => {
    arg(0) => lambda { my($n) = @_; return 0 },
    arg(1) => lambda { my($n) = @_; return 1 },
    arg(n) => lambda { my($n) = @_; return fib($n-1) + fib($n-2) },
};
 
print fib(1000);

Из примера видно, что у нас появились новые функции recurrent, arg, n и lambda. На самом деле, практическая польза есть только у recurrent, все остальные нужны лишь для получения более «красивого» кода.

Давайте напишем модуль Recurrent.pm
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js