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

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

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


Вот прям отличное решение - написать функцию по "выделению строк и нажатию М"...
7. kuzev 48 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 295 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 3082 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 7 21.09.22 20:01 Сейчас в теме
(1)Преобразовать в строки. И сложить "в столбик".
35. tusv 212 22.09.22 09:53 Сейчас в теме
(1) Это не готовый запрос(без напильника работать не будет), а наводка на решение без "+"
)Запрос  = Новый Запрос(" Сумма(&МассивСлогаемых) из &МассивМассивСлогаемых);
4. user1203706 14 21.09.22 16:04 Сейчас в теме
(1) вывести в моксель, выделить строки, нажать М..далее пасте в любую ячейку
6. user1203706 14 21.09.22 16:31 Сейчас в теме
(5) выделить строки легко, букву М нажать скриптом через передачу комбинации клавиш, пасте - аналогично

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

       возврат с;
КонецФункции
Показать
16. scientes 295 21.09.22 17:11 Сейчас в теме
Можно использовать
   ДобавитьМесяц(..)
18. SlavaKron 21.09.22 17:53 Сейчас в теме
Поток = Новый ПотокВПамяти;
Поток.Перейти(Число1, ПозицияВПотоке.Текущая);
Поток.Перейти(Число2, ПозицияВПотоке.Текущая);
Сообщить(Поток.ТекущаяПозиция());
20. scientes 295 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 69 23.09.22 13:52 Сейчас в теме
Да, я помню решил не читая такой перечень инструкций, услышав её в первый раз в жизни. Кто интересно её на собеседовании задавать теперь будет. Жесть просто.
49. scientes 295 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
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот