powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / из тестового задания
25 сообщений из 166, страница 2 из 7
из тестового задания
    #39149723
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hclubmk,
просто и со вкусом
=)
...
Рейтинг: 0 / 0
из тестового задания
    #39149748
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hclubmkПопробую предложить.
Каждый выключатель во включенном состоянии имеет свой вес: 1,2,3...40;
если выключен: вес равен 0.
Остаток от деления суммы весов переключателей на 8 и будет искомая комната.
Полагаю, достаточно будет включить или выключить 1 из переключателей, чтобы условие выполнилось.

пусть включены следующие выключатели

[3, 4, 11, 19, 27, 35]
...
Рейтинг: 0 / 0
из тестового задания
    #39149749
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hclubmkПопробую предложить.
Каждый выключатель во включенном состоянии имеет свой вес: 1,2,3...40;
если выключен: вес равен 0.
Остаток от деления суммы весов переключателей на 8 и будет искомая комната.
Полагаю, достаточно будет включить или выключить 1 из переключателей, чтобы условие выполнилось.

пусть включены следующие выключатели
[3, 4, 11, 19, 27, 35]

шпион в комнате номер 6

ваши действия?
...
Рейтинг: 0 / 0
из тестового задания
    #39149764
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,
очевидно: включить 37
...
Рейтинг: 0 / 0
из тестового задания
    #39149767
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отбой
...
Рейтинг: 0 / 0
из тестового задания
    #39149799
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hclubmk,

sum( [3, 4, 11, 19, 27, 35, 37] ) = 136
136 % 8 = 0
0: соответствует комнате номер 8
...
Рейтинг: 0 / 0
из тестового задания
    #39149802
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabвключены следующие выключатели
[3, 4, 11, 19, 27, 35]

шпион в комнате номер 6

ваши действия?

Значимыми считаем первые 7 тумблеров. Остальные игнорируем.
Текущая сумма 3+4=7. Требуется получить сумму, которая при делении на 8 даст в остатке 6. Ближайшие такие суммы - 6 и 14. 6 получить одним переключением нельзя. 14 - можно (3+4+7).
Наши действия - включить тумблер 7.
...
Рейтинг: 0 / 0
из тестового задания
    #39149824
Apoj_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabhclubmkПопробую предложить.
Каждый выключатель во включенном состоянии имеет свой вес: 1,2,3...40;
если выключен: вес равен 0.
Остаток от деления суммы весов переключателей на 8 и будет искомая комната.
Полагаю, достаточно будет включить или выключить 1 из переключателей, чтобы условие выполнилось.

пусть включены следующие выключатели
[3, 4, 11, 19, 27, 35]

шпион в комнате номер 6

ваши действия?
Предлагаю слегка модифициривать алгоритм: брать не по модулю 8, а по модулю 9 (чтоб 40 нацело не делился на модуль). Ну и результататы, к примеру 0 и 8 считать равными
Ну и соответственно изменять переключатель так, чтобы верной была сумма по модулю:

let test = [3;4;11;19;27;35];;
(List.fold Acc 0 test)%9;;
> val it : int = 0

let test = [3;4;6;11;19;27;35];;
(List.fold Acc 0 test)%9;;

> val it : int = 6
...
Рейтинг: 0 / 0
из тестового задания
    #39149853
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
текущая конфигурация
[3, 4, 11, 19, 27, 35]

если использовать алгоритм hclubmk и включить выключатель 7, то в сумме получим 106
106 % 8 = 2, что соответствует комнате номер 2

если ваш алгоритм отличается (пусть незначительно), то опишите его,
и тогда подумаем над новой конфигурацией и действиями
...
Рейтинг: 0 / 0
из тестового задания
    #39149854
Apoj_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
соотвественно, когда мы делаем аналогичную подставу с mod 9

let Acc acc i = acc + i;;
let test = [3;5;12;21;30;39];;
(List.fold Acc 0 test)%9;;


оно отрабатывает корректно

let Acc acc i = acc + i;;
let test = [3;5;12;13
;21;30;39];;
(List.fold Acc 0 test)%9;;
...
Рейтинг: 0 / 0
из тестового задания
    #39149858
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Apoj_sql,

