Старая задача на собеседовании

1. scientes 288 21.09.22 15:58 Сейчас в теме
Есть такая задача. "Напишите функцию суммирования двух целых чисел без использования «+» и других арифметических операторов." Какие есть варианты ее решения в 1С?
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 34 21.09.22 15:59 Сейчас в теме
(1)Добавить в таблицу значений, свернуть.
Добавить в таблицу значений, получить Итог.
Еще можно с помощью запроса.
3. user1831019 21.09.22 16:00 Сейчас в теме
5. user1831019 21.09.22 16:07 Сейчас в теме
(4)
выделить строки, нажать М

(1)
Напишите функцию


Вот прям отличное решение - написать функцию по "выделению строк и нажатию М"...
7. kuzev 47 21.09.22 16:39 Сейчас в теме
8. Prikum 3 21.09.22 16:40 Сейчас в теме
(7)
и других арифметических операторов.
9. Vitaly1C8 21.09.22 16:44 Сейчас в теме
(1) Можно в запросе типа:
Выбрать &число1 + &число2 КАК сумма
10. spacecraft 21.09.22 16:45 Сейчас в теме
(9) неа. не удовлетворяет заданию
без использования «+» и других арифметических операторов.

А вот группировкой в запросе вполне можно.
12. Vitaly1C8 21.09.22 16:48 Сейчас в теме
(10) вот прямо нельзя + использовать ...
Сумма = - ( -Число1 - Число2 );
13. spacecraft 21.09.22 16:48 Сейчас в теме
(12) "и других арифметических операторов." :)
14. Vitaly1C8 21.09.22 16:53 Сейчас в теме
(13) да что же вы творите !!!
11. user1831019 21.09.22 16:45 Сейчас в теме
(9) А! Ну типа если в запросе нарисовать "+", то это не считается арифметической операцией. Круто!
17. spacecraft 21.09.22 17:43 Сейчас в теме
(1) пример сложения целых положительных чисел используя битовые операции:
Функция Сложение2ЦелыхЧисел(Знач Число1, Знач Число2)
	Результат = ПобитовоеИсключительноеИли(Число1,Число2);
	С = ПобитовыйСдвигВлево(ПобитовоеИ(Число1,Число2),1);
	Пока С <> 0 Цикл
		Т = Результат;
		Результат = ПобитовоеИсключительноеИли(Результат,С);
		С = ПобитовыйСдвигВлево(ПобитовоеИ(Т,С),1);
	КонецЦикла;
	Возврат Результат;
КонецФункции
Показать
Irwin; kuzev; starik-2005; +3 Ответить
19. scientes 288 21.09.22 17:54 Сейчас в теме
(17)
Функция Сложение2ЦелыхЧисел(Знач Число1, Знач Число2)
Результат = ПобитовоеИсключительноеИли(Число1,Число2);
С = ПобитовыйСдвигВлево(ПобитовоеИ(Число1,Число2),1);
Пока С <> 0 Цикл
Т = Результат;
Результат = ПобитовоеИсключительноеИли(Результат,С);
С = ПобитовыйСдвигВлево(ПобитовоеИ(Т,С),1);
КонецЦикла;
Возврат Результат;
КонецФункции


Не работает для чисел больше 10^10
21. spacecraft 21.09.22 17:57 Сейчас в теме
(19)
Не работает для чисел больше 10^10

побитовые операции ограничены 2^32.
23. spacecraft 21.09.22 18:03 Сейчас в теме
(19) это задача не чисто по 1С. Это задача общая для программирования. И в ней не случайно сделан акцент на целые числа.
По канону это задача на битовую алгебру.
40. starik-2005 3033 22.09.22 21:06 Сейчас в теме
(17) Слишком много слов...
Функция С(А, Б)
  Если Б Тогда
    Возврат С( ПобитовоеИсключительноеИли( А , Б ), ПобитовыйСдвигВлево( ПобитовоеИ( А , Б ), 1 ) );
  Иначе
    Возврат А 
  КонецЕсли;
КонецФункции;

За неимением 1С дома делаю это на С++.
$ cat add.cpp 
#include <stdio.h>

int C(int a, int b)
{
  if(b) return C(a^b, (a&b)<<1); else return a;
}

int main()
{
  printf("%i", C(20,19));
}

$ g++ add.cpp 
$ ./a.out 
39
Показать
25. dehro 5 21.09.22 20:01 Сейчас в теме
(1)Преобразовать в строки. И сложить "в столбик".
35. tusv 210 22.09.22 09:53 Сейчас в теме
(1) Это не готовый запрос(без напильника работать не будет), а наводка на решение без "+"
)Запрос  = Новый Запрос(" Сумма(&МассивСлогаемых) из &МассивМассивСлогаемых);
4. user1203706 12 21.09.22 16:04 Сейчас в теме
(1) вывести в моксель, выделить строки, нажать М..далее пасте в любую ячейку
6. user1203706 12 21.09.22 16:31 Сейчас в теме
(5) выделить строки легко, букву М нажать скриптом через передачу комбинации клавиш, пасте - аналогично

Кому надо, слепят
15. scientes 288 21.09.22 17:08 Сейчас в теме
Как один из вариантов.
Функция Задача(а,б) экспорт
	перем с;
	
	м=новый массив;
	м.Добавить("с");
        м.Добавить("=");
	м.Добавить(а);
	м.Добавить(Символ(43));
	м.Добавить(б);
	Выполнить(СтрСоединить(м));

       возврат с;
КонецФункции
Показать
16. scientes 288 21.09.22 17:11 Сейчас в теме
Можно использовать
   ДобавитьМесяц(..)
18. SlavaKron 21.09.22 17:53 Сейчас в теме
Поток = Новый ПотокВПамяти;
Поток.Перейти(Число1, ПозицияВПотоке.Текущая);
Поток.Перейти(Число2, ПозицияВПотоке.Текущая);
Сообщить(Поток.ТекущаяПозиция());
20. scientes 288 21.09.22 17:56 Сейчас в теме
(18) Число вариантов растет
22. SlavaKron 21.09.22 18:02 Сейчас в теме
Можно эмулировать сложение в столбик.
24. Vitaly1C8 21.09.22 20:01 Сейчас в теме
26. user1831019 21.09.22 20:04 Сейчас в теме
(24) И откуда возьмется регистратор? Если нужна просто одна функция?
27. Vitaly1C8 21.09.22 20:06 Сейчас в теме
(26) внутри функции и создадим :)
28. user1831019 21.09.22 20:08 Сейчас в теме
(27) Вам с такими предложениями надо быть поаккуратнее. А то уволят. И сразу на войну поедете.

Хотя вы уже и так там.
29. lefthander 21.09.22 20:10 Сейчас в теме
много лет в 1С но ни разу не было такой ситуации когда нужно сложить два числа без "+" ;)
30. user1831019 21.09.22 20:18 Сейчас в теме
(29) А причем тут 1С? Это задача на программирование, а не на знание 1С.
Ну вот типа как старая добрая задача "Есть две числовые переменные А и В, необходимо поменять их значения местами, не прибегая к использованию третьей переменной."
32. lefthander 21.09.22 21:14 Сейчас в теме
(30)И такая задача тоже в 1С не попадалась, хотя на собесах спрашивали... я встречно задавал вопрос - Вам точно нужен программист 1С? ;) Понятно что в такие конторы я не попадал
33. user1831019 21.09.22 21:39 Сейчас в теме
(32) Понятно, что не попадал. Потому что у тебя нет логического мышления. Это задачи на логику. На поиск логического решения.
А не на регистры со справочниками.
41. lefthander 23.09.22 10:19 Сейчас в теме
(33)Программисту 1С в первую очередь надо знать регистры и справочники, логическое мышление а именно логика И, ИЛИ, НЕ ИЛИ - нужна но гораздо меньше. Все уже есть в языке 1С.
Sharap09; +1 Ответить
42. user1831019 23.09.22 11:11 Сейчас в теме
(41) Тому, кто просто пишет код по детальным техзаданиям - наверное да, мозги не нужны. А тому, кто придумывает решения проблем - нужны навыки поиска этих решений.
43. lefthander 23.09.22 12:05 Сейчас в теме
(42)Это потому что Вы считаете свое мнение правильным, но есть и другие мнения - просто так сложилось. мне за 25 лет с 1С ни разу не приходилось менять значения без третьей переменной. и напридумывал я за это время достаточно много разных решений и обошелся без знания решения этой задачи. Насчет мозгов - иногда встречается такой код, написанный спецом с мозгами, что плакать хочется. Надеюсь у Вас они есть, ну хотя бы для того что бы не развивать холивар.
Sharap09; +1 Ответить
44. user1831019 23.09.22 12:27 Сейчас в теме
(43)
без знания решения этой задачи
Дело не в ЗНАНИИ именно ЭТОЙ задачи. Цель этой задачи - понять, как у претендента работают мозги, и сумеет ли он за короткое время найти решение нестандартной задачи.

Судя по всему - вам не понять.
starik-2005; +1 Ответить
47. lefthander 23.09.22 12:44 Сейчас в теме
(44)Все может быть, я ведь тоже не уверен что Вы ПОНЯЛИ о чем речь.
45. ishelper 23.09.22 12:33 Сейчас в теме
(41)
Все уже есть в языке 1С.
Ага, именно по этому критерию различаю программистов и 1Сников: вторые убеждены, что на любую дурную хотелку кодера или заказчика в 1С обязательно должна быть "готовая функция".

Примеров тому - полно на форуме.
46. lefthander 23.09.22 12:43 Сейчас в теме
(45)Да я 1Сник и не стыжусь, возможно к программистам не имею отношения. Но я доволен тем что делаю, и те, кому я это делаю тоже не жалуются. ;)
soft_wind; +1 Ответить
34. ls600 22.09.22 07:14 Сейчас в теме
(30)
На питоне легко
a = 2
b = 3
a,b = b,a

print("a:",a,"b:",b)

##Ответ: a: 3 b: 2
36. SlavaKron 22.09.22 10:13 Сейчас в теме
(34) Да и на 1С. (XOR-обмен)
Число1 = ПобитовоеИсключительноеИли(Число1, Число2);
Число2 = ПобитовоеИсключительноеИли(Число2, Число1);
Число1 = ПобитовоеИсключительноеИли(Число1, Число2);
37. user1831019 22.09.22 10:19 Сейчас в теме
(36) Да хоть на чем:

A = A + B
B = A - B
A = A - B
38. spacecraft 22.09.22 10:22 Сейчас в теме
(34) Это всего навсего синтаксический сахар. Но да, удобно.
Но и обычным способом не сложно:
a = a + b;
b = a - b;
a = a - b;
31. Vitaly1C8 21.09.22 20:23 Сейчас в теме
можно обратиться к текстовому каналу Алисы или Маруси типа: Алиса сложи числа Х и Y
48. AlexandrSmith 68 23.09.22 13:52 Сейчас в теме
Да, я помню решил не читая такой перечень инструкций, услышав её в первый раз в жизни. Кто интересно её на собеседовании задавать теперь будет. Жесть просто.
49. scientes 288 29.09.22 13:59 Сейчас в теме
Вариант сложения через цикл.
Функция СложитьВЦикле(ч1,ч2) export
	i=ч2;
	для k=1 по ч1 цикл
		для j=i по i цикл конеццикла;
		i=j
	конеццикла;	
	
	возврат i;
конецфункции	




Показать
50. user1831019 29.09.22 14:26 Сейчас в теме
(49) Математическая чушь. Не сработает.
51. SlavaKron 29.09.22 15:03 Сейчас в теме
(50) Почему же? Используется особенность – после выхода из цикла, счетчик увеличивается на 1.
То есть, после цикла "для j=i по i цикл конеццикла;" j будет на 1 больше, чем i.
scientes; +1 Ответить
52. пользователь 29.09.22 16:44
Сообщение было скрыто модератором.
...
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)