All streams
Search
Write a publication
Pull to refresh
38
0.1
Николай Меркин @nickolaym

User

Send message
какое прекраснодушие.
а то там рифма напрашивалась: ликер-сакер-мазаф… молчу, молчу.
Ну, с мифами понятно. А факты где? В статье видны только тезисы и антитезисы.
Не то, что я согласен с одними или другими, но покоробило странное использование слова «факт».
Датчик движения

Пока никого нет: чёрный стенд, энергосбережение
На горизонте кто-то появился: Эй! Эгеееей! Сюда посмотрите!..
Подошёл близко: Мадам, месье! Только сегодня, для вас, специальное предложение! Нажмите один если…
Уходящему вслед: Казззёл!
Однако, путь для этого типизированного нуля выбран больно уж странный.
При том, что дефолтный конструктор создаёт именно нейтральное значение:
    explicit date_duration(duration_rep day_count = 0) : base_type(day_count) {}

По крайней мере, в бусте 1.51.
Может, в следующих версиях буста что-то резко поменялось?

Так, на всякий случай: если программист хочет экономить на спичках написать дефолтный конструктор, который НЕ инициализирует объект, и наряду с ним предусмотреть инициализацию нейтральным/сигнальным/терминальным значением, то есть такой приём:

class Foo
{
  int x, y, z;
public:
  // типизированный тэг
  enum zeroinit_t { zeroinit }; // так
  struct zeroinit {}; // или так

  Foo() {} // дефолт и экономия процессорного времени
  Foo(zeroinit_t) : x(0), y(0), z(0) {} // инициализация (причём конструктор можно делать explicit, а можно и не делать - по вкусу)

  .....
};

.....
Foo f; // не инициализирован
Foo g(Foo::zeroinit); // если тэг - перечисление
Foo h(Foo::zeroinit()); // если тэг - структура

Была такая технология — ЭСЛ (эмиттерно-связанная логика), где транзисторы работают не в предельных режимах (вкл-выкл), а в линейном.
Опережала по скорости ТТЛ и МОП, но жрала электричество как бегемот веники.
Желание УБИВАТЬ!!! дало огромный толчок к развитию ядерной физики.
Собственно, мирный атом — это побочные плоды трудов.
(Подтверждение — рассказ Р.Фейнмана о том, как к ним в Лос-Аламос приходили люди из патентного бюро)
Это задачи не просто на логику, а на рефлексию.
Подробнее о рефлексии — см. работы Владимира Лефевра по теории игр.

Суть в том, что у каждого мудреца есть не только объектная модель (видимые и невидимая шапки), но и субъектная (представление о том, как думает он сам и как думают его коллеги).
А также у него есть модель царя (который может быть добрым или злым, а то и подлым, — наденет три чёрных шапки из заявленных двух, и будет ловить лулзы).

Пример короткого решения.
с закрытыми глазами
«Царь-батюшка справедливый. Следовательно, он всех поставит в равные условия. Следовательно, на всех белые шапки».
приоткрывет глаз, видит одну белую и одну чёрную шапку Чорт!!!

У царя тоже, кстати, есть модели мудрецов…
Я этот язык имел в виду, но квайны на нём нечестные, команда Q выводит содержимое памяти интерпретатора (как бейсик).
Вот если бы команда Q печатала одну лишь букву Q в окружении кучи плюсиков, то её вывод был бы квайном.
Квайном не может быть программа, использующая хак среды исполнения, чтобы получить доступ к своим исходникам. (Определение Ч.Уэзерелла).
Т.е. бейсиковская классика 10 LIST не является квайном, потому что среда исполнения и конфеты за неё есть будет.
В остальном же, ограничений на среду нет.

Например, если мы напишем вот такой деревянный интерпретатор языка helloworld,
for s in source_code :
  print "helloworld" # каждую строку интерпретируем как команду вывода "helloworld"