я подумаю, где-то вечером отпишусь
...
Рейтинг: 0 / 0
из тестового задания
    #39149892
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabесли ваш алгоритм отличается (пусть незначительно), то опишите его,
Не отличается по сути, отличается в деталях. Все отличия описаны в решении.
...
Рейтинг: 0 / 0
из тестового задания
    #39149906
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Это не очевидно, что ваш алгоритм (перебор?) всегда найдет решение.

Можете доказать?
...
Рейтинг: 0 / 0
из тестового задания
    #39149921
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЗначимыми считаем первые 7 тумблеров. Остальные игнорируем. Боюсь, при раскладке [4,5,6,7] комнату 4 при ограниченности в первые 7 тумблеров, указать не получится, увы. 7 тумблеров - это минимально-необходимое, но недостаточное условие.
...
Рейтинг: 0 / 0
из тестового задания
    #39149928
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hclubmkпри раскладке [4,5,6,7] комнату 4 при ограниченности в первые 7 тумблеров, указать не получится
Верно. Это относится к любому случаю, когда бинарная чётность комнаты и текущей суммы равны, но текущая сумма не равна нужной комнате.
Думаю, этих соображений достаточно, чтобы сформулировать решение... если нет - попробуйте построить все возможные варианты для произвольной текущей суммы на числовой прямой.
...
Рейтинг: 0 / 0
из тестового задания
    #39149929
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. У меня получается, что потребуется задействовать 8 тумблеров.
...
Рейтинг: 0 / 0
из тестового задания
    #39149950
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
я не постесняюсь задать вопрос, аналогично заданного мне mini.weblab, при неизменности алгоритма и ограниченности 8-ю тумблерами:

пусть включены следующие выключатели
[4,5,6,7]

шпион в комнате номер 4

ваши действия?
...
Рейтинг: 0 / 0
из тестового задания
    #39149960
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hclubmkпри неизменности алгоритма и ограниченности 8-ю тумблерами
Когда нарисуешь, поймёшь, что алгоритм нужно доработать... ибо все точки, если выбросить исходную, отличаются на 2, а не на 1. Кстати, это не только укажет на то, что нужно 8 тумблеров, но и то, что можно модифицировать исходное условие и ввести дополнительное (хотя оно и излишнее) требование, что один тумблер перещёлкивается обязательно.
...
Рейтинг: 0 / 0
из тестового задания
    #39149962
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и соответственно делить надо на 16, а не на 8...
...
Рейтинг: 0 / 0
из тестового задания
    #39149969
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что я должен понять? Что алгоритм нужно доработать? Это мне понятно. Я пытался понять ход твоего решения, и исходя из частного (приведенного) случая, узнать число. Ну да ладно.
...
Рейтинг: 0 / 0
из тестового задания
    #39149974
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina и hclubmk,

Кто-нибудь из вас может ответить на 18696977 ?
...
Рейтинг: 0 / 0
из тестового задания
    #39149977
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЗначимыми считаем первые 7 тумблеров. Остальные игнорируем.
Текущая сумма 3+4=7. Требуется получить сумму, которая при делении на 8 даст в остатке 6. Ближайшие такие суммы - 6 и 14. 6 получить одним переключением нельзя. 14 - можно (3+4+7).
Наши действия - включить тумблер 7.
Все выключены, надо задать комнату 8
Включен 1-й, надо задать комнату 2
...
Рейтинг: 0 / 0
из тестового задания
    #39149991
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХЗ как решать, но я проверялку написал
Исходник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
#include <stdio.h>

// Количество переключателей
#define SWITCH_COUNT 30

// выключатели
bool arr[SWITCH_COUNT + 1] = { 0 };

// Алгоритм проверки, возвращает номер комнаты
int algo() {
	int sum = 0;
	for (int i = 1; i <= SWITCH_COUNT; i++) {
		if (arr[i]) sum = sum + i;
	}
	return sum % 11;
}

// Проверка текущей комбинации в arr, возврашает true если возможны все варианты 1 ... 8
bool check() {
	bool res[9] = { 0 };
	int fill = 0;
	// текущее значение массива
	int x = algo();
	if(x >= 1 && x <= 8) {
		res[x] = true;
		fill++;
	}
	// Переключаем все по одному
	for (int i = 1; i <= SWITCH_COUNT; i++) {
		arr[i] = !arr[i];
		x = algo();
		arr[i] = !arr[i];
		if (x >= 1 && x <= 8 && !res[x]) {
			res[x] = true;
			fill++;
			if (fill == 8) break;
		}
	}
	if(fill == 8) {
		return true;
	} else {
		printf("\nAbsent:");
		for (int i = 1; i <= 8; i++) {
			if (!res[i]) printf(" %d", i);
		}
		return false;
	}
}

void test() {
	int max = 0;
	// Перебор всех вариантов
	while(check()) {
		int i = 1;
		for (; i <= SWITCH_COUNT; i++) {
			if(arr[i]) {
				arr[i] = false;
			} else {
				arr[i] = true;
				if(i > max) {
					max = i;
					printf("test: %d switch\n", max);
				}
				break;
			}
		}
		if(i > SWITCH_COUNT) {
			printf("WIN\n");
			break;
		}
	}
	printf("\nSwitch on:");
	for (int i = 1; i <= SWITCH_COUNT; i++) {
		if (arr[i]) printf(" %d", i);
	}
	printf("\n");
}


Тупо генерит все варианты и проверяет что из каждого можно получить все 8 комнат одним переключением.

Алгоритм в методе algo(), менять только его.

SWITCH_COUNT - кол-во переключателей. 40 это очень долго 10^13 вариантов.
Тестил на 30.

Формула SUM % N не работает при N от 9 до 13, дальше не тестил.
...
Рейтинг: 0 / 0
из тестового задания
    #39150046
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю надо для начала задачу упростить:
Две комнаты кодируются одним выключателем.
Три уже проблема. Надо сначала решать с 3 комнатами. Или с 4 (т.к. степень двойки как и 8). Затем тот же алгоритм применить на 8.

Для 3-х у меня уже ничего не придумывается
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
#include <stdio.h>

// Количество переключателей
#define SWITCH_COUNT 25

// Количество комнат
#define ROOM_COUNT 3

// выключатели
bool arr[SWITCH_COUNT + 1] = { 0 };

// Алгоритм проверки, возвращает номер комнаты
int algo() {
	int sum = 0;
	for (int i = 1; i <= SWITCH_COUNT; i++) {
		if (arr[i]) sum = sum + i;
	}
	return sum % 4;
}

// Проверка текущей комбинации в arr, возврашает true если возможны все варианты 1 ... 8
bool check() {
	bool res[ROOM_COUNT + 1] = { 0 };
	int fill = 0;
	// текущее значение массива
	int x = algo();
	if(x >= 1 && x <= ROOM_COUNT) {
		res[x] = true;
		fill++;
	}
	// Переключаем все по одному
	for (int i = 1; i <= SWITCH_COUNT; i++) {
		arr[i] = !arr[i];
		x = algo();
		arr[i] = !arr[i];
		if (x >= 1 && x <= ROOM_COUNT && !res[x]) {
			res[x] = true;
			fill++;
			if (fill == ROOM_COUNT) break;
		}
	}
	if(fill == ROOM_COUNT) {
		return true;
	} else {
		// Список номеров комнат, которые невозможно получить
		printf("\nAbsent:");
		for (int i = 1; i <= ROOM_COUNT; i++) {
			if (!res[i]) printf(" %d", i);
		}
		return false;
	}
}

void test() {
	int max = 0;
	// Перебор всех вариантов
	bool win = true;
	while(1) {
		if(!check()) {
			win = false;
			break;
		}
		int i = 1;
		for (; i <= SWITCH_COUNT; i++) {
			if(arr[i]) {
				arr[i] = false;
			} else {
				arr[i] = true;
				if(i > max) {
					max = i;
					printf("test: %d switch\n", max);
				}
				break;
			}
		}
	}
	if (win) {
		printf("WIN\n");
	} else {
		// Список включенных выключателей
		printf("\nSwitch on:");
		for (int i = 1; i <= SWITCH_COUNT; i++) {
			if (arr[i]) printf(" %d", i);
		}
		printf("\n");
	}
}


Если кто будет запускать: добавил кол-во комнат (ROOM_COUNT)

PS Aleksandr Sharahov, заглянул под спойлер, понятнее не стало.

PPS Это какая-то олимпиадная задачка.
...
Рейтинг: 0 / 0
из тестового задания
    #39150048
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

на самом деле это чрезвычайно простая задача,
даже и не задача вовсе,
просто необыкновенно сильно сбивает с толку )
...
Рейтинг: 0 / 0
25 сообщений из 166, страница 2 из 7
Форумы / Программирование [игнор отключен] [закрыт для гостей] / из тестового задания
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]