powered by simpleCommunicator - 2.0.34     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / из тестового задания
25 сообщений из 166, страница 6 из 7
из тестового задания
    #39151440
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изломал всю голову "простым" решением 18700090 от kealon(Ruslan), точнее тем как его объяснить. Как работает - понятно. Не мог придумать как назвать его таблицу, в итоге получилось как всегда - раз нельзя назвать, значит что-то не так.

Тотже алгоритм:
для шифрования: берем номер двери и делаем xor всех номеров включенных переключателей. Получаем номер того который надо переключить.
для дешифрования: xor всех включенных переключателей.


Например: включены переключатели 3,7. Надо указать на 6 дверь.
6 ^ 3 ^ 7 = 2-й переключатель надо переключить
2 ^ 3 ^ 7 = 6-я дверь

Требуемое количество переключателей : должны быть все переключатели используемого битового диапазона, т.к. в результате xor может получиться больше, например 4^3 = 7, т.е. если используется 3 бита, то надо все до 2^3 (=8), т.е. от 1 до 7, ноль не надо т.к. X ^ 0 = X, поэтому всего 2^N - 1, где N количество используемых бит.

Для 8 дверей хватит 3 бит (7 переключателей) если двери нумеровать с нуля, а не с 1. Иначе надо 15 переключателей.
...
Рейтинг: 0 / 0
из тестового задания
    #39151462
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИзломал всю голову "простым" решением 18700090 от kealon(Ruslan), точнее тем как его объяснить.


В 18703610 , не просто доказывается достаточность,
но еще и конструируется алгоритм, основанный на манипуляциях с подмножествами.

А алгоритм 18700090 - это как бы срез (следствие) общего алгоритма
применительно к отдельным битам.
...
Рейтинг: 0 / 0
из тестового задания
    #39151614
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

как я понимаю (заранее прошу прощение за терминологию)
1)
если взять достаточное число бит, то
операция побитового инвертирования позволяет получить все числа из множества чисел, которые требуется закодировать
2)
пример: нам нужно закодировать числа от 1 до 8
для хранения чисел потребуется 3 бита. Числовой ряд: 000, 001, ..., 111
или
множество чисел {1, 2, ..., 8} отображается 1:1 во множество двоичных чисел {000, 001, ..., 111}

пусть у нас задано одно из чисел диапазона, допустим 2 -> 001
с помощью побитового инвертирования мы можем получить из двойки все оставшиеся комбинации диапазона

- инвертируем 1 бит в числе, получаем С(1, 3) комбинаций (чисел)
- инвертируем 2 бита в числе, получаем С(2, 3) комбинаций (чисел)
- инвертируем все 3 бита в числе, получаем С(3, 3) комбинаций (чисел)

3)
каждую получившуюся комбинацию мы отображаем в бит ключа. для каждой комбинации - свой бит
чтобы посчитать размер ключа нужно сложить все комбинации получившиеся в результате операции побитового инвертирования

4)
я еще не все до конца додумала
...
Рейтинг: 0 / 0
из тестового задания
    #39151629
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovmini.weblabОпределим ключ как последовательность значимых переключателей
Пусть имеются числа от 1 до n.
Требуется закодировать заданное число от 1 до n.
Метод кодировки: изменение одного бита в произвольно заданном ключе
Задача: Рассчитать необходимый и достаточный размер ключа

Это хороший повод поговорить по душам с тестирующим )
Плюс в том, что разговор может получиться длинным и своем поле.
Минус в том, что при этом его легко обидеть.
Ваши шансы возрастают, если разговор будет на троих )
это наезд, да ? :)
вы просто скажите, где неправильно :)
...
Рейтинг: 0 / 0
из тестового задания
    #39151668
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabэто наезд, да ? :)
вы просто скажите, где неправильно :)

Наоборот, все правильно.
И это может стать проблемой, если вдруг окажется правильней, чем у экзаменующего )
...
Рейтинг: 0 / 0
из тестового задания
    #39151692
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет еще раз.

Вобщем 3 часа грыз ручку. Часа два вчера.

И сегодня час. Нарисовал следующее решение.

Прошу прощения коллеги если боян. Я уже не в состоянии осилить трафик
потоков сознания который был написан.

Я приаттачу свои мысли на бумаге. И если у кого-то будут вопросы - отвечу.

Для меня вывод - решение существует. И в 40 переключателях можно закодировать
номера дверей от 1 до 32х.
...
Рейтинг: 0 / 0
из тестового задания
    #39151693
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
из тестового задания
    #39151695
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
из тестового задания
    #39151696
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
из тестового задания
    #39151698
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
из тестового задания
    #39151699
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
из тестового задания
    #39151703
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения за сбой в нумерации. Пункты 5,6,7 одной фоткой почти вышло.
...
Рейтинг: 0 / 0
из тестового задания
    #39151727
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, прочитай то что жирным написано 18705910 работа с битами тут не нужна. Надо только определить сколько бит надо использовать.
...
Рейтинг: 0 / 0
из тестового задания
    #39151747
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, спасибо. Ты очень любезен.
...
Рейтинг: 0 / 0
из тестового задания
    #39151855
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Переделал у себя в программе нумерацию подмножеств аналогично 18705910 .
В результате избавился от массива констант, т.к. теперь биты номера комнаты,
входящие в подмножество в точности совпадают с битами номера подмножества.
Спасибо за идею.

исходник программы
Код: pascal
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.
function CodeToNumber(Code: cardinal): cardinal;
var
  SetNo: cardinal;
begin;
  Result:=0;
  SetNo:=1;
  while Code<>0 do begin;
    if Code and 1<>0 then Result:=Result xor SetNo;
    Code:=Code shr 1;
    inc(SetNo);
    end;
  end;

function GetNewCode(Code, Number: cardinal): cardinal;
begin;
  Number:=CodeToNumber(Code) xor Number;
  if Number<>0 then Code:=1 shl (Number-1) xor Code;
  Result:=Code;
  end;

const
  BitCount= 2;
  MaxNumber= 1 shl BitCount - 1;
  MaxCode= 1 shl MaxNumber - 1;

procedure TForm1.btnValidateClick(Sender: TObject);
var
  Code, Number, NewCode, NewNumber: cardinal;
begin;
  for Code:=0 to MaxCode do for Number:=0 to MaxNumber do begin;
    NewCode:=GetNewCode(Code, Number);
    NewNumber:=CodeToNumber(NewCode);
    if NewNumber<>Number then begin;
      Memo1.Lines.Add(Format('Error: Code=%d Number=%d NewCode=%d NewNumber=%d',
                              [Code, Number, NewCode, NewNumber]));
      exit;
      end;
    end;
  Memo1.Lines.Add('Done.');
  end;

procedure TForm1.btnTableClick(Sender: TObject);
var
  Code, Number: cardinal;
  s: string;
begin;
  s:='OldCode\No';
  for Number:=0 to MaxNumber do s:=s + Format('%3d  ',[Number]);
  Memo1.Lines.Add(s);
  for Code:=0 to MaxCode do begin;
    s:=Format('%5d   ',[code]);
    for Number:=0 to MaxNumber do s:=s+Format('%5d',[GetNewCode(Code, Number)]);
    Memo1.Lines.Add(s);
    end;
  end;




таблица для 4х комнат
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
OldCode\No  0    1    2    3
    0       0    1    2    4
    1       0    1    5    3
    2       0    6    2    3
    3       7    1    2    3
    4       0    6    5    4
    5       7    1    5    4
    6       7    6    2    4
    7       7    6    5    3


...
Рейтинг: 0 / 0
из тестового задания
    #39151883
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
да, идея отличная
...
Рейтинг: 0 / 0
из тестового задания
    #39151921
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovSashaMercuryAleksandr Sharahov, простите, но мне непонятно ваше доказательство, более того, я плохо понял что вы пытались доказать.


Доказывается необходимость и достаточность 2^N-1 переключателей для 2^N дверей.
Какое место в доказательстве непонятно?

Для кодирования каким-то способом ? или для чего ? Хотелось бы увидеть точную формулировку того, что вы доказывали
...
Рейтинг: 0 / 0
из тестового задания
    #39151930
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странный код
Aleksandr Sharahov
Код: pascal
1.
2.
  while Code<>0 do begin;
    if Code and 1<>0 then Result:=Result xor SetNo;


В паскале не силен, если правильно понимаю "if Code" дает true при Code<>0, то можно просто
Код: pascal
1.
2.
  while Code<>0 do begin;
    Result:=Result xor SetNo;


Так и задумывалось?
...
Рейтинг: 0 / 0
из тестового задания
    #39151941
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИзломал всю голову "простым" решением 18700090 от kealon(Ruslan), точнее тем как его объяснить. Как работает - понятно. Не мог придумать как назвать его таблицу, в итоге получилось как всегда - раз нельзя назвать, значит что-то не так.

Тотже алгоритм:
для шифрования: берем номер двери и делаем xor всех номеров включенных переключателей. Получаем номер того который надо переключить.
для дешифрования: xor всех включенных переключателей.


Например: включены переключатели 3,7. Надо указать на 6 дверь.
6 ^ 3 ^ 7 = 2-й переключатель надо переключить
2 ^ 3 ^ 7 = 6-я дверь

Требуемое количество переключателей : должны быть все переключатели используемого битового диапазона, т.к. в результате xor может получиться больше, например 4^3 = 7, т.е. если используется 3 бита, то надо все до 2^3 (=8), т.е. от 1 до 7, ноль не надо т.к. X ^ 0 = X, поэтому всего 2^N - 1, где N количество используемых бит.

Для 8 дверей хватит 3 бит (7 переключателей) если двери нумеровать с нуля, а не с 1. Иначе надо 15 переключателей.
называется таблица просто - ключ шифровки-дешифровки
и таблица
автор1, 2, 3, 4

1, 4, 5, 6

1, 6, 7, 2

и простой XOR это два равноценных случая общего решения:
авторвыделим 3 взаимно пересекающиеся группы (оно же и даёт ответ о кол-ве необходимых бит SUM(i=1.. N , C(i,N)) = 2^N - C (0,N) = 2^N - 1 ключей)
для простого XOR разбивка на группы будет такая

1, 3, 5, 7

2, 3, 6, 7

4, 5, 6, 7

общая формула шифровки

M.IndexOf(V XOR со всеми M[ i ] если i-й ключ включён )
расшифровка
V = 0 XOR со всеми M[ i ] если i-й ключ включён
для простого XOR
M=[1, 2, 3, 4, 5, 6, 7]
для
автор1, 2, 3, 4

1, 4, 5, 6

1, 6, 7, 2

M=[7, 5, 1, 3, 2, 6, 4]

любое перемешивание ряда от 1 до (2^N-1) будет ключом, как видно вариантов ключей может быть K!, где K = 2^N -1 (т.е. очень дофига)
PS: нумерация M с 1-ы, нумерация комнат с 0
...
Рейтинг: 0 / 0
из тестового задания
    #39151950
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСтранный код
Aleksandr Sharahov
Код: pascal
1.
2.
  while Code<>0 do begin;
    if Code and 1<>0 then Result:=Result xor SetNo;


В паскале не силен, если правильно понимаю "if Code" дает true при Code<>0, то можно просто
Код: pascal
1.
2.
  while Code<>0 do begin;
    Result:=Result xor SetNo;


Так и задумывалось?

Переменная SetNo хранит номер очередного подмножества.
Оно содержит в точности те биты номера комнаты,
которые есть в двоичной записи значения SetNo.
Поэтому нумерация подмножеств начинается с 1.

В переменной Code содержатся состояния выключателей,
или, что то же самое, "необходимости" операции XOR над всеми под множествами.
Один бит переменной Code - один выключатель, в бите 0 - первый и т.д.

Первая строчка организует цикл по подмножествам.
Сначала текущее подмножество первое (то что в бите 0).
На каждом следующем такте - сдвиг вправо.
Т.к. нас интересуют только непустые операции,
то цикл закончится при Code=0.

Вторая строчка для очередного подмножества с номером SetNo,
если необходимо (Code and 1<>0) выполняет операцию XOR над подмножеством,
включая-исключая его биты (из SetNo) в результирующее подмножество (биты Result),
начальное состояние которого - пустое (Result=0).
...
Рейтинг: 0 / 0
из тестового задания
    #39151953
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov, понял. Тот код равносилен такому
Код: sql
1.
if (Code and 1)<>0 then Result:=Result xor SetNo;
...
Рейтинг: 0 / 0
из тестового задания
    #39152609
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Python code:

Код: python
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.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
class HotelCodeBoard():   
    def __init__(self, n, rnum):
        # number of switches on the board
        self.n = n
        # number of rooms in the hotel
        self.rnum = rnum
        # number of bits required to represent the room from range
        self.rbits = math.ceil( math.log(self.rnum, 2) )
        # number of switchers required to encode the room
        self.nswitchers = 2**self.rbits - 1
        # number of states for meaningful switchers
        self.nstates = 2**self.nswitchers
        
    def get_room_list(self):
        """
        Returns a list of room numbers
        """
        return list( range(self.rnum) )          

    
    def get_states_list(self):
        """
        Returns a list of states of meaningful switchers
        """
        states = []
        for i in range( self.nstates, 2*self.nstates ):
            states.append( list(bin(i)[3:])  )
        return states
    
    def get_state_value(self, state):
        """
        (list) -> int
        Returns state value for a give state of switchers
        """
        return self.get_states_list().index(state)
    
    def get_state(self, state_value):
        """
        (int) -> list
        Returns state for a given state_value
        """
        return self.get_states_list()[state_value]
    
    def encode_room(self, room_number, state_value):
        """
        (int, int) -> int
        Returns encoded room number
        """        
        # Check the validity of room number    
        if room_number not in self.get_room_list():
            print("This room is not in the hotel,")
            print("and will not be encoded.")
            return
        
        # Check the validity of state_value
        n_states = self.nstates
        if state_value not in range( n_states ):
            print("The state you requested is not available")
            print("and will not be used for encoding")
            return
        
        # get state as combination of switches
        state = self.get_state(state_value)      
        
        # room number encoding       
        switch_position = room_number        
        
        for i in range( len(state) ):
            if state[i] == '1':
                switch_position = switch_position^(i+1)        

        switch_position = switch_position - 1 
        
        # if switch_position = -1 do not change anything       
        if switch_position < 0:
            new_state_value = state_value
            return new_state_value, state                
         
        # switching at switch_position    
          
        if state[switch_position] == '0':
            state[switch_position] = '1'
        else:
            state[switch_position] = '0'
            
        new_state_value = self.get_state_value(state)
        return new_state_value, state
    
    def decode_room(self, state_value):
        
        state = self.get_state(state_value)
        
        switch_position = 0
        
        for i in range( len(state) ):
            if state[i] == '1':
                switch_position = switch_position^(i+1)
        
        room_number = switch_position
        return room_number 
    
    def get_decode_table(self):
        key_table = []
        for i in range( self.nstates):
            key_row = []
            for j in range( self.rnum):
                val = self.encode_room(j, i)[0]
                key_row.append(val)
            key_table.append(key_row)            
        return key_table 



Tаблица для 4х комнат

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
-------------------------
Rooms:       [0, 1, 2, 3]
-------------------------
State:  0 :  [0, 4, 2, 1]
State:  1 :  [0, 3, 5, 1]
State:  2 :  [0, 3, 2, 6]
State:  3 :  [7, 3, 2, 1]
State:  4 :  [0, 4, 5, 6]
State:  5 :  [7, 4, 5, 1]
State:  6 :  [7, 4, 2, 6]
State:  7 :  [7, 3, 5, 6]
...
Рейтинг: 0 / 0
из тестового задания
    #39152614
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

почитай внимательно что я написал 18705910 , таблиц не надо, кода будет строк 10-15, ну пусть 20 по неопытности.
...
Рейтинг: 0 / 0
из тестового задания
    #39152644
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
так я примерно так и сделала, как ты написал. непосредственно шифровка занимает как раз 15 строк
(метод encode_room() )
расшифровка - 8 строк. остальные функции - для удобства

к примеру, вот удобная для пользования табличка

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
---------------------------------------------
Rooms:                           [0, 1, 2, 3]
---------------------------------------------
State:  0 <-> ['0', '0', '0'] :  [0, 4, 2, 1]
State:  1 <-> ['0', '0', '1'] :  [0, 3, 5, 1]
State:  2 <-> ['0', '1', '0'] :  [0, 3, 2, 6]
State:  3 <-> ['0', '1', '1'] :  [7, 3, 2, 1]
State:  4 <-> ['1', '0', '0'] :  [0, 4, 5, 6]
State:  5 <-> ['1', '0', '1'] :  [7, 4, 5, 1]
State:  6 <-> ['1', '1', '0'] :  [7, 4, 2, 6]
State:  7 <-> ['1', '1', '1'] :  [7, 3, 5, 6]
...
Рейтинг: 0 / 0
из тестового задания
    #39152655
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

тоже спрошу )

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


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