то квайнами будут пустой файл и файлы, заполненные строками helloworld.
Одна беда, helloworld не тьюринг-полон, но это несложно обойти, скрестив его с брейнфаком:
— если строка начинается на #, то печатаем #helloworld
— иначе, выполняем брейнфак-код этой строки

Для бесконечных обезьян нужно включить в программу код проверки, что выходная строка является валидной программой (запускаем компилятор) и её результат (запускаем интерпретатор) совпадает с ней самой.
retry = True
while retry :
  src = generate_random_text()
  ok, printed = compile_and_run(src)
  retry = not ok or printed != src
print src

Этот код может породить квайн, может сам явиться квайном, может зациклиться, порождая всякую ерунду, но не квайны, может породить одноразовый квайн (который случайно напечатает себя с первой попытки), может уйти в бесконечную рекурсию, порождая вариацию себя, которая… (см. с начала строки).
Но если мы заглянем за край проективной плоскости, то там, несомненно, увидим там результат — квайн.
Когда мы говорим про умножение на скаляр, G' = k*G = G+G+...+G (k раз), а потом нахождение множителя k называем дискретным логарифмом, это выглядит как-то… внезапно.
Но если бы мы говорили не про сложение, а про умножение, G' = G*G*...*G (k раз), то эта операция называлась бы возведением в степень, G' = Gk, а обратная операция к возведению в степень и есть логарифм: k = logG(G')

Разумеется, это вопрос в именовании. Нет большой разницы, как назвать единственную операцию в группе, если мы не делаем из группы кольцо.
Но существуют же традиции.
А просрочку платежей он дотянул до суда, чтобы банк подтвердил свои притязания по подписанному договору — и не мог говорить «ой, мы не читали, нас обманули»?
По поводу ODF: с одной стороны, конечно, ламерство и недосмотр пользователей, а с другой стороны — всё-таки недогляд сисадмина.
Во-первых, в ОпенОфисе есть настройки — в каком формате по умолчанию сохранять документы. И если не стоит задача быть насильником-пропагандистом, то лучше сохранять в MSOffice'97 (.doc, .xls). Потому что пропаганда пропагандой, но бороться с чужими ламерами, особенно в суде, — за это деньги не платят. (А наоборот, отнимают).
Во-вторых, кто не рассказал пользователям про экспорт в PDF и про форматы документов? Тем более, что это всего одна кнопка прямо на панели, рядом с дискеткой и принтером.
Большое спасибо, поправил.
Ну, у меня были похожие думки, но они слишком далеки от реализации.
Конечно, удобнее всего использовать языки с мощной обработкой строк, идейно близкие к алгорифмам Маркова и машине Поста — рефал, perl, а может быть, даже awk и sed.

Но как максимально обобщить задачу о мультиквайне, я пока не придумал.
Решение вида принтер-принтер-принтер-...-квайн — вот оно, пожалуйста. Причём таких решений может быть много разных.
В статье указаны два: с двумя строками и двойным декорированием и с тремя строками и одинарным декорированием.

Интересно, что добавление каждой ступени к мультипринтеру линейно (а в плохом случае — экспоненциально) увеличивает размер программы.
text = «hello \» world"
P text = «main(){printf(»%s", «hello \\\» world");}
PP text = «main(){printf(»%s",«main(){printf(\»%s\", «hello \\\\\\\» world\");}");}
видите, что там творится с бэкслешами? Они, заразы, удваиваются! (Квайн 30 порядка просто не поместился в память).
Именно поэтому приходится писать окт-код "\134" вместо "\\".

Квайнер же подходит радикально: будучи длиной len(a+b+c) + len(Ex+Ey+Ez), он порождает текст длиной len(Fx+Fy+Fz)+len(x+y+z). То есть, длина квайнера сравнима или меньше длины его результата.

Поэтому следует поискать, как встроить несколько квайнеров в цепочку: принтер1-квайнер2-принтер3-квайнер4…
Ладно, это, пожалуй, тема для статьи.
К сожалению, не только не причастен, но даже и не подозревал о нём. Спасибо за наводку.
12 ...
63

Information

Rating
3,505-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity