• Существует ли простой и элегантный способ добавить информацию о позиции в синтаксическое дерево с взаимно-рекурсивными типами?

    Вроде такого способа нет.

    А почему второй вариант неудобен?
    См, например, haskell-src-exts, там у каждого типа есть доп. элемент типа l, в котором может быть позиция или что-то ещё.
    В ghc сделано аналогично, но чуть иначе - некоторые конструкторы обёрнуты в Located
    Ответ написан
  • Как строчные символы преобразовать в ПРОПИСНЫЕ в программе Sublime Text 3?

    Команда "Convert case: Upper case"
    Сочетание: Ctrl+K, Ctrl+U

    Находится проще всего, если нажать Ctrl+Shift+P, и набрать там 'upper'
    Ответ написан
    Комментировать
  • Что должна уметь IDE для haskell?

    А в каком контексте вопрос? Всё как обычно, вроде

    1. подсвечивать ошибки (по сохранении файла или прямо во время написания кода)
    2. показывать типы (выведенные и/или из определения символа)
    3. показывать доки (в том числе и в исходниках написанные)
    4. запускать интерпретатор на проекте
    5. отладчик
    6. переименования
    7. вынос локального определения

    и т.п.
    Ответ написан
    Комментировать
  • Что делать, если склонировал проект не с форка?

    Создай форк, затем
    git remote add my https://...
    git pull my master
    git push --set-upstream my master

    Через `remote` также можно будет удалить ненужный источник
    Ответ написан
    Комментировать
  • Как нарисовать только часть окружности, заданной точками кривой Безье?

    Хорошо сформулированный вопрос - половина ответа.
    Что значит "ничего не рисуется"? Нет никаких точек?
    Тогда проверяйте, а рисуется ли просто точка хоть где-нибудь. Если нет - ищите, почему.
    К тому же, кривую лучше рисовать из маленьких отрезков, а не из точек. Т.е. надо считать "предыдущую точку" и "текущую точку", проводить (рисовать) отрезок; затем переходить к новой точке, сохраняя "текущую" в "предыдущую", и так далее.
    Попробуйте нарисовать отрезки P0-P1, P1-P2, чтобы вообще оценить опорные точки безье на картинке, а затем уже проводите какие-то рассчёты, может, проблема в рассчётах.
    Ну и так далее, потом видно будет, в чем проблема.
    Ответ написан
    Комментировать
  • Как привязать к хоткею разные команды в зависимости от синтаксиса?

    args - это аргументы команды, а вам нужен context
    sublimetext.info/docs/en/reference/key_bindings.html
    https://forum.sublimetext.com/t/per-syntax-key-bin...

    Конкретно selector - это scope, который как раз определяет язык

    Вот пример для HTML:
    {
    	"keys": ["ctrl+shift+enter"], 
    	"command": "insert_snippet",
    	"args" : {
    		"contents": "<br/>"
    	},
    	"context": [
    		{ "key": "selector", "operator": "equal", "operand": "text.html" }
    	]
    },


    Какой именно scope у JS - не знаю
    Наверное что-то типа text.javascript или text.js

    У себя проверил такой keymap в юзерском `Default (Windows).sublime-keymap`:

    [
    	{
    		"keys": ["ctrl+k", "alt+k"],
    		"command": "set_layout",
    		"args":
    		{
    			"cols": [0.0, 1.0],
    			"rows": [0.0, 1.0],
    			"cells": [[0, 0, 1, 1]]
    		},
    		"context": [
    			{ "key": "selector", "operator": "equal", "operand": "source.c++" }
    		]
    	}
    ]


    Выставил синтаксис Haskell - не работает
    Выставил C++ - работает
    Ответ написан
    8 комментариев
  • Как Найти точку пересечения 2х прямых, зная только 2 точки каждой прямой?

    Псевдокод:
    vec_t = left.end - left.start;
    vec_k = right.end - right.start;
    r = right.start - left.start;
    d = vec_t ⋅ vec_k;
    if (d ≃ 0.0)
    	return; // параллельны
    d_t = r ⋅ vec_k;
    d_k = r ⋅ vec_t;
    t = d_t / d; // параметр на одном отрезке ∈ [0, 1]
    k = d_k / d; // на втором отрезке ∈ [0, 1]
    if (t ∈ [0, 1] ∧ k ∈ [0, 1])
    	pt = left.start + t ⋅ vec_t = right.start + k ⋅ vec_k;
    Ответ написан
    Комментировать
  • Как вернуть массив?

    Зачем вам его возвращать?
    В Си++ нельзя передать массив по значению (только если он не составная часть структуры), вместо этого передают указатель на первый элемент массива, как у вас. Соответственно, все изменения, который вы проводите над int * minArr внутри search_min_elements_of_array отражаются на массиве int minArr[m/2], и отдельно что-то возвращать не надо.

    Также стоит перенести определение (тело) функции search_min_elements_of_array за пределы (перед) main, ну и вызов у вас неверный:
    // int minArray[m/2] = search_min_element_of_array(int array[][3], int *minArr); // больше похоже на объявление функции
    search_min_element_of_array(array, minArr);
    Ответ написан
    Комментировать
  • Как исправить Stack Overflow при рекурсии с использованием std::thread и templates?

    Не вчитывался в алгоритм, но, если верно понимаю, чем меньше N, тем больше глубина рекурсии, оттуда и stack overflow. Дело не во входной последовательности, а в локальных переменных и аргументах функции. Так что меняйте на цикл.

    Что касается Access Denied и прочих, скорее всего другие ошибки есть.
    Ответ написан
    Комментировать
  • Как решить проблему с Sublime Text?

    Нужна запятая после "font_size": 10

    Это, кстати, даже в сообщении об ошибке написано.
    Ответ написан
    Комментировать
  • Как найти все возможные не повторяющиеся пересечения множеств?

    Как я понимаю, общих элементов нет.
    На примере 3-х множеств с мощностями a, b и c.
    m=0: 1 комбинация
    m=1: a + b + c комбинаций
    m=2: a*b + b*c + a*c комбинаций
    m=3: a*b*c комбинаций

    Итого
    1 + a + b + c + ab + bc + ca + abc
    1 + a + b + ab + c*(1 + a + b + ab)
    (1 + a + b + ab)(1 + c)
    ...
    (1 + a)(1 + b)(1 + c)

    На ваших данных получаем 4*3*3 = 36

    Ответ подсказывает и принцип, как его посчитать. Из одного множества можно выбрать 1 + a способами: либо не берём (пустое множество), либо берём a способами.
    Если добавить новое множество в рассмотрение, то либо мы из него не берём элемент, либо тоже берём, b способами, итого: (1+a)(1+b). Т.е. каждое множество Aᵢ даёт нам 1+|Aᵢ| новых вариантов, где |A| - мощность (кол-во элементов) множества A.
    Т.о. ответ: ∏(1+|Aᵢ|)

    Учтите, что эта формула учитывает так же и единственный вариант выбрать 0 элементов (результат - пустое множество), соот-но от того, что вы посчитали в вопросе отличается на единицу (36 вместо 35).
    Ответ написан
  • Как быстро выбрать все сочетания из массива (комбинаторика)?

    > [(i, j) for i in range(1, 4) for j in range(i + 1, 4)]
    [(1, 2), (1, 3), (2, 3)]


    Более общий код, но на хаскеле.
    Идея такая:
    Для каждого элемента списка получаем n-1 сочетания из всех, что идут после него, и добавляем сам элемент.
    comb ∷ Int → [a] → [[a]]
    comb 0 _ = [[]] -- из нуля элементов можно составить только пустой список
    comb n [] = [] -- из пустого списка нельзя составить ничего
    comb n lst = do -- списочная монада, работает как вложенные for
    	-- tails для [1,2,3] вернёт [[1,2,3], [2,3], [3], []], т.е. все возможные хвосты
    	-- мы перебираем все хвосты, кроме последнего пустого
    	-- и дербаним его на голову l и остаток ls
    	(l:ls) ← filter (not ∘ null) $ tails lst
    	-- перебираем сочетания из n - 1 элементов от ls
    	ls' ← comb (n - 1) ls
    	-- и присобачиваем l к каждому
    	return (l:ls')
    Ответ написан
    4 комментария
  • Сможете объяснить решение олимпиадной задачи?

    Задача сводится к выяснению того, сколькими кубиками (не способами, а именно кубиками) может быть задана исходная сумма (нижних граней).
    Например, 1 может быть задано только 1-м кубиком, ответ - 1
    2 может быть задано как 1-м, так и 2-мя кубиками, ответ - 2
    3 может быть задано 1-м, 2-мя или 3-мя кубиками, ответ - 3.
    Рассмотрим 4. Может быть задано от 1-го до 4-х кубиками. Т.е. ответ - 4. Рассмотрим случай 2-х кубиков. Это могут быть комбинации 2 + 2 или 1 + 3, но оба они дадут одну и ту же сумму верхних граней: 6 + 6 - (2+2) или 6 + 6 - (1+3), что явно одно и то же.
    У разных же количеств кубиков сумма разная, так как разное кол-во 6-к (самых больших чисел).

    Итак, надо выяснить, сколькими кубиками можно задать сумму s. Понятно, что если s ≤ 6, то любым кол-вом от 1 до s. Но если s > 6, то одним кубиком уже не задать. Если s > 12 (6 * 2), то не задать уже и двумя.
    Т.е. если s > 6, надо вычесть 1, если s > 12, надо вычесть 2, если s > 18, то вычесть 3.
    Или, иначе говоря, если s > 6k, надо вычесть k. k можно посчитать как (s - 1) / 6 (целочисленное деление). Как только s становится больше 6k, то есть становится 6k + 1, получаем (6k + 1 - 1) / 6 = k. Если же s = 6k, то (6k - 1) / 6 = k - 1, что нам и надо.
    Т.о. результат: s - (s - 1) / 6, что эквивалентно вашей формуле, так как
    (s + 5) / 6 = (s - 1) / 6 - 1
    (s + 5) / 6 - 1 = (s - 1) / 6
    Ответ написан
    5 комментариев
  • Почему в программировании используются моноширинные шрифты?

    В каких-то случаях для форматирования бывает важно, чтобы ширина всех символов была одинаковая:
    Например, некоторые выравнивают так (или типа того):
    void foo(
             int    x,
             double y)
    {
      int    quux = x;
      double bla  = y;
      float  t    = 0.0;
    }

    С немоноширинным так не получится. Возможно, есть ещё какие-то причины.
    Лично я пользуюсь немоноширинными - они удобнее для чтения, а такое форматирование я не использую и встречаю редко.
    Ответ написан
    Комментировать
  • Какая математическая формула?

    1 + 2 + 4 + ... = 2⁰ + 2¹ + 2² + ... = 2ⁿ - 1
    (2ⁿ - 1)x = 100
    x = 100 / (2ⁿ - 1)

    Где x - выигрыш последнего выигрышного места

    Например при 4 участниках x = 100 / (2⁴ - 1) = 100 / 15
    Выигрыши: 100/15, 2*100/15, 4*100/15, 8*100/15
    Ответ написан
    Комментировать
  • Когда допустимо возвращение ссылки в функции? Когда ссылки на константу?

    Отличаются тем, что во втором случае объект по ссылке изменять нельзя. От возврата по значению отличаются тем, что при возврате по значению происходит копирование объекта со всеми вытекающими:
    1. Это может быть накладно
    2. Результат - это копия, поэтому изменения, внесённый в неё - это изменения в копии, а не в том объекте, который возвращался. По этой причине, например, operator [] у класса-массива должен возвращать ссылку, чтобы изменяя полученную ссылку, изменялось бы значение, которое лежит в массиве.

    Ссылка в этом смысле не отличается от указателя, кроме того, что не может быть null. Поэтому нельзя, например, возвращать ссылку на какую-то временную переменную:
    int & foo()
    {
      int x = 100;
      return x;
    }
    int main()
    {
      int & y = foo();
      y = 10; // UB
    }

    Переменная x тут умрёт по выходе из foo, и y будет ссылаться на уже мёртвую переменную. Но можно возвращать ссылку на член класса, если объект класса будет жить дольше, чем ссылка. Т.е. так можно:
    class Test
    {
      int x;
    public:
      int & getx() { return x; }
    };
    int main()
    {
      Test t;
      int & y = t.getx();
      y = 10; // t.x будет равен 10
    }

    А вот так опять нет:
    class Test
    {
      int x;
    public:
      int & getx() { return x; }
    };
    int main()
    {
      int * y;
      {
        Test t;
        y = &t.getx();
      }
      *y = 10; // UB, t умирает в конце блока, x тоже, а обращение идёт уже после
    }
    Ответ написан
    1 комментарий
  • Как найти ошибку в коде (Игра "Жизнь")?

    1. Минимизируйте неправильный пример. Что именно неправильно? Полоска, квадрат?
    2. Создайте как можно меньший пример, который работает некорректно, а с ним уже работайте отладчиком.
    Ответ написан
    Комментировать
  • Когда неявно вызывается деструктор?

    Драфт стандарта n3337:

    Destructors are invoked implicitly
    — for constructed objects with static storage duration (3.7.1) at program termination (3.6.3),
    — for constructed objects with thread storage duration (3.7.2) at thread exit,
    — for constructed objects with automatic storage duration (3.7.3) when the block in which an object is created exits (6.7),
    — for constructed temporary objects when the lifetime of a temporary object ends (12.2),
    — for constructed objects allocated by a new-expression (5.3.4), through use of a delete-expression (5.3.5),
    — in several situations due to the handling of exceptions (15.3).
    Ответ написан
    Комментировать
  • Как сохранить файл настроек "bla/bla/name.sublime-settings"?

    Я уверен, что такой функции нет, потому что применить её можно на разном уровне (на уровне текущего вью, на уровне языка, на уровне общих настроек), и неясно, что выбирать по дефолту. Т.е. сохраняющий должен явно это указывать. Учитывая то, что то, что не в User - менять (через Python) нельзя (ибо оно апдейтится автоматом и всё слетает, т.е. дефолтные настройки на совести разработчиков плагинов), то иерархия становится не такой уж и большой: текущий вью, язык или Preferences.
    Т.е. надо выбирать, исходя из каких-либо соображений, между '.sublime-settings' и 'Preferences.sublime-settings' (+ не забыть про os-специфичные), а их сохранять через save_settings.
    Ответ написан