Беспамятство или жизнь после маразма

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это задача-шутка для тех, кто хочет пошутить с Ардуиной в руках. Не то, чтобы задача особо сложная, но и не так, чтобы тривиальная. Кто хочет попробовать, прошу. Обсудим решения.

Требуется написать программу, которая не использует статическую память от слова совсем – ни одного байта.

Задача:

Имеется Ардуино, подключённая через штатный USB разъём к компьютеру и ни к чему больше. Питание через USB. Ни к каким пинам ничего не подключено. Т.е. из периферии есть только штатный светодиод на пине LED_BUILTIN.

Написать скетч, который бы мигал светодиодом на пине LED_BUILTIN следующим образом:

  1. 20 периодов с частотой 20Гц
  2. 10 периодов с частотой 10Гц
  3. 5 периодов с частотой 5Гц
  4. 1 период с частотой 1Гц
  5. переход к п. 1 и так в бесконечном цикле.

При этом должны соблюдаться следующие условия:

  1. программа состоит из одного файла xxx.ino и не использует никаких скрытых, заранее скомпилированных или ещё каких кусков – просто один честный файл, который заливается из IDE обычным образом;
  2. в программе не используются никакие библиотеки, кроме тех, что входят в поставку Ардуино IDE «из коробки»;
  3. программа выполняется на Ардуине на базе AVR, кроме АТtiny (т.е. Uno, Nano, Mega и т.п.). На ARM тоже можно, но достаточно на AVR;
  4. в программе (в любом её месте) присутствуют не более одного вызова функции digitalWrite (или прямой вывод в порт). Т.е. либо Вы вывод в порт не используете вовсе, либо используете один раз.
  5. В программе нельзя использовать рекурсию и любые циклы и операторы перехода (типа goto). Разумеется, можно использовать тот факт, что функция loop вызывается в бесконечном цикле, но свои циклы (в том числе и замаскированные) использовать нельзя.
  6. Самое главное, в программе не должно выделяться ни одного байта под глобальные и статические переменные. Т.е. выдаваемое IDE после компиляции сообщение «Глобальные переменные используют Х байт (Y%) динамической памяти, оставляя Z байт для локальных переменных» должно содержать ровно те же самые числа, что и аналогичное сообщение после компиляции пустого скетча ( void setup(void) {} void loop(void) {} )

Успехов!

P.S. Материального приза не будет. Решаем для собственного удовольствия и за «почёт и уважуху».

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Евгений, согласно правилам такие посты надо размещать в разделе "Ищу исполнителя".

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Правило №4 обходится на раз. Достаточно написать функцию типа

void writeDigital(const byte pin, const bool val) {
      digitalWrite(pin, val);
}

И вызывать её сколько угодно раз. digitalWrite встречается только в одном месте - правило соблюдено.

Ну, а дальше просто. Все периоды одного прохода (с 20Гц по 1Гц) тупо линейно расписываются в loop со всеми необхожимыми делэями и переключениями, а о том, чтобы они бесконечно повторялись уже сам loop позаботится.

Решение?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

простите! я не сумасшедший полуночник! :)) Просто спускался к собакам. Заметил эту прелесть. Не устоял!
с телефона, поэтому без оформления.
t=millis()/25;
s=(t/40) & 3;
if (t & (1 << s)) toggle();

s и t локальные .. можно и не писать. они только человеку-читателю нужны.
__________
Прости, Женя, если интригу испортил. :)))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, Вы, блин, даёте!

Влад, пока спросонья не разобрался и не понял, попозжей посмотрю. Но идея понятна: есть же глобальная переменная - счётчик миллис, вот пусть в ней что надо и хранится :)

Володя, ну, блин, расписывать всё длинной портянкой - нелениво это как-то, не по-программистски. Хотя, да, решение, конечно :)

Кстати, Вы говорили, что "ворота" - погоняло по жизни и намекали на какую-то историю, можно услышать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

согласно правилам такие посты надо размещать в разделе "Ищу исполнителя".

Вот хотел же халяву срубить и надеялся, что никто не заметит :(

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

wdrakula пишет:
простите! я не сумасшедший полуночник! :)) Просто спускался к собакам. Заметил эту прелесть. Не устоял! с телефона, поэтому без оформления. t=millis()/25; s=(t/40) & 3; if (t & (1 << s)) toggle(); s и t локальные .. можно и не писать. они только человеку-читателю нужны. __________ Прости, Женя, если интригу испортил. :)))

Красиво, но, увы, неправильно.

Предполагаю, что вместо:

if (t & (1 << s)) toggle();

следует читать:

toggle(!(t & (1 << s)));

Но и в этом случае есть, минимум 3 шероховатости (т.е. строго говоря, отклонения от ТЗ):

1. При s == 3 вместо заказанного 1 Гц получается 2.5 Гц.

2. IMHO по хорошему "сращивание" фрагментов с разной частотой должно сопровозжаться переключением, т.е. интервалы горения/негорения должны следовать примерно так: 20,20,20,20,10,10,10,10. А вместо этого наблюдается: 20,20,20,30,10,10,10.

3. Ну и не уверен, что примерно через 49 суток не наступит небольшой сбой в последовательности.

 

PS. В общем, остаюсь при своем мнении, высказанном в №1: задача (если ее сделать аккуратно) - не художественное творчество, а рутина.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

Я когда придумывал задачу, имел в виду очень краткое и красивое решение, по мне - так искусство (может по-Вашему - мазня, не знаю - на вкус и цвет). Но раскрывать его пока не буду, т.к. на его идею пока что и намёка не было.

А так, да, каждый решает как умеет :)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Так! В ночном решении, конечно (!!!) есть ошибка. Я же не весь проснулся, только та часть, которая щенка пописать выпускала ;))).

-----------

Вот правильно е и проверенное:

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
int t = millis()/25; //тики по 25 мс, то есть полпериода от 20Гц
int s = (t / 40) & 0b0011; //секунды по модулю 4
byte hs = (t / 20) & 1;  // полсекунды, для 4ой секунды


digitalWrite(LED_BUILTIN, (s < 3) ? (t & (1 << s)) : (hs)); 
  
}

С тоггле, ессно, не работает. Это помрачение ночное ;))). И последовательность не 1,2,4,8. Поэтому 1 Гц нужно обработать отдельно, а 20-10-5 - нормально по делению пополам идут.

НГу вот и всё. Можно записать в лдну строку.

Ща запишу, для смеха.

#define m millis()
void loop()  {
  digitalWrite (LED_BUILTIN, (((m/1000) & 0b11) < 3) ? ((m/25) & (1 << ((m/1000) & 3))) : ((m/500) & 1));
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Женя! А твоё решение точно КОРОЧЕ?

Прям интрига сохраняется!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, моё длинее, но мне там идея нравится. Хотя, у Вас идея тоже отличная - хранить всё, что нужно в естественно-доступной глобальной переменной - это сильно. Я своё выложу чуть позже, сейчас бежать надо.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Пока Женя не вернулся я тут пофилосовствую немного?

Возможно, что я неправильно понял задачу.

Если дать возможность запоминать хоть одно число, даже 1 бит достаточно, то можно реализовать ЛЮБОЙ конечный автомат (если есть миллис()).

Женя знает - как, остальным врядли интересно.

Поэтому я счел, что условие задачи - не запоминать ничего и нигде, даже в "пине" или в бесчисленных, ненужных для задачи регистрах контроллера. Следовательно единственный способ дифференцировать входы в луп - значение времени, переключения невозможны, так как, если мы не имеем права помнить даже бит (флаг), то мы не можем отличить первое попадание с этой временной меткой, от НЕ первого.

Ну а дальше - дело техники.

------

Поэтому мне очень интересно решение Евгения. Буду подождать! ;)))

sadman41
Offline
Зарегистрирован: 19.10.2016

Беспамятство - это когда очухиваешься и не знаешь сколько сейчас времени, который год и где находишься. А когда кто-то, сбоку лежащий, тебе может ответить, что уже 7-е января и ты находишься на квартире в Теплом Стане, то это уже перестает быть беспамятством. Просто за тебя помнит кто-то другой. Типа миллиса, который тоже является постоянно хранимой в памяти МК величиной. 

Поэтому здесь существует определённый философский спор  - является ли миллис сторэдж частью финальной программы или нет.

А унутре дилэя вообще цикл и еще и скрытый.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, ну в общем, из всего что я видел, лично мне самым прикольным показалось рещение Влада.

Моё было как раз на использовании пинов (там их свободных аж 18 штук) в качестве битов глобальной памяти, ну или, действительно регистров, одного таймера бы хватило.

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

Но с миллисом мне больше понравилось.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Евгений, Вы меня заинтриговали.

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

Действительно: для решения напрашивается автомат, значит, надо хранить состгояния, но собственные переменные для этого использовать нельзя. Можно, конечно, "незаконно присвоить" какую-нибудь ячейку памяти, находящейся в куче. И даже с точки зрения идеологии МК это не будет чем-то совершенно немыслимым, но все равно не красиво. Поэтому единственный вариант, который напрашивается - использовать в качестве переменных состояния то, что уже имеется в системе. А как раз переменная, которую возвращает millis для этого как нельзя лучше подходит.

Остается лишь аккуратно расписать все случаи, но это уже рутина, поэтому я и написал насчет разщдел "Ищу исполнителя". Ну еще можно использовать эту задачу на собеседовании при приеме программиста на работу - для подтверждения некоторой минимальной квалификации.

Влад затем предложил простое и красивое решение, но, увы, обладающее рядом недостатков. Но суть та же - в качестве переменной состояния использовать millis.

Другой вариант предложил Ворота. Там еще бОльшая рутина. В любом случае неэлегантно, но все равно - имеет право быть.

Лично я до третьего варианта додуматься не могу. Поэтому с нетерпением жду продолжения.

 

PS. Да, прочел сообщение, отправленное парой минут раньше, но уже после того, как я начал писать данное. Действительно, чисто МК-шное решение. Я, повторяю, не додумался, хотя даже подсказка была - в виде явнго сформулированного запрета что-то подключать к пинам, что явно намекало на использование внешней памяти.

 

PPS. Кстати, вопрос на засыпку: библиотека EEPROM ведь относится к стандартным библиотекам, т.е. допустима по условиям задачи?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

Влад затем предложил простое и красивое решение, но, увы, обладающее рядом недостатков. Но суть та же - в качестве переменной состояния использовать millis.

Сережа! Прости мое занудство, но какие недостатки? Ошибки ночного поста я признал и  исправил...

Так что я несколько в недоумении !!!!!!!????????? 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

wdrakula пишет:

С тоггле, ессно, не работает.

Ну не то чтобы совсем не работает. Как бы название хотя и намекает на содержание, но весьма приблизительно. Если toggle без параметров воспринимать как переключение состояние на обратное - не работает, а если добавить к ней входнорй параметр, указывающий, в какое именно состояние нужно переключать - то вполне работает, но с уже указанными мною выше недостатками.

И, кстати, toggle  в первом смысле (переключение) использует указанную Евгением идею - использование портов в качестве памяти, а во втором - нет, это чисто логическое решение без использования каких-либо физических свойств МК.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

wdrakula пишет:

andriano пишет:

Влад затем предложил простое и красивое решение, но, увы, обладающее рядом недостатков. Но суть та же - в качестве переменной состояния использовать millis.

Сережа! Прости мое занудство, но какие недостатки? Ошибки ночного поста я признал и  исправил...

Так что я несколько в недоумении !!!!!!!????????? 

Недостатки я указал в сообщении №6 под цифрами 1, 2 и 3.

Исправлен п.1 и то, что я назвал "неправильно" в том же сообщении №6 (в начале сообщения). Остальное - осталось.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

wdrakula пишет:

andriano пишет:

Влад затем предложил простое и красивое решение, но, увы, обладающее рядом недостатков. Но суть та же - в качестве переменной состояния использовать millis.

Сережа! Прости мое занудство, но какие недостатки? Ошибки ночного поста я признал и  исправил...

Так что я несколько в недоумении !!!!!!!????????? 

Недостатки я указал в сообщении №6 под цифрами 1, 2 и 3.

Ну а я, если ты будешь внимателен, написал, что ИСПРАВИЛ.  Код приведен в №8, причем тут то, что ты написал в №6???

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ОФФТОП:

Я поясню, почему занудствую:

почти 33 года назад, в 86-ом, я поступал на МехМат МГУ и  получил ...2 на письменной математике.

Я пошел спорить, и объяснил где, как и почему задачи были решены. Я был ЕДИНСТВЕННЫЙ человек, который поступил после апелляции.

Спорить о своих решениях для меня не просто важно, а ПРЯМ_ПИПЕЦ_КАК_ВАЖНО!!! ;)))) Как-то так.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

И, кстати, toggle  в первом смысле (переключение) использует указанную Евгением идею - использование портов в качестве памяти

Сереж! Блин, вот уже начал доставать!

Toggle это PINB = (1<<n) в AVR процессорах.

I/O memory address locations are allocated for each port, one each for the Data Register – PORTx, Data
Direction Register – DDRx, and the Port Input Pins – PINx. The Port Input Pins I/O location is read only,
while the Data Register and the Data Direction Register are read/write. However, writing '1' to a bit in the
PINx Register will result in a toggle in the corresponding bit in the Data Register.

(стр. 97 даташита на 328-ой)

-------------------------

Нельзя отрывать слова от контекста! Смыслов каждом слове, тем более на другом языке, дохера и больше. Квалифицированный читатель должен уметь ограничивать семантическое поле слова текущим контекстом.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

 Ну еще можно использовать эту задачу на собеседовании при приеме программиста на работу - для подтверждения некоторой минимальной квалификации.

я при приеме на работу даю другую (прикладную) задачу - выдать график измерений наполнения бочки диаметром X высотой Y положенной на бок строко горизонтально через к примеру 5мм наполненности

Пока ни один из нововыпущенных прикладных математиков задачу в разумные сроки (10-20 минут) не решил )))

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

wdrakula пишет:

andriano пишет:

И, кстати, toggle  в первом смысле (переключение) использует указанную Евгением идею - использование портов в качестве памяти

Сереж! Блин, вот уже начал доставать!

Toggle это PINB = (1<<n) в AVR процессорах.

I/O memory address locations are allocated for each port, one each for the Data Register – PORTx, Data
Direction Register – DDRx, and the Port Input Pins – PINx. The Port Input Pins I/O location is read only,
while the Data Register and the Data Direction Register are read/write. However, writing '1' to a bit in the
PINx Register will result in a toggle in the corresponding bit in the Data Register.

(стр. 97 даташита на 328-ой)

-------------------------

Нельзя отрывать слова от контекста! Смыслов каждом слове, тем более на другом языке, дохера и больше. Квалифицированный читатель должен уметь ограничивать семантическое поле слова текущим контекстом.

Влад, не надо нервничать!

Третий абзац (цитата и дэйташита) отнюдь не определяет, как именно следует понимать слово toggle применительно к AVR процессорам, а лишь объясняет, как работает PINx. Поэтому в приведенном в третьем абзаце контексте toggle следует понимать как изменение состояния на противоположное, но из этого совершенно не следует, что слово toggle допустимо применять только в этом смысле.

Поэтому второй абзац содержит ложное утверждение.

Читайте то, что содержится в дэйташите, а не то, что Вам хотелось бы там видеть.

 

PS. Если уж мы ударились в мемуары, то когда я поступал в МФТИ, первым экзаменом традиционно проводилась письменная математика. Думаю, для оптимизации. Ибо более 50% абитуриентов сразу отсеивалось на первом экзамене. Лично я на этом экзамене получил 5 и, судя по набранным баллам, с большим запасом. Это к тому, что лучше сразу писать правильно, а не спорить потом, что тебя не так поняли. 

блин! вот бы мне самому следовать этому совету...))))

 

PS. Да, проверил по последней версии кода, недостаток 2 там тоже устранен. До этого пнроверял по исходной с учетом правки по п.№6. 

Остается 3, но это уже совсем другая история...

Впрочем, тут тоже IMHO есть тема для обсуждения. Например, учитывая, что наредко в Ардуино применяется керамика вместо кварцев, да и кварцы имеют погрешность (в моей практике был случай, когда погрешность задания частоты приводила к сбоям передачи по Serial - 0.7%), а также то, что millis все равно тикает неравномерно, можно предложить вариант исправления, в котором в секунде 1024 мс и, таким образом, сбой каждые 49 суток будет устранен.

sadman41
Offline
Зарегистрирован: 19.10.2016

ua6em пишет:

Пока ни один из нововыпущенных прикладных математиков задачу в разумные сроки (10-20 минут) не решил )))

Стало быть работников у вас нет, раз никто не может задачку решить? 

Была у меня начальница, которая при приёме на работу устроила психологический тест с рисованием какой-то хероты. Потом оказалось, что она ни в ворде работать не умеет, ни договор прочитать нормально, ни спецификацию понять, ни отвественность на себя взять...  Да и стервь неуравновешенная по характеру. Зато на собеседовании умничала дайбох каждому.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

wdrakula пишет:

andriano пишет:

Влад затем предложил простое и красивое решение, но, увы, обладающее рядом недостатков. Но суть та же - в качестве переменной состояния использовать millis.

Сережа! Прости мое занудство, но какие недостатки? Ошибки ночного поста я признал и  исправил...

Так что я несколько в недоумении !!!!!!!????????? 

Недостатки я указал в сообщении №6 под цифрами 1, 2 и 3.

Исправлен п.1 и то, что я назвал "неправильно" в том же сообщении №6 (в начале сообщения). Остальное - осталось.

Так ты уже успел поправить свое сообщение? ;))) ладно.

Тогда п2 - просто твоя вкусовщина, если б было правдой. В секунде четное число полупериодоа каждой частоты, что очевидно! Поэтому переходы фаз корректные 20>10>5>1.

Что легко проверяется, добавив пару статических переменный и вывод в сериал:

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(57600); while(!Serial);
}

void loop() {
static int oldt = millis()/25;
int t = millis()/25; //тики по 25 мс, то есть полпериода от 20Гц
int s = (t / 40) & 0b0011; //секунды по модулю 4
byte hs = (t / 20) & 1;  // полсекунды, для 4ой секунды
byte out = (s < 3) ? (t & (1 << s)) : (hs);
static byte oldout = 1;
if (oldout != out) {
  oldout = out; 
  Serial.print(t); 
  Serial.print("   ");
  Serial.print(out); 
  Serial.print("   ");
  Serial.println(t - oldt);
  oldt = t; 
  }
digitalWrite(LED_BUILTIN, out); 
  
}

п3. Ну это полная чушь!!! После переполнения в счетчике все 1 сменяются на все 0. Ровно как и при инкременте.

То есть вообще никак нас не беспокоят.

---------------------------

ИТОГ: В этом замечании ты был очень похож на Архата. Тем, что тот тоже никогда не признавал своих оплошностей. Если бы не это, его терпели до сих пор.

Ты заметил ошибки в ночном посте - ОК, я тоже заметил и выложил исправленный вариант. Ну и написал бы, что ты принял это к сведению, ты же, со своим обычным высокомерием, заявил, что "ошибки в 1 2 и 3".

Притом, что

1.без детектирования первого вхождения НИКАК нельзя использовать "тоггле", а не как у тебя написано.

2. Пункт 2 - твоя невнимательность.

3. Пункт 3 - ну просто безграмотная чушь.

-------------------

Короче, мне бы очень хотелось извинений.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

Поэтому здесь существует определённый философский спор  - является ли миллис сторэдж частью финальной программы или нет.

У меня тоже появился этот вопрос в процессе чтения исходного сообщения, но как только этот пргоцесс был закончен, все стало на свои места: п.6 однозначно указывает, что "не является", точнее, - не учитывается.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

я при приеме на работу даю другую (прикладную) задачу - выдать график измерений наполнения бочки диаметром X высотой Y положенной на бок строко горизонтально через к примеру 5мм наполненности

Пока ни один из нововыпущенных прикладных математиков задачу в разумные сроки (10-20 минут) не решил )))

IMHO это свидетельствует о неадекватнгости теста.

ВН
Offline
Зарегистрирован: 25.02.2016

ЕвгенийП пишет:
программа выполняется на Ардуине на базе AVR, кроме АТtiny (т.е. Uno, Nano, Mega и т.п.).

по мне так вот эта оговорка, автоматически отправляет к чипу с 2-мя длинными таймерами 

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

т.е. первое прерывание выглядит как 

switch (читаем загруженнное значение таймера) 
{  case ляля20: записать ляля10;break;
   case ляля10: записать ляля5;break;  
   case ляля5:  записать ляля1;break;
   case ляля1:  записать ляля20;break;
      default:  записать ляля20;
}

а второе 

{  digitalWrite(!digitalRead(13));}

не стал писать ночью, решил глянуть на ход мыслей других участников

sadman41
Offline
Зарегистрирован: 19.10.2016

andriano пишет:

sadman41 пишет:

Поэтому здесь существует определённый философский спор  - является ли миллис сторэдж частью финальной программы или нет.

У меня тоже появился этот вопрос в процессе чтения исходного сообщения, но как только этот пргоцесс был закончен, все стало на свои места: п.6 однозначно указывает, что "не является", точнее, - не учитывается.

Однако, на мой взгляд, это вступает в противоречие с основной идеей - неиспользовании статической памяти совсем.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

ua6em пишет:

я при приеме на работу даю другую (прикладную) задачу - выдать график измерений наполнения бочки диаметром X высотой Y положенной на бок строко горизонтально через к примеру 5мм наполненности

Пока ни один из нововыпущенных прикладных математиков задачу в разумные сроки (10-20 минут) не решил )))

IMHO это свидетельствует о неадекватнгости теста.

В чем проявляется неадекватность? Замер жидкости в таких цистернах ежедневно делается мерной линейкой и сравнивается с таблицами, неадекватность в умении программиста реализовать такие таблицы?
Простая прикладная задача

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Не знаю, как в столицах, но на периферии давно уже не учат применять знания в жизни. Преподаватель заменился лектором.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

wdrakula пишет:

Ты заметил ошибки в ночном посте - ОК, я тоже заметил и выложил исправленный вариант. Ну и написал бы, что ты принял это к сведению, ты же, со своим обычным высокомерием, заявил, что "ошибки в 1 2 и 3".

Притом, что

1.без детектирования первого вхождения НИКАК нельзя использовать "тоггле", а не как у тебя написано.

2. Пункт 2 - твоя невнимательность.

3. Пункт 3 - ну просто безграмотная чушь.

-------------------

Короче, мне бы очень хотелось извинений.

В этой теме столько всего пишут, а еще больше - правят, что лично я не успеваю отслеживать содержимое. Отсюда и некоторые ляпы.

1. По поводу toggle я уже писал: так, как предложил ты - да, нельзя. А как можно - написал я в посте №6/

2. Признаю. Моя невнимательность. Отреагировал с запозданием и не на тот пост.

3. Пока это для меня неочевидно. Мы делим 0xFFFFFFFF на 25 и получаем 0xA3D70A3. Где тут 4 единицы в конце? 

Да, приношу извинения за запоздалую реакцию на п.1 (по поводу трактовки слова toggle остаюсь при своем мнении) и за невнимательность по п.2.

п.3 в состоянии обсуждения. Убедишь - тоже принесу извинения.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

Однако, на мой взгляд, это вступает в противоречие с основной идеей - неиспользовании статической памяти совсем.

Так стек - он тоже в статической памяти. Значит, и вызывать функции нельзя?

Если исключения прямо прописаны в условии (п.6), начит, они имеют место быть. В конце концов, порты они тоже содержатся в общем адресном пространстве и ведут себя как ячейки памяти. Получается, что в рамках "строгих ограничений" вариант Петровича тоже не проходит.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

В чем проявляется неадекватность?

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

sadman41
Offline
Зарегистрирован: 19.10.2016

andriano пишет:
Получается, что в рамках "строгих ограничений" вариант Петровича тоже не проходит.

Думаю, что тут пора призывать в пост кампутерного юриста для толкования формулировок и иерархии требований )) 

 

RG22EM
Offline
Зарегистрирован: 27.08.2016

andriano пишет:

ua6em пишет:

В чем проявляется неадекватность?

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

действующий программист решил задачу за пяток минут, это просто говорит о качестве образования...
вуз один и тот же )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Токарь с пятнадцатилетним стажем изготавливает 30 деталей в час, а выпускник ПТУ портит четыре резца за смену. Удивительно, правда? Ведь по всей приведенной выше логике опыт никак не влияет на выработку.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Токарь с пятнадцатилетним стажем изготавливает 30 деталей в час, а выпускник ПТУ портит четыре резца за смену. Удивительно, правда? Ведь по всей приведенной выше логике опыт никак не влияет на выработку.

Вы в вопросе увидели, что-то сложнее курса геометрии 7 класса?

sadman41
Offline
Зарегистрирован: 19.10.2016

Вам же "по таблицам" надо решить, как я понял. Так что тут вопрос не математический, а технологический.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

RG22EM пишет:

действующий программист решил задачу за пяток минут

А, нескромный вопрос: он ее решал аналитически или численно?

Исходя из предложенной формулировки я бы заключил, что речь идет, скорее, об аналитическом решении.

 

В противном случае прикинем: загрузка ОС - 2.5 мин, загрузка IDE - еще 0.5 мин, мастер нового проекта - еще 1.0 мин. Итого, на написание и отладку текста - 1 минута. Хороший у вас программист. Лично я всегда сталкиваюсь с тем, что задача на пару минут выливается, минимум, минут в 10.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Евгений Петрович, в очередной раз высказываю Вам свое восхищение!

Сколько разных вариантов решения такой, казалось бы, совершенно очевидной задачи вдруг было выявлено.

Я вот действительно поначалу решил, что ничего интересного тут быть не может (о чем и свидетельствует пост №1), ан вон оно как вышло!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

RG22EM пишет:

действующий программист решил задачу за пяток минут

А, нескромный вопрос: он ее решал аналитически или численно?

Исходя из предложенной формулировки я бы заключил, что речь идет, скорее, об аналитическом решении.

 

В противном случае прикинем: загрузка ОС - 2.5 мин, загрузка IDE - еще 0.5 мин, мастер нового проекта - еще 1.0 мин. Итого, на написание и отладку текста - 1 минута. Хороший у вас программист. Лично я всегда сталкиваюсь с тем, что задача на пару минут выливается, минимум, минут в 10.

Система всегда загружена и под рукой, язык - интерпретатор (Инфо-Бухгалтер) )))
Он то и по бухучету работал, суть аналитики - определение площади сегмента, на это ушло минута - две

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Площадь сегмента - жутко неудобный тест!!! Потому, что участвует и угол и его синус.

Итоговая формула  - совершенно зубодробительна, даже для математика, потому, как нифига не красивая:

<Объем в %> =  ( 2*acos(1-h/R) - sin( 2*acos(1-h/R))) * 50 / 3.14

Вот это ты хочешь получить от вчерашнего студента? Да, тригонометрия там не за 7, но ... когда теперь синусы и сектора-сегменты проходят? - в 9ом вроде.

ИМХО - тест неприятный, так как не "олимпиадный", то есть не на остроумие, а просто на память... Мне - не понравился.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

1. По поводу toggle я уже писал: так, как предложил ты - да, нельзя. А как можно - написал я в посте №6/

2. Признаю. Моя невнимательность. Отреагировал с запозданием и не на тот пост.

3. Пока это для меня неочевидно. Мы делим 0xFFFFFFFF на 25 и получаем 0xA3D70A3. Где тут 4 единицы в конце? 

Да, приношу извинения за запоздалую реакцию на п.1 (по поводу трактовки слова toggle остаюсь при своем мнении) и за невнимательность по п.2.

п.3 в состоянии обсуждения. Убедишь - тоже принесу извинения.

Спасибо, что понял меня. Я благодарен.

1. Про тоггле я не о том, а про то, что его НИКАК не получится применить, без дополнительной памяти.

2. Ок.

3. Ты прав, моя вина, что в голове были тики, а не мс! В переполнении тики пойдут 0,1,2,3,0,1... то есть удлиннится фаза 0 на третьем бите, т.е. частоте 5Гц. Не всегда, а может и никогда... но ответ на это вопрос требует внимательного учета всех тиков третьей секудны... а ну его в баню!!! ;))) Я был неправ, даже если и не влияет, то это неочевидно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ВН пишет:

ЕвгенийП пишет:
кроме АТtiny (т.е. Uno, Nano, Mega и т.п.)

по мне так вот эта оговорка, автоматически отправляет к чипу с 2-мя длинными таймерами 

У Конецкого есть описание его встречи с Пикассо. Дело было на выставке. Все пялились на картину, на которой был изображён мужик падающий в море и до хрипоты спорили что это: низвержение Вельзевула или падение Икара, а автор набрался наглости и спросил у самого Пикассо. Тот ответил, "Вы только не говорите эстетатм, но я просто хотел изобразить ныряльщика" :)

Так и здесь. Когда я писал, я имел в виду использование пинов. У 328 их 20 - 13-ый и - Rx от греха подальше = 18 свободных пинов. Можно организовать три шестибитовых числа (== три глобальные переменные по шесть бит), что "выше крыши" для данной задачи. Имея такие переменные, она программируется в лоб безо всяких хитростей. А у тинек пинов поменьше будет :(

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:

Кстати, Вы говорили, что "ворота" - погоняло по жизни и намекали на какую-то историю, можно услышать?

А чего лично не спросишь? Только не говори, что до сих пор не вычислил меня - не поверю.

А "Ворота", таки да - по жизни. Мы когда из училища выпустились, с несколькими сокурсниками попали в одну дивизию и там продолжали общаться, когда пересекались. Из всех наших я первым получил роту, ну, и собрались отметить, а то как же. Поначалу пили за "Вовку - ротного", потом, когда языки стали заплетаться - за "воротного", так к утру я "воротами" и стал. С тех пор они (и многие с их подачи) так меня и зовут. Уже солидные мужики, жизнь раскидала, один так даже до генерала дослужился, а молодость - её же хрен забудешь.

А задачка забавная, но как-то сложно и длинно сформулирована. Надо бы стараться попроще. Вот, взять проблему Коллатца - уж насколько простая формулировка - все старшекласники тут же кидаются "решить за полчаса":)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Могу добавить задачку, на которой я "сломался", до неё считавший себя почти Б..ом! ;)))

......

Пусть дан алфавит, без ограничения общности, из двух букв a и b.

Рассмотрим множество всех возможных слов в этом алфавите.

Пусть дана пара конкретных слов A и B.

Определим элементарную операцию замены:

Если A - подслово более длинного слова, то можно заменить A на B и наоборот.

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

------------------

Выяснить (проблема Туэ, её кусочек ;) ): Разрешима ли алгоритмически проблема эквивалентности.

========================

Ну ... в общем это как-бы "Теорема Ферма", только в теории вычислимости. Вроде - проще некуда? Вот и я так думал... чуть к добрым людям в белых халатах не угодил! ;)))) Давно это было...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ворота пишет:

Только не говори, что до сих пор не вычислил меня - не поверю.

Вычислил, но были сомнения. Теперь - нет.

А пьянка за "Вовку ротного", это в Афгане, что ли?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, граф, задачки у Вас!

Кстати, граф, Вы тут как-то за Шабат говорили. У нас тут нынче стока снега с утра навалило, что я так долго и тоскливо смотрел на него, а потом запустил жене - слушай, мож мне в евреи податься, вот что-то есть в этом иудаизме! Но ни фига - она мне приземлённо так - бери мол лопату, топай во двор, там и поразмышляешь об иудаизме. Так и пришлось сегодня полдня с лопатой в руках о Шабате философствовать :)

ВН
Offline
Зарегистрирован: 25.02.2016

ЕвгенийП пишет:
Так и здесь. Когда я писал, я имел в виду использование пинов.

что же, значит звезды так сошлись, что количество многих пинов и длинныых таймеров скоррелировало   

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:

в Афгане, что ли?

Ну, а где ж ещё?