Вниз  Алгоритмизация
- 10.03.2016 / 21:07
Askalite
  Пользователь

Askalite 
Сейчас: Offline
В общем. Ребят. Нужна помощь.

Нужно создать модель провода, по которому в одну сторону с определённой скоростью распространяется несколько штук сигналов, на определённом растояние лруг от друга и по пути, эти сигналы активируют маячки.

Например:
>000000[0]00[0]000[0]00000
>100000[0]00[0]000[0]00000
>010000[0]00[0]000[0]00000
>001000[0]00[0]000[0]00000
>000100[0]00[0]000[0]00000
>000010[0]00[0]000[0]00000
>000001[0]00[0]000[0]00000
>000000[!]00[0]000[0]00000
>000000[!]10[0]000[0]00000
>000000[!]01[0]000[0]00000
>000000[!]00[!]000[0]00000
>000000[!]00[!]100[0]00000

1 - сигнал. 0 - нет сигнала. [0] [!] - маячок. > - вход сигналов.

Класс маячков представляет из себя:
  1. class snps(){
  2. int pos; //— положение маячка от входа.
  3.  act(){
  4.  // метод вызываемый при активации маячка.
  5.  }
  6. }

Длина провода произвольна. Количество маячков на проводе произвольно.

По вызову метода act() в обьекте провод, состояние и положение сигналов должно обновлятся. (это я реализую сам).

Требуется лишь реализовать механизм хранения сигналов и маячков, не используя излишне память.

Изменено Askalite (10.03 / 21:08) (всего 1 раз)
- 10.03.2016 / 21:25
Naik
  Пользователь

Naik 
Сейчас: Offline
Askalite, ну вот так и храни как нарисовал. Список объектов null, Signal, Checkpoint

Изменено Naik (10.03 / 21:27) (всего 1 раз)
- 11.03.2016 / 08:09
Askalite
  Пользователь

Askalite 
Сейчас: Offline
Naik, неудобно. Очень.
- 11.03.2016 / 10:19
Ginosaji
  Пользователь

Ginosaji 
Сейчас: Offline
Askalite,
  1. private static int WIRE_LENGTH = 32; //длина провода
  2. private static final BigInteger INITIAL = new BigInteger("10000000000000000000000000000000", 2); //число, длина которого равна длине провода, старший бит равен единице
  3.  
  4. BigInteger beaconMask = new BigInteger("110000", 2); //эта маска формируется из значений позиций маячков. Если маячки находятся на позициях 5 и 6, считая справа налево, то биты с такими номерами устанавливаются в маске в 1. Над алгоритмом создания маски подумай.
  5. BigInteger wire = BigInteger.ZERO; //первоначальное состояние провода
  6. for (int i = 1; i < WIRE_LENGTH; i++) { //гуляем по проводу
  7.             wire = wire.and(beaconMask); //это нужно, чтобы активированные маяки остались активными, а выключенные - выключенными при каждой новой итерации.
  8.             wire = wire.or(INITIAL.shiftRight(i)); //а это распространение сигнала по проводу
  9.             System.out.println(wire.toString(2));
  10. }


Изменено Ginosaji (11.03 / 10:21) (всего 1 раз)
- 11.03.2016 / 20:39
Askalite
  Пользователь

Askalite 
Сейчас: Offline
Ginosaji, нда. Спасибо. Провисать по любому будет, если длинна будет 1000 и таких объектов будет соответсвующе много.
- 12.03.2016 / 08:49
Ginosaji
  Пользователь

Ginosaji 
Сейчас: Offline
Askalite, wire, beaconMask, INITIAL + по три временных объекта на каждой итерации, порождаемых методами and, or и shiftRight. Хочешь без этого - пиши то же самое на C с библиотекой для длинной арифметики. GMP например.
- 20.06.2016 / 16:07
Askalite
  Пользователь

Askalite 
Сейчас: Offline
Есть множество, как его разделить на классыэквивалентности?
Наверх  Всего сообщений: 127
Фильтровать сообщения
Поиск по теме
Файлы топика (2)