61

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

steamwater написав:

Teg Miles, ваша активнисть знились i це прикро. Не зважайте на те що тут сталось, - не варто. Продовжуйте. Доречи, якщо ви вiдкриєте тему про написання контейнеру у термiнах C++, я б спробував накидати легкий каркас. Це було б кориснiше для вектора, тому що вiн легше для розумiння з боку новачка. Але можна й лист. Односкерований трохи легше. Тут важливо зрозумiти ази техницi шаблоннiв, перегруз операторiв (++, *, ->, що найменше), та iдiому iтераторiв. То ж сам контейнер не має буди складним. А вже вiд, хоча б зверхнього  розумiння загальних концепцiй можна буде легше читати таки речi як cppreference. Щоб не тонути, я б порадив вам не намагатись зрозумiти того що ви читаєте, в глибину. Це неможливо. Навчання це iтеративний процес, якщо йдеться про складнi речи. Сконцентруйтесь на тому, що з тим можна зробита у якомусь простому випадку. Спробуйте, перевiрте. Потiм, можна ускладнювати, але поволi. А C-стайл кодiнг, можна продовжувати незалежно вiд цього. У тому на початку теж є користь. Але не треба змiшувати такий код iз абстракцiями рiвня unique_ptr. Воно тiльки нашкодить. Тож чекаю на вашi повiдомлення.

Активність не знизилася, просто питань поки що немає.

Які вимоги щодо обсягу виконаної роботи за добу для програмістів?
Наприклад, для перекладачів англійської мови —  5 сторінок на день
для звичайного тексту і 20 хвилин для субтитрів. Це мінімальні вимоги.
Мене цікавлять мінімальні вимоги для середньостатистичного проєкту С++.

63

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

У Manjaro є програма Redshift. Можливо, в репозиторіях Lubuntu вона теж є.

64

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

steamwater написав:
P.Y. написав:

ur_naz дав ліспівський код замість сіплюсплюсного, а ЛІСП, як відомо, є мовою, спеціально зробленою для роботи зі списками, тому програма в нього максимально коротка.

Ну поперше, ви у роздiлi С++, шановний. Тому ваша зневага у виглядi недо сіплюсплюсного висловлювання, не доречна. Я колись трохи кодив на auto-lisp, що є дiалектом Лiспу для AutoCAD. Це дивовижна мова, так. Але якщо казати про списки, то я б вже визначив LUA, тим бiшлше, що вона, iнколи зустрiчається у промислових С++ проектах.
Teg Miles, я все ж зроблю спробу розштурхати вас, до руху у корисному напрямку. Подивiться класс std::forward_list. Якщо спочатку буде незручно (iндусський дiалект англiйскої, навiгацiя по сайту, тощо), чи будуть питання з семантiки, - звертайтесь, - я вiдповiм. Але спочатку по-експерементуйте у кодi. Якщо, ви не вiдгукнентеся, менi доведеться самому продемонструвати, тi виправлення, що покращили б код, про який йшлося вище. Але, на жаль, тодi iнтрига буде втрачена, а моя спроба буде марною.

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

65

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

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

Вони дають вже готову структуру для зв'язаного переліку.

Ну, по-перше, в мене iї не було. А по-друге, менi std бiльш до вподоби. Вам теж раджу. Там iнтерфейс не дає доступу до таких речей як покажчики на ноди. Тобто дивлячись на С-шний код у плюсовiй обгортцi, ви не вчитеся програмувати на плюсах. Ще й можуть бути рецiдиви взяти й застосувати uniqe-ptr у такому кодi... Тут я вам не допоможу.
Ще цiкавiше, той факт, що вiд таких завданнь є бiльш небезпечна шкода. Це не сумiснiсть умов по логицi та складностi. Список не має вiдношення до задачи перекодування чисел залежно вiд порядку цифр. Це схоже на завдання злiтати на Мiсяць i вирiшити там на пiску дрючком рiвняння x-5 = 1-x.

Просто на LeetCode багато математиків, тому така несумісність.
Їм подобається літати на Місяць, бо доводиться багато розрахунків робити:).

66

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

steamwater написав:

