1

(3 відповідей, залишених у C++)

koala написав:

Отже, виявляється, ви працюєте в Emacs. Як гадаєте, це суттєва інформація, щоб вам підказали, що робити?
Ну і люди, окрім того, щоб питати, ще й в гуглі шукають. І комусь може бути корисним дізнатися, що саме треба налаштувати в Emacs для clang, щоб бібліотека ranges використовувалася без помилок. Чому б вам для них не написати, що саме ви змінили в налаштуваннях?

У мене діагностика в Emacs відбувається за допомогою lsp-mode i flycheck.
Я грався з налаштуваннями і вимкнув flycheck в lsp-mode ось такою командою lsp-diagnostics-provider :none.
Тому lsp-mode використав свій lsp сервер clangd зі своїми налаштуваннями.
У нього стандартне налаштування с++17, а <ranges> з с++20.
І оскільки lsp-mode вже не бачив моїх налаштувань, то видавав помилку.
Загалом, якщо не втручатися в налаштування,
то lsp-mode автоматично шукає flycheck і якщо знаходить, то використовує його для діагностики.
У свою чергу flycheck визначає всі наявні у вас чекери та проганяє їх один за одним крізь ваш код.

2

(9 відповідей, залишених у Інше)

Замість того, аби кодити, краще б читали англомовні книжки військової тематики.
Щоб потім у цивільному житті кодити, спочатку треба вижити.

3

(3 відповідей, залишених у C++)

Треба було в налаштуваннях Emacs дещо змінити. Тепер усе працює як слід.

4

(3 відповідей, залишених у C++)

Коли я захотів використати бібліотеку <ranges>,
clang спочатку взагалі її не бачив, не було навіть автодоповнення.
Я додав до файлу конфігурацій clang
CompileFlags:
  Add: [-std=c++20].

З'явилося автодоповнення, але досі є помилка no member named 'ranges' in namespace 'std' [clang-diagnostic-error].
Хоча все компілюється і програма працює як слід.
Як мені виправити це?
У мене clang version 19.1.7 і gcc (GCC) 14.2.1 20250207.
Компілюю gcc, а clang для автодоповнення, діагностики та форматування.

5

(0 відповідей, залишених у Статті)

1. C++ All-in-One For Dummies, 4th Edition J.P. Mueller (2021)
Непогана книжка для новачків, як зрозуміло з назви все пояснюється в загальних рисах без надмірних деталей. Є цікаві зауваження автора, що ґрунтуються на його особистому досвіді. Сподобався розділ Understanding Functional Programming, там дуже добре лямбди пояснено.

2. Professional C++, Fifth Edition Marc Gregoire (2021)
Матеріал доволі деталізований, але не занадто. Підійде для новачків. Книгу написано під С++20 MSVC, можна й інші компілятори використовувати, але імпорт лише в MSVC поки що реалізований (просто використовуйте include, якщо інший компілятор).

3. The C++ Standard Library, Fourth edition includes C++23 Rainer Grimm (2023)
Гарний путівник по стандартній бібліотеці С++. Звісно, усе потрібне можна знайти на https://en.cppreference.com/w/, але в форматі книги набагато зручніше читати.

4. Best practices for modern C++: Rough Cuts — C++ Core Guidelines explained (2022)
Стислий опис базових рекомендацій щодо програмування на С++, створених творцем цієї мови разом із іншими програмістами. Повний опис тут:
https://isocpp.github.io/CppCoreGuideli … Guidelines
Дуже раджу новачкам. Наприклад, ознайомилися з поняттям змінної, трохи попрактикувалися, з’явилися питання «Як краще зробити те чи інше?» — відкриваєте відповідний розділ цих рекомендацій і читаєте. Не раджу без попередньої практики читати все підряд, нічого не зрозумієте й навряд чи запам’ятаєте як слід.

5.  Math for programming Learn the Math, Write Better Code by Ronald T. Kneusel (2025)
Книга присвячена математиці, що використовується в програмуванні.

6

(3 відповідей, залишених у C++)

Також раджу встановити quickrun для компіляції та запуску програм.
Його зручність полягає в тому, що можна прив'язати до однієї клавіші
відразу декілька різних команд для різних мов програмування.
quickrun розпізнає поточний режим програмування (мову)
і виконує відповідну команду (стандартну або встановлену користувачем).
Ось приклад налаштувань для C++ із CMake:

;;Налаштування quickrun
(require 'quickrun)

;; Налаштування для компіляції та запуску програм С++
(quickrun-add-command "c++"
  '((:command . "cmake")
    (:exec    . ("%c -Bbuild/Debug -DCMAKE_BUILD_TYPE=Debug && cd build/Debug && make"))
    )
  :default "c++")

Контейнер можна ініціалізувати за допомогою інтерфейсу чи класу.
Наприклад:

HashSet<Character> second = new HashSet<>();
Set<Character> third = new HashSet<>();

Яка різниця між ними? Якому способу варто віддавати перевагу і чому?

8

(6 відповідей, залишених у Java)

koala написав:

Не розумію, як ваш алгоритм працює. Припустимо, маємо числа {1,2,3} і target=2. Кількість пар=2.
Починаємо з left=0, right=2,
1 ітерація. number = 4, right стає 1.
2 ітерація. number = 3, right стає 0.
Умова left<right більше не виконується. Знайдено 0 пар.
Вам натомість треба якось так:

sort(nums)
answer=left=right=0
while left<right:
    while right<nums.size() || nums.get(right)-nums.get(left)<target:
        right++
    answer += right-left+1
    left++

У вашому прикладі немає жодної пари, чия сума була б менше двох.
Правий і лівий треба додавати, а не віднімати.
Моя провина, я в описі помилився, там про суму йшлося.
Ось це воно: https://leetcode.com/problems/count-pai … scription/

9

(6 відповідей, залишених у Java)

koala написав:

Ну і так, тут бінарний пошук не потрібен, він тільки підвищує складність (не враховуючи сортування). Сортування дає O(nlog(n)), а пошук потім з бінарним O(nlog(n)), а без нього O(n).

Знаю, там за допомогою 2 вказівників можна вирішити.
Але Літкод сказав бінарний пошук, отже, бінарний пошук:).
Намагаюся вивчити стандартну бібліотеку Джави за допомогою Літкода.

10

(6 відповідей, залишених у Java)

Ось таке працює, хоч і без колекцій:

class Solution {
    public int countPairs(List<Integer> nums, int target) {
        Collections.sort(nums);
        int answer = 0;
        int left = 0;
        int right = nums.size() - 1;
        while (left < right) {
            int number = nums.get(left) + nums.get(right);
            if (number < target) {
                answer += right - left;
                System.out.println(left + " " + right);
                ++left;
            } else {
                --right;
            }
        }

        return answer;
    }
}

Я так розумію бінарний пошук із колекцій краще брати
лише якщо треба визначити наявність чи відсутність елемента.
У решті випадків простіше самому написати.

11

(6 відповідей, залишених у Java)

Дано перелік цілих чисел і задане число. Потрібно знайти кількість пар чисел, сума елементів яких менше заданого числа.
Другий елемент пари обов'язково має стояти після першого в цьому переліку.
Я намагаюся використати бінарний пошук із колекцій, але щось в мене не виходить. Просто не розумію як правильно докупи все зібрати.

class Solution {
    public int countPairs(List<Integer> nums, int target) {
        Collections.sort(nums);
        int answer = 0;
        record Num_Pair(Integer target, Integer num) {
        }
        ;
        Comparator<Num_Pair> cmp = new Comparator<Num_Pair>() {
            public int compare(Num_Pair first, Num_Pair second) {
                if (first.target - second.num < 2) {
                    return 1;
                } else {
                    return -1;
                }
            }
        };
        for (int i = 0; i < nums.size(); ++i) {
            List<Integer> new_list = new ArrayList<>();
            new_list = nums.subList(i, nums.size() - 1);
            Num_Pair new_pair;
            new_pair.target = target;
            new_pair.num = nums.get(i);
            int index = Collections.binarySearch(new_list, new_pair, cmp);
            if (index > 0) {
                ++answer;
            }
        }
        return answer;
    }
}

12

(1 відповідей, залишених у *nix)

Як виявилося, моя система бачить бібліотеку і програма компілюється та запускається.
Але Eglot та Flycheck (автодоповнення, діагностика) не бачать її та видають помилки.
Треба шукати як додати до LSP сервера цю бібліотеку.

13

(1 відповідей, залишених у *nix)

На Coursera є безкоштовні курси «Алгоритми» і там вимагається використання їхніх бібліотек для Java (наприклад, algs4.jar).
Я додав шлях до файлу в bash_profile, як це описано в них ось тут https://algs4.cs.princeton.edu/code/, але Emacs усе одно не бачить цю бібліотеку.
Що треба зробити, щоб Emacs на OS Manjaro бачило цю бібліотеку?

Vik_77 написав:
Teg Miles написав:

Котлін — російська розробка, почитайте статтю про Котлін у Вікіпедії (зверніть увагу на походження назви).
Окрім того 3 з 9 офісів JetBrains російські. З цих причин я не користуюся їхніми продуктами.

На чому радите писати під Android?

Android на Java написаний. І найкращий функціонал можна отримати
лише якщо Java використовувати, як я розумію. Тому хочу основу писати
на Java, а найбільш перевантажені частини — на С++.

15

(0 відповідей, залишених у Java)

Попередні кроки щодо встановлення Emacs, його файлу конфігурації та менеджера пакунків
можна поглянути тут (лише пункти 1-4): https://replace.org.ua/topic/15994/
Далі встановлюєте наступні програми з менеджера пакунків Emacs:
doom-themes - величезний набір різних тем оформлення
sideline - програма для показу помилок у відповідному рядку
sideline-flycheck - доповнення для роботи з flycheck
company — основа для автодоповнення тексту (потребує певного рушія)
flycheck — перевірка синтаксису, знаходження помилок «на льоту»
flycheck-projectile
flycheck-eglot
helm — дуже зручна програма автодоповнення будь-яких команд Emacs і не тільки
helm-company
helm-flycheck
helm-projectile
helm-xref
projectile — керування проєктами
rainbow-delimiters — кольорове виділення дужок різного рівня
treemacs — менеджер файлів
treemacs-projectile
which-key — програма, що показує наявні комбінації клавіш та інформацію по ним
xclip — копіювання до clipboard та з нього
yasnippet — корисні сніппети автодоповнення, як от автоматичне додавання дужок до функцій
yasnippet-snippets
quickrun - дуже корисний додаток для запуску програм,
підтримує різні мови програмування, тому до однієї клавіші
можна прив'язати компіляцію і запуск для кількох різних мов програмування,
цей додаток розпізнає якою мовою ви програмуєте і запускає відповідні налаштуванння
eglot-java - підтримка Language Server Protocol для Java
eglot - загальна підтримка LSP, окремо встановлювати не треба, він вбудований в Emacs

Тепер додаєте ось ці налаштування до вашого файлу конфігурації Emacs:

;;Підсвічування пар дужок відповідним кольором
(add-hook 'java-mode-hook #'rainbow-delimiters-mode)

;;Налаштування для відкривання останнього робочого файлу
(recentf-mode 1)
(setq recentf-max-menu-items 5
      recentf-max-saved-items 5
      recentf-exclude '("~/.emacs.d/.cache/treemacs-persist")
)

;;Автодоповнення дужок
(electric-pair-mode 1)
(setq electric-pair-preserve-balance nil)

;;Company — програма, що є основою для автодоповнення
(add-hook 'after-init-hook 'global-company-mode)

;;Показати нумерацію рядків
(add-hook 'prog-mode-hook 'display-line-numbers-mode)

;;Налаштування швидкого автодоповнення
(setq gc-cons-threshold (* 100 1024 1024)
      read-process-output-max (* 1024 1024)
      company-idle-delay 0.0
      company-minimum-prefix-length 1
      lsp-idle-delay 0.1
      )

;;Налаштування автопрокручування вікна компіляції до першої помилки
(setq compilation-scroll-output 'first-error)

;;Налаштування розміру табуляції
(setq-default tab-width 4)

;;Налаштування максимальної кількості символів у рядку
(setq-default fill-column 80)

;;Налаштування використання готових сніппетів
(require 'yasnippet)
(yas-global-mode 1)

;;Налаштування автоматичного копіювання до clipboard
(xclip-mode 1)

;;Налаштування eglot для Java
(use-package eglot
  :ensure t
  :hook (
        (prog-mode . eglot-ensure)
        )
  )

;;Налаштування eglot-java
(require 'eglot-java)
(eglot-java-mode 1)

;;Налаштування flycheck
(use-package flycheck-eglot
  :ensure t
  :after (flycheck eglot)
  :custom (flycheck-eglot-exclusive nil) ;;Задіяно всі чеккери Eglot+flycheck
  :config
  (global-flycheck-eglot-mode 1))


;;Налаштування sideline показ помилок в рядку
(use-package sideline
  :init
  (setq sideline-backends-left-skip-current-line t   ; don't display on current line (left)
        sideline-backends-right-skip-current-line t  ; don't display on current line (right)
        sideline-order-left 'down                    ; or 'up
        sideline-order-right 'up                     ; or 'down
        sideline-format-left "%s   "                 ; format for left aligment
        sideline-format-right "   %s"                ; format for right aligment
        sideline-priority 100                        ; overlays' priority
        sideline-display-backend-name t)            ; display the backend name
        )


(use-package sideline
  :hook (flycheck-mode . sideline-mode)
  :init
  (setq sideline-backends-right '(sideline-flycheck)))

(use-package sideline-flycheck
  :hook (flycheck-mode . sideline-flycheck-setup))

;; Налаштування hydra
(use-package hydra)

;;Налаштування doom-themes
(use-package doom-themes
  :ensure t
  :config
  ;; Global settings (defaults)
  (setq doom-themes-enable-bold t    ; if nil, bold is universally disabled
        doom-themes-enable-italic t) ; if nil, italics is universally disabled
  (load-theme 'doom-one t)

  ;;Corrects (and improves) org-mode's native fontification.
  (doom-themes-org-config)
  )

;;Налаштування treemacs
(use-package treemacs
  :ensure t
  :defer t
  :config
  (progn
    (setq treemacs-show-hidden-files nil)

    (treemacs-follow-mode t)
    (treemacs-filewatch-mode t)
    (treemacs-fringe-indicator-mode 'always)

    (treemacs-hide-gitignored-files-mode nil))
  :bind
  (:map global-map
        ("M-0"       . treemacs-select-window)
        ("C-x t 1"   . treemacs-delete-other-windows)
        ("C-x t t"   . treemacs)
        ("C-x t d"   . treemacs-select-directory)
        ("C-x t B"   . treemacs-bookmark)
        ("C-x t C-t" . treemacs-find-file)
        ("C-x t M-t" . treemacs-find-tag)))

(use-package treemacs-projectile
  :after (treemacs projectile)
  :ensure t)


;;Перевірка синтаксису flycheck
(use-package flycheck
  :ensure t
  :init
  (global-flycheck-mode)
  :config
    ;; Показувати індикатори помилок в крайньому лівому стовпчику
    (setq flycheck-indication-mode 'left-margin
          ;; Затримка показу помилок
          flycheck-display-errors-delay 0.1
          ;; Перевірка згідно певного стандарту мови С++
          flycheck-gcc-language-standard "c++20"


    )
    ;; Налаштування ширини стовпчика з індикаторами помилок
    (defun my/set-flycheck-margins ()
      (setq left-fringe-width 8 right-fringe-width 8
       left-margin-width 1 right-margin-width 0)
      (flycheck-refresh-fringes-and-margins))
    ;; Поява індикаторів щоразу при відкритті нового буфера
    (add-hook 'flycheck-mode-hook #'my/set-flycheck-margins)
    ;; Додавання перевірки синтаксису clang в чергу після cppcheck
    (flycheck-add-next-checker 'c/c++-cppcheck 'c/c++-clang)

  )

;;Налаштування керування проєктами Projectile
(projectile-mode +1)
;; Recommended keymap prefix on Windows/Linux
(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map)

;;Налаштування автодоповнення команд which-key
(which-key-mode)
(add-hook 'java-mode-hook 'lsp)

;;Автоформатування файлу перед збереженням
(add-hook 'before-save-hook 'eglot-format-buffer)

;;Налаштування програми автодоповнення команд Helm
(helm-mode)
(require 'helm-xref)
(define-key global-map [remap find-file] #'helm-find-files)
(define-key global-map [remap execute-extended-command] #'helm-M-x)
(define-key global-map [remap switch-to-buffer] #'helm-mini)

;;Налаштування quickrun
(require 'quickrun)

;;Налаштування прив'язки клавіш клавіатури
;;Прив'язка клавіші F2 до збереження файлу
(global-set-key [f2] 'save-buffer)

;;Прив'язка показу нещодавніх файлів до клавіші F3
(global-set-key [f3] 'recentf-open-files)

;;Прив'язка компіляції та запуску програми Java до F4
(define-key global-map [f4] 'quickrun)

;; Показ переліку всіх помилок в окремому буфері
(define-key global-map [f6] 'flycheck-list-errors)

;;Прив'язка виклику менеджера файлів treemacs до F7
(define-key global-map [f7] 'treemacs)

;;Прив'язка виклику переліку функції та класів у treemacs
(define-key global-map [f8] 'lsp-treemacs-symbols)

Ще є можливість використати поєднання lsp-mode(lsp-java) плюс Flymake(вбудований)
замість eglot(eglot-java) плюс Flycheck,
але lsp-mode дає жахливі глюки на Java (цілі шматки коду раптово видаляються),
а Flymake(альтернатива Flycheck) має гіршу підтримку для С++.
Тому я їх не використовую.
Це налаштування для створення дуже простих програм початкового рівня,
бо з іншими я поки що не працював.

PRY написав:
Teg Miles написав:

Спробував Flutter/Dart і згадав як же ж Ґуґл обожнює збирати персональні дані:)

Не знаю, якось не відчув цього. Можливо, різні критерії приватності:).

Teg Miles написав:

доведеться хоча б спробувати вивчити Java

У свій час переходив на Java - Android саме з C++ - QT5. Перехід був досить не складним.
Хоча Java тоді жартома називали C плюс плюс мінус, але, як на мене, її дійсно варто вивчити).

Просто на Flutter є відмова від збору діагностики, а на Dart немає можливості відмовитися.
Плюс уся ця комбінація розрахована на постійний доступ до мережі, як і всі продукти Ґуґл.

Спробував Flutter/Dart і згадав як же ж Ґуґл обожнює збирати персональні дані:).
Усе ж таки доведеться хоча б спробувати вивчити Java.

PRY написав:
Teg Miles написав:

Як краще перенести написану на С++ на ОС Андроїд:

  1. Використати відповідне IDE та лишити на С++.

  2. Переписати повністю на Java.

  3. Переписати частково на Java, частини, де найбільше навантаження лишити на С++.

Хочу зрозуміти чи варто вчити Java заради створення додатків для ОС Андроїд.
Чи все ж можна обійтися лише С++?

Як варіант можна ще запропонувати фреймворк Flutter/Dart.

Схоже, що Flutter/Dart доволі перспективна комбінація.

19

(22 відповідей, залишених у C++)

steamwater написав:
steamwater написав:

Перезайшов на сайт з нуля i все спрацювало. I цi люди розповiдають навачкам про iнiцiалiзацiю! Не знаю гарно воно чи погано, але прийняте:https://leetcode.com/problems/cheapest- … 522532439/

Що таке beats? Як я розумiю воно вiдноситься до перфомансу. То чим бiльше тим краще, чи навпаки?

Так, чим більше, тим краще. В ідеалі по 100% має бути.
Порівнюється швидкість і використання пам'яті з іншими рішеннями.

20

(22 відповідей, залишених у C++)

steamwater написав:

Я бачу що там на деякi речи треба сплачувати пiдписку 35$/мiсяць. То як здати на перевiрку?

Зайдіть у необхідне завдання, вставте своє рішення у віконце для рішень і запустіть його.
Якщо рішення прийняте, далі в розділ Solutions, там згори з'явиться запрошення додати своє рішення.
Наскільки я знаю, додавання своїх рішень безкоштовне.