Вхiднi cписки можуть бути рiзного розмiру?
Не вiдповiдаєте. Ну тодi для загального випадку, може бути так:

#include <iostream>
#include <forward_list>
using std::cout;
using std::forward_list;

int main()
{
    using LS = forward_list<int>;
    using l_it = LS::iterator;

    //LS ls1{8, 7, 6, 9};//also works just fine
    LS ls1{8, 7, 6, 1};
    LS ls2{7, 6, 5};


    auto ls1_sz=std::distance(ls1.begin(), ls1.end());
    auto ls2_sz=std::distance(ls2.begin(), ls2.end());

    LS &ls_first=ls1_sz<ls2_sz? ls1:ls2;
    LS &ls_second=&ls_first==&ls1? ls2:ls1;

    LS ls_res;

    int remind(0), res(0);

    l_it it_frst=ls_first.begin();
    l_it it_end=ls_first.end();
    l_it it_sec=ls_second.begin();
    l_it it2_end=ls_second.end();

    res= *it_frst+*it_sec;
    remind=res/10;
    res%=10;

    ls_res.push_front(res);
    l_it it_res=ls_res.begin();

        ++it_frst;
        ++it_sec;

    for(;it_frst!=it_end;)
    {
        res= *it_frst+*it_sec+remind;

        remind=res/10;
        res%=10;
        it_res=ls_res.insert_after(it_res, res);
        ++it_frst;
        ++it_sec;
    }

     for(;it_sec!=it2_end;)
     {
        res=*it_sec+remind;
        remind=res/10;
        res%=10;
        it_res=ls_res.insert_after(it_res, res);
        ++it_sec;
     }

    if(remind)
    ls_res.insert_after(it_res, remind);     

    for(auto el:ls_res)cout<<el<<' ';

    return 0;
}

Так, бувають різного розміру. Вони дають вже готову структуру для зв'язаного переліку.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        
    }
};

67

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

steamwater написав:

Тобто, цифри. Вже краще. Але як воно стосується списку, незрозумiло. Це може бути масив, вектор, тощо. Ну гаразд. Тож,  якщо маємо, скажiмо:
{1, 2, 3}
{3, 4, 5}
то матимемо:
{4, 6, 8}
?

Так.

68

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

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

Завдання звідси:

Teg Miles, там треба рееструватись, а я не хочу. Може скопуєте текст завдання? Вiн не має бути великим?

Дано два непорожніх зв'язаних переліки, які являють собою два не негативні числа.
Числа подані в зворотному порядку і кожен із вузлів містить лише одну цифру.
Додайте ці два числа і поверніть результат у вигляді зв'язаного переліку.
Будь-які два числа не починаються з нуля, окрім власне нуля.

69

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

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

Ви як звичайно числа записуєте?

У int воно пишеться у бiнарному i може бути записане у зворотньому порядку. Чому ви вважаєте реверс-кодування десятичного переважаючим. Десятичне це те що виводиться на екран як представлiння, а у елемент списку чи будь-якого контейнеру воно пишеться, за звичай, iнакше - тобто у бiнарному форматi. Ви можете задати формат навiть строково, але це треба описати. До того ж у зворотньому порядку можуть бути записанi не тiлькi числа. Числа можуть бути записанi як треба i тодi їх формат не матиме значення, а у зворотньому порядку вони могуть слiдувати як елементи самого списку, бо саме так були записанi у список. Чи є однозначнiсть з вказаних мiркуваннь у цьому текстовi:

Teg Miles написав:

Є два числа у форматі linked list записані в зворотному порядку, треба їх додати і повернути в тому ж форматі.

?
Моє птання до ТС лишається у силi. Якщо бракує сил чи бажання, - можна дати посилання на пешоджерело.

Завдання звідси: https://leetcode.com/explore/learn/card … sion/1228/

70

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

koala написав:
new_l1 = new ListNode(item);

Як саме new_l1 чіпляється до списку?

            if (item < 10) { // о, ви вирішили оптимізувати код - замість ділення і залишку використовуєте порівняння і гілки
                new_l1->val = item;
                rest = 0;
            } else { // а ні
                rest = item / 10;
                new_l1->val = item % 10;
            }

Цей код виглядає як вираз "чоловічий статевий хуй": довго і безглуздо.

Усе правильно, код має відповідати розмірам статевого органа програміста:).
А що там коїться в однорядкових — це їхня особиста трагедія:).
І взагалі, не шарите ви в модних італійських патернах:).

Ось чим усе скінчилося:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* new_l1 = l1;
        ListNode* new_l2 = l2;
        int rest { 0 };
        ListNode* dummy = new ListNode();
        ListNode* current = dummy;
        while (new_l1 || new_l2 || rest) {
            int sum = (new_l1 ? new_l1->val : 0) + (new_l2 ? new_l2->val : 0) + rest;
            rest = sum / 10;
            current->next = new ListNode(sum % 10);
            current = current->next;
            new_l1 = new_l1 ? new_l1->next : new_l1;
            new_l2 = new_l2 ? new_l2->next : new_l2;
        }
        return dummy->next;
    }

71

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

Є два числа у форматі linked list записані в зворотному порядку, треба їх додати і повернути в тому ж форматі.
Роблю ось так:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* new_l1 = l1;
        ListNode* new_l2 = l2;
        int rest { 0 };
        while (new_l1 && new_l2) {
            int item = new_l1->val + new_l2->val + rest;
            if (item < 10) {
                new_l1->val = item;
                rest = 0;
            } else {
                rest = item / 10;
                new_l1->val = item % 10;
            }
            new_l1 = new_l1->next;
            new_l2 = new_l2->next;
        }
        if (new_l2) {
            while (new_l2) {
                int item = new_l2->val + rest;
                if (item < 10) {
                    new_l1 = new ListNode(item);
                    rest = 0;
                } else {
                    rest = item / 10;
                    new_l1 = new ListNode(item % 10);
                }
                new_l2 = new_l2->next;
                new_l1 = new_l1->next;
            }
        } else if(new_l1) {
            while (new_l1) {
                int item = new_l1->val + rest;
                if (item < 10) {
                    new_l1->val = item;
                    rest = 0;
                } else {
                    rest = item /10;
                    new_l1->val = item % 10;
                }
                new_l1 = new_l1->next;
            }
        }
        if (rest > 0) {
            new_l1 = new ListNode(rest);
        }
        return l1;

При переліках різної довжини губиться перша цифра числа (остання для переліку).

72

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

koala написав:

Для масиву - не можна. А от для чисел від 1 до n - можна.
Підказка: чому дорівнює XOR усіх чисел від 1 до 2n?

Гадки не маю, чому він дорівнює, log2(n)? Мені був потрібен лише певний проміжок, а не всі числа від 1 до n.

73

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

koala написав:

Цікаво, а можна XOR(1..n) знайти швидше за O(n)? Ніби у мене за логарифмічний час виходить.

Думаю, ні. Там же треба перебирати всі елементи, неможливо відкинути якусь частину, як при бінарному пошуку.

74

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

koala написав:

А чому ви, власне, вирішили, що так можна знайти дублікат?

Це використання властивості А^А = 0. Але масив має містити цілі числа від 1 до n,
які послідовно збільшуються, окрім дублікатів.
Тобто для {1, 2, 2} або {1, 2, 2, 3} — це спрацює. А от для {1, 2, 2, 4} — ні.
І в другом циклі там i<n має бути.

75

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

Масив неправильно задано. Треба або прибрати 4, або додати 3.

76

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

Намагаюся знайти дублікат у масиві за допомогою xor ось так:

        vector<int> nums {1, 2, 2 4};
        int item { 0 };
        int n = nums.size();

        for (int i = 0; i < n; ++i) {
            item ^= nums[i];
        }

        for (int i = 1; i <= n; ++i) {
            item ^= i;
        }

        cout << item << endl;

Не працює. Не можу зрозуміти чому.

77

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

Ще раджу встановити cmake-mode та cmake-font-lock (після встановлення додайте (require 'cmake-mode) до файлу налаштувань).
Ці плагіни разом із іншими дадуть вам автодоповнення та кольорову підсвітку функцій при роботі з файлом CMakeLists.txt.

78

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

1. Встановлюєте Emacs. Якщо не вдається запустити його за допомогою пускача в меню програм, правою клавішею мишки зайдіть в налаштування пускача та встановіть позначку навпроти «запустити в терміналі» (це для OS Manjaro, всі подальші поради стосуються цієї ОС). Цей редактор створений для роботи в терміналі, без нього не запуститься.
2. У  вашій домашній теці знайдіть приховану директорію .emacs.d та створіть всередині неї файл init.el. Це ваш файл налаштувань, який ви змінюватимете за потреби.
3. Після запуску зайдіть в Emacs tutorial (перекладений українською) та ознайомтеся з основами керування. Там же є Emacs manual (поки що лише англійською) — це вже повноцінний підручник по Emacs. Раджу на їхньому сайті завантажити його та шпаргалку Emacs reference у форматі pdf.
4. Додайте до файлу налаштувань репозиторій MELPA. Emacs має власний менеджер пакунків через який онлайн можна встановити все, що вам треба. У цьому репозиторії кілька тисяч плагінів для Emacs.

(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
;; Comment/uncomment this line to enable MELPA Stable if desired.  See `package-archive-priorities`
;; and `package-pinned-packages`. Most users will not need or want to do this.
;;(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t)
(package-initialize)

5. За допомогою менеджера пакунків встановіть наступні програми:
auto-complete-clang — автодоповнення clang
catppuccin-theme — тема оформлення
clang-format — форматування коду С++
clang-format+  — автоматичне форматування коду при збереженні
company — основа для автодоповнення тексту (потребує певного рушія)
company-c-headers — автодоповнення для хедерів
company-ctags — підтримка ctags
dracula-theme — тема оформлення
flycheck — перевірка синтаксису, знаходження помилок «на льоту»
flycheck-clang-analyzer
flycheck-clang-tidy
flycheck-clangcheck
flycheck-flawfinder
flycheck-projectile
helm — дуже зручна програма автодоповнення будь-яких команд Emacs і не тільки
helm-company
helm-flycheck
helm-lsp
helm-projectile
helm-xref
lsp-mode — пакет для інтеграції мов програмування та взаємодії з іншими пакетами
projectile — керування проєктами
rainbow-delimiters — кольорове виділення дужок різного рівня
treemacs — менеджер файлів
treemacs-projectile
which-key — програма, що показує наявні комбінації клавіш та інформацію по ним
xclip — копіювання до clipboard та з нього
yasnippet — корисні сніппети автодоповнення, як от автоматичне додавання дужок до функцій
yasnippet-snippets

6. Тепер додайте решту файлу налаштування:

;;Налаштування поточної теми оформлення
(load-theme 'dracula t)
;;(load-theme 'catppuccin :no-confirm)

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

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

;;Налаштування швидкого автодоповнення
(setq gc-cons-threshold (* 100 1024 1024)
      read-process-output-max (* 1024 1024)
      treemacs-space-between-root-nodes nil
      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)

;;Налаштування використання готових сніппетів (наприклад, автоматичне додавання дужок для функції С++)
(add-hook 'c++-mode-hook #'yas-minor-mode)

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

;;Налаштування для менеджера файлів Treemacs
(use-package treemacs
  :ensure t
  :defer t
  :init
  (with-eval-after-load 'winum
    (define-key winum-keymap (kbd "M-0") #'treemacs-select-window))
  :config
  (progn
    ;; The default width and height of the icons is 22 pixels. If you are
    ;; using a Hi-DPI display, uncomment this to double the icon size.
    (treemacs-resize-icons 44)

    (treemacs-follow-mode t)
    (treemacs-filewatch-mode t)
    (treemacs-fringe-indicator-mode 'always)
    (when treemacs-python-executable
      (treemacs-git-commit-diff-mode t))

    (pcase (cons (not (null (executable-find "git")))
                 (not (null treemacs-python-executable)))
      (`(t . t)
       (treemacs-git-mode 'deferred))
      (`(t . _)
       (treemacs-git-mode 'simple)))

    (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)))


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

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

;;Перевірка синтаксису flycheck
(add-hook 'after-init-hook #'global-flycheck-mode)
(add-hook 'c++-mode-hook
          (lambda () (setq flycheck-clang-language-standard "c++20")))
;;Показати помилки відразу в окремому вікні
(add-hook 'flycheck-after-syntax-check-hook
          (lambda  ()
            (if flycheck-current-errors
                (flycheck-list-errors)
              (when (get-buffer "*Flycheck errors*")
                (switch-to-buffer "*Flycheck errors*")
                (kill-buffer (current-buffer))
                (delete-window)))))


;;Налаштування керування проєктами 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 'c-mode-hook 'lsp)
(add-hook 'c++-mode-hook 'lsp)

;;Налаштування clang-format при збереженні
(defun clang-format-save-hook-for-this-buffer ()
  "Create a buffer local save hook."
  (add-hook 'before-save-hook
            (lambda ()
              (when (locate-dominating-file "." ".clang-format")
                (clang-format-buffer))
              ;; Continue to save.
              nil)
            nil
            ;; Buffer local hook.
            t))

;; Run this for each mode you want to use the hook.
(add-hook 'c++-mode-hook (lambda () (clang-format-save-hook-for-this-buffer)))

;;Налаштування для відкривання останнього робочого файлу
(recentf-mode 1)
(setq recentf-max-menu-items 25)
(setq recentf-max-saved-items 25)


;;Налаштування програми автодоповнення команд 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)

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

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

;;Прив'язка компіляції С++ до F5
(define-key global-map [f5] 'compile)
;;Автоматичне натискання Enter при компіляції
(setq compilation-read-command nil)

;;Налаштування команди компіляції
(require 'compile)
 (add-hook 'c++-mode-hook
           (lambda ()
         (unless (file-exists-p "Makefile")
           (set (make-local-variable 'compile-command)
            (let ((file (file-name-nondirectory buffer-file-name)))
                      (format "%s %s"
                              (or (getenv "CC") "cmake")
                              (or (getenv "CPPFLAGS") "-Bbuild/Debug -DCMAKE_BUILD_TYPE=Debug && cd build/Debug && make")
                  ))))))

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

Зверніть увагу, що в мене компіляція та автодоповнення коду створені під CMake файл.

cmake_minimum_required(VERSION 3.5)

project(hello_world
    VERSION 1.0.0
    LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20 )
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_executable(${PROJECT_NAME} main.cpp)

# Цією командою можна зручно встановити бажаний стандарт [c++17, c++20, c++23]
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20)
# Цією командою можна легко додати дефайни, можна вписувати їх на місці
target_compile_definitions(${PROJECT_NAME} PUBLIC _GLIBCXX_DEBUG)
# Цією командою виставляємо прапорці компілятору
target_compile_options(${PROJECT_NAME}
    PUBLIC -Wall
           -Wextra
           -Wpedantic
           -fsanitize=address,undefined)
# Цією командою виставляємо прапорці лінкеру
target_link_options(${PROJECT_NAME}
    PUBLIC -fsanitize=address,undefined)


set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 20)



add_custom_command(
    TARGET ${PROJECT_NAME}
    POST_BUILD
    COMMAND ${PROJECT_NAME}
)



include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

Якщо ви не використовуєте CMake, вам доведеться встановити Bear для генерації відповідного файлу json (в CMake це відбувається ось тут
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)), а також переписати compile-comand в налаштуваннях.
Це лише прості базові налаштування для С++, але для початку вистачить.

79

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

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

Захоче і вийде, він такий

Метод at() нічим не кращий, окрім того, що муляє око.
Я ж вам вже давав налаштування.. Ввімкніть санітайзер, він зробить bounds-checking перевірки для вас, pedantic btw тут ні до чого.

Санітайзер увімкнутий теж, думав, що pedantic за це відповідає.

80

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

koala написав:

Він просто інший.
Якщо ви не певні, чи індекс в межах масиву, то at може бути й стерпним. Але яким чином він тут вийде? Всі розміри - до n.

Захоче і вийде, він такий:).
Я тут подумав, що все одно в мене pedantic увімкнено в налаштуваннях CMake,
а він перевіряє межі для []. Тому, мабуть, дійсно немає сенсу використовувати at() у такому разі.