Цитата: Даниэль от июля 2, 2015, 00:32
Я, например, отлично понимаю, что программирование - намного более низкий уровень интеллектуального развития, чем чистая математика, и знаю, что в свое время просто "не потянул".
Ты напомнил мне недавнюю историю.
Передо мной встала задача: расположить все 20 возможных сочетаний двух чисел из пяти (порядок в паре имеет значение) по кругу так, чтобы рядом (включая диагональ) не оказывались одинаковые числа.
Пример решения для 5 сочетаний:
1 3 5 2 42 4 1 3 5
Но нужно уложить все 20.
Я пару часов пытался решить эту задачу в уме. Ничего не получалось.
Потом я взял двухцветные палочки и стал пытаться сложить из них. Провозился ещё полтора часа, ничего не вышло, я предположил, что задача неразрешима, но доказать этого не смог.
На следующий день я за пару часов написал программу из 70 строчек, и она мне менее чем за минуту выдала 38568 решений!
(Причём программа работает в виртуальной машине вроде явы, что заведомо снижает скорость как минимум на порядок).
$MACRO charlie from all trans;
def_int(a,i,value,used,checked_cnt,match_cnt,links_num,neighbours,buf,buf_size,buf_ofs,handle);
def_str(s,links_str);
neighbours:=succ(str_adr('|1|2|3|4|0|6|7|8|9|5|4|0|1|2|3|9|5|6|7|8|7|9|6|8|5|4|2|0|3|1'));
if_not buf:=allocate_memory(buf_size:=44000) then exit; end;
links_num:=checked_cnt:=match_cnt:=handle:=0;
build_values:
links_str:=recode(str(links_num,19,%'0',3),'012','|0|10|20');
value:=0; i:=19; used:=1;
repeat
a:=1 shl double(value:=memb[neighbours+links_str[20-i]+value]);
if used & double(a) then
a:=1;
power3:
--i;
if i then a*=3; goto power3; end;
links_num+=a;
goto next_links;
end;
used+=a;
--i;
until_not i;
++checked_cnt;
if_not pred(value)\3 then
++match_cnt;
value:=0; i:=19; s:='0';
repeat
s+=char(%'0'+(value:=memb[neighbours+links_str[20-i]+value]));
--i;
until_not i;
make_message(tstr(seconds(macro_timer))+str(links_num,11)+' '+str(match_cnt)+' of '+str(checked_cnt)+' match. |0|10'+s);
if buf_ofs>=buf_size then call flush; end;
mems[buf+buf_ofs]:=s+'|13|10'; buf_ofs+=22;
end;
inc_links:
++links_num;
next_links:
if links_num>=1162261467 then
write('Finished.',71,2,%back,%stat);
goto close_file;
end;
if_not key_pressed then goto build_values; end;
read_key;
if_not key=<Esc> then goto build_values; end;
write('Aborted.',71,2,%back,%stat);
close_file:
if handle then
call flush;
r_bx:=handle; r_ah:=$3E; intr($21);
end;
exit;
flush:
if_not handle then
r_edx:=succ(str_adr('OUTPUT.TXT|0'));
r_ds:=word1(r_edx);
r_cx:=0;
r_ah:=$3C;
intr($21);
if r_flags&1 then make_message('Cannot create output file.'); exit; end;
handle:=r_ax; buf_ofs:=0;
end;
r_dx:=buf; r_ds:=word1(buf); r_cx:=buf_ofs;
r_bx:=handle; r_ah:=$40; intr($21);
if r_flags&1 or (r_ax < buf_ofs) then
make_message('Write error.');
goto close_file;
end;
buf_ofs:=0;
ret;
END_MACRO;
Цитата: Даниэль от июля 2, 2015, 00:32
Я, например, отлично понимаю, что программирование - намного более низкий уровень интеллектуального развития, чем чистая математика, и знаю, что в свое время просто "не потянул". При этом, на самом деле, я немного занимаюсь математикой, но я отчетливо понимаю: в целом математика труднее и интеллектуально выше, чем моя профессия.
Мне кажется, тут не все так просто. На самом деле, программирование, как мне кажется, это вообще отдельная отрасль, по сути, хоть ее и называют прикладной математикой. Программирование нередко требует тех умений и склонностей, которые "чистая" математика требует в меньшей степени. Умение создавать алгоритмы, алгоритмически мыслить, умение, охватывать программу взором и выделять в ней ошибки и нерациональности - это особая сфера. И великолепный "чистый" математик может быть к этому не так уж склонен. Программирование, я бы сказал, в определенные моменты превращается в искусство. Мне кажется, что математическое мышление и алгоритмические - это разные вещи. Я понимаю, что Вы хотите сказать, понимаю, что в глубине своей математика требует очень мощные интеллектуальные способности. Я просто хотел сказать, что такое сравнение лоб в лоб не очень верно, как мне видится.
Цитата: From_Odessa от июля 2, 2015, 10:58
На самом деле, программирование, как мне кажется, это вообще отдельная отрасль, по сути, хоть ее и называют прикладной математикой. Программирование нередко требует тех умений и склонностей, которые "чистая" математика требует в меньшей степени. Умение создавать алгоритмы, алгоритмически мыслить, умение, охватывать программу взором и выделять в ней ошибки и нерациональности - это особая сфера. И великолепный "чистый" математик может быть к этому не так уж склонен. Программирование, я бы сказал, в определенные моменты превращается в искусство. Мне кажется, что математическое мышление и алгоритмические - это разные вещи. Я понимаю, что Вы хотите сказать, понимаю, что в глубине своей математика требует очень мощные интеллектуальные способности. Я просто хотел сказать, что такое сравнение лоб в лоб не очень верно, как мне видится.
Ага.
Цитата: From_Odessa от июля 2, 2015, 10:58Мне кажется, тут не все так просто. На самом деле, программирование, как мне кажется, это вообще отдельная отрасль, по сути, хоть ее и называют прикладной математикой.
Как-то читал у кого-то из великих американских программистов (не помню, у кого... то ли создателя Паскаля, то ли создателя Си), что программирование отнесено к прикладной математике по ошибке. На самом деле, это область прикладной лингвистики, и из линвистов получаются намного лучшие программисты, чем из математиков. :) Мысль парадоксальна, но только на первый взгляд.
Цитата: mnashe от июля 2, 2015, 10:53
Цитата: Даниэль от июля 2, 2015, 00:32
Я, например, отлично понимаю, что программирование - намного более низкий уровень интеллектуального развития, чем чистая математика, и знаю, что в свое время просто "не потянул".
Ты напомнил мне недавнюю историю.
Передо мной встала задача: расположить все 20 возможных сочетаний двух чисел из пяти (порядок в паре имеет значение) по кругу так, чтобы рядом (включая диагональ) не оказывались одинаковые числа.
Пример решения для 5 сочетаний:
1 3 5 2 4
2 4 1 3 5
Но нужно уложить все 20.
Я пару часов пытался решить эту задачу в уме. Ничего не получалось.
Потом я взял двухцветные палочки и стал пытаться сложить из них. Провозился ещё полтора часа, ничего не вышло, я предположил, что задача неразрешима, но доказать этого не смог.
На следующий день я за пару часов написал программу из 70 строчек, и она мне менее чем за минуту выдала 38568 решений!
(Причём программа работает в виртуальной машине вроде явы, что заведомо снижает скорость как минимум на порядок).
Долго работает твоя программа :)
Математик сразу бы вспомнил про коды Грея (https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4_%D0%93%D1%80%D0%B5%D1%8F). За пару минут я уже нашел решение твоей задачи для сочетаний (http://e-maxx.ru/algo/generating_combinations). Остается сделать то же для размещений (твои комбинации называются размещениями из 5 элементов по 2 без повторений).
Проблема твоего примера в том, что он явно придуман искусственно. Если на практике встретится что-то подобное, то там будут не 2 цифры из 5, а, скажем, 4 цифры из 4 миллиардов. И без теории ты просто не сможешь написать программу, работающую приемлемое время.
В реальности, разумеется, программирование иногда помогает математике. Так, иногда случается, что доказать некую теорему в общем виде не удается, но можно доказать, скажем, что если она выполнена вот для такого количества частных случаев, то она верна всегда. И если повезет, случается, что этих частных случаев, во-первых, конечное число, а во-вторых, не астрономическое (вроде 10 в миллиардной степени). Чаще всего, собственно, это количество вообще измеряется единицами, и таким образом математика развивалась до появления компьютеров: их проверяли вручную. Сейчас же стало возможным выходить из положения также и в случае, когда их количество, допустим, триллионы. Если не ошибаюсь, это использовали при доказательстве теоремы Ферма. Я сам недавно именно так доказал важную для алгоритмики теорему: http://algart.net/ru/discrete_geometry/connectivity_theorem.html Правда, возникает еще один неизбежный (и неприятный с точки зрения доказательства) вопрос: правильность программы тоже нуждается в доказательстве.
В целом же, конечно, математика действительно царица, а программирование - лишь служанка.
Что же до нашего спора, может быть, попробуешь выражаться более нейтрально, без эмоций? У меня такое впечатление, что они (эмоции) несколько мешают адекватной дискуссии. Честное слово, твое жуткое понятие "фаллометрия" мне и в голову не приходило. Я и слова-то такого не знал.
Кстати, в порядке офтопика: я только что прочитал у Йешайаhу (20-я глава), что, оказывается, 5 городов Мицраима обратятся к Единому Богу и будут служить Ему, не больше и не меньше, вместо с Ашуром, а Исраэль для них будет третьим. Это пророчество когда-то сбылось? О чем рассказывает пророк? В моем комментарии про это ничего не сказано, может быть ты знаешь.
Цитата: Даниэль от июля 2, 2015, 14:43
Математик сразу бы вспомнил про коды Грея. За пару минут я уже нашел решение твоей задачи для сочетаний. Остается сделать то же для размещений (твои комбинации называются размещениями из 5 элементов по 2 без повторений).
Ничего не понял :(
Ни что дают мне коды Грея, ни чем помогут решение задачи для сочетаний в решении задачи для размещений.
Цитата: Даниэль от июля 2, 2015, 14:43
Проблема твоего примера в том, что он явно придуман искусственно.
А вот и не угадал :)
Задача как раз-таки совершенно практическая.
Начну с самого начала.
Имеется трёминутный таймер. В ванной висит. Помогает детям чистить зубы три минуты.
Таймер бесконечный, как часы. «Циферблат» — 20 цветных светодиодов. В верхней половине — белый, красный, оранжевый, жёлтый, ЖЗ, белый, зелёный, СЗ, синий, сиреневый; в нижней половине то же самое в том же порядке. Нужно просто запомнить точку начала отсчёта и ждать возвращения в ту же точку.
Сейчас схема таймера такова: сигнал мультивибратора, построенного на элементе микросхемы триггера Шмидта 74HC14, поступает на вход микросхемы десятичного счётчика CD4017, последовательно переключающего 10 выходов, к каждому из которых подключено по два соседних светодиода. Второй вывод каждого нечётного светодиода подключается к выходу триггера Шмидта напрямую, а каждого чётного — туда же через инвертор. В результате получается, что первые 9 секунд горит первый светодиод в паре, вторые 9 секунд — второй, потом счётчик активирует следующую пару.
Я хочу переделать схему так, чтобы она работала на микроконтроллере. На самом дешёвом, за 35 центов. У него 6 выводов (не считая питания): 5 входов-выходов и один только-вход.
Пять выводов могут переключать 20 светодиодов методом charlie-plexing (по имени изобретателя), где на каждое сочетание двух выходов МК вешается по два противоположно направленных светодиода. Чтобы выбрать пару, нужно всех выходы, кроме двух, относящихся к данной паре, переключить на вход («высокоимпедансное состояние», а на эти два подать либо плюс и минус, либо минус и плюс. Таким образом n выводов МК могут адресовать n•(n−1) светодиодов. На три вывода вешается 6 штук, на четыре — 12, на пять — 20.
Что мне даёт замена схемы управления?
Во-первых, можно избавиться от нужды в выключателе: микроконтроллер может автоматически выключаться через несколько кругов, а его потребление в режиме сна ничтожно. Можно поместить таймер в герметичной коробке и включать его встряхиванием или переворачиванием. Ну или просто кнопку нажимать, защитив её плёнкой.
Во-вторых, используя на выходе ШИМ, я могу сделать включение и выключение каждого светодиода плавным (программу на ассемблере для PIC написал уже давно).
В-третьих, у charlie-plexing, начиная с 4 выводов, есть «скрытая возможность» — можно включать одновременно два светодиода, если они висят на разных каналах. Например, одновременно с 1-2 можно включать 3-4 или 4-3 или 3-5 или 5-3.
Я хочу применить эту фичу для того, чтобы каждая фаза длилась не 9 секунд, а 4,5. Так интереснее смотрится.
1 Первый светодиод горит.
2 Первый и второй.
3 Второй.
4 Второй и третий.
5 Третий.
6 Третий и четвёртый.
...
39 Двадцатый.
40 Двадцатый и первый.
Вот отсюда и возникла описанная математическая задача.
Цитата: mnashe от июля 2, 2015, 10:53
Цитата: Даниэль от июля 2, 2015, 00:32
Я, например, отлично понимаю, что программирование - намного более низкий уровень интеллектуального развития, чем чистая математика, и знаю, что в свое время просто "не потянул".
Ты напомнил мне недавнюю историю.
Передо мной встала задача: расположить все 20 возможных сочетаний двух чисел из пяти (порядок в паре имеет значение) по кругу так, чтобы рядом (включая диагональ) не оказывались одинаковые числа.
Пример решения для 5 сочетаний:
1 3 5 2 4
2 4 1 3 5
Но нужно уложить все 20.
Я пару часов пытался решить эту задачу в уме. Ничего не получалось.
Потом я взял двухцветные палочки и стал пытаться сложить из них. Провозился ещё полтора часа, ничего не вышло, я предположил, что задача неразрешима, но доказать этого не смог.
На следующий день я за пару часов написал программу из 70 строчек, и она мне менее чем за минуту выдала 38568 решений!
(Причём программа работает в виртуальной машине вроде явы, что заведомо снижает скорость как минимум на порядок).
$MACRO charlie from all trans;
def_int(a,i,value,used,checked_cnt,match_cnt,links_num,neighbours,buf,buf_size,buf_ofs,handle);
def_str(s,links_str);
neighbours:=succ(str_adr('|1|2|3|4|0|6|7|8|9|5|4|0|1|2|3|9|5|6|7|8|7|9|6|8|5|4|2|0|3|1'));
if_not buf:=allocate_memory(buf_size:=44000) then exit; end;
links_num:=checked_cnt:=match_cnt:=handle:=0;
build_values:
links_str:=recode(str(links_num,19,%'0',3),'012','|0|10|20');
value:=0; i:=19; used:=1;
repeat
a:=1 shl double(value:=memb[neighbours+links_str[20-i]+value]);
if used & double(a) then
a:=1;
power3:
--i;
if i then a*=3; goto power3; end;
links_num+=a;
goto next_links;
end;
used+=a;
--i;
until_not i;
++checked_cnt;
if_not pred(value)\3 then
++match_cnt;
value:=0; i:=19; s:='0';
repeat
s+=char(%'0'+(value:=memb[neighbours+links_str[20-i]+value]));
--i;
until_not i;
make_message(tstr(seconds(macro_timer))+str(links_num,11)+' '+str(match_cnt)+' of '+str(checked_cnt)+' match. |0|10'+s);
if buf_ofs>=buf_size then call flush; end;
mems[buf+buf_ofs]:=s+'|13|10'; buf_ofs+=22;
end;
inc_links:
++links_num;
next_links:
if links_num>=1162261467 then
write('Finished.',71,2,%back,%stat);
goto close_file;
end;
if_not key_pressed then goto build_values; end;
read_key;
if_not key=<Esc> then goto build_values; end;
write('Aborted.',71,2,%back,%stat);
close_file:
if handle then
call flush;
r_bx:=handle; r_ah:=$3E; intr($21);
end;
exit;
flush:
if_not handle then
r_edx:=succ(str_adr('OUTPUT.TXT|0'));
r_ds:=word1(r_edx);
r_cx:=0;
r_ah:=$3C;
intr($21);
if r_flags&1 then make_message('Cannot create output file.'); exit; end;
handle:=r_ax; buf_ofs:=0;
end;
r_dx:=buf; r_ds:=word1(buf); r_cx:=buf_ofs;
r_bx:=handle; r_ah:=$40; intr($21);
if r_flags&1 or (r_ax < buf_ofs) then
make_message('Write error.');
goto close_file;
end;
buf_ofs:=0;
ret;
END_MACRO;
А если программа бы не выдала ни одного решения? Где гарантия, что их действительно нет?
Слабонервным под спойлер не лазить. Запутаетесь в жёнах, детях и мужьях.
Муж (мой) щас даёт студентам 1-го курса в качестве научной работы задачки на замощение, какая-то популярная нынче тема на студенческих математических школах. И вот одну задачу он решить не смог.
Конкретно, ему почему-то показалось, что в этой задаче замощения не существует, он стал доказывать, но доказать это не смог. Затем он предложил эту задачу Лене, молодому математику, коллеге по кафедре. Лена поленилась и передала её своему мужу Денису. Денис (наш бывший студент, умница, профессиональный программист и глава нашего клуба ЧГК) написал замащивающую программу, но она не выдала ни одного решения. О чём перед игрой ЧГК Денис проинформировал моего мужа.
Далее, услышавшая об этом дочь капитана нашей команды Лина, аспирантка МФТИ (приехавшая на лето и пришедшая на игру вместо меня, я щас никуда не хожу) за 5 мин. придумала пример замощения. Торжество чистого математического разума над тупым перебором, Давида над Голиафом ;D
Цитата: mnashe от июля 2, 2015, 15:58
Цитата: Даниэль от июля 2, 2015, 14:43
Математик сразу бы вспомнил про коды Грея. За пару минут я уже нашел решение твоей задачи для сочетаний. Остается сделать то же для размещений (твои комбинации называются размещениями из 5 элементов по 2 без повторений).
Ничего не понял :(
Ни что дают мне коды Грея, ни чем помогут решение задачи для сочетаний в решении задачи для размещений.
Коды Грея - просто самое близкое, первое, что приходит на ум. А через 5 минут Гугла становится ясно, что алгоритмы их генерации можно положить в основу генерации сочетаний, перестановок и размещений, если хочется, чтобы соседи отличались.
Цитата: mnashe от июля 2, 2015, 15:58
Цитата: Даниэль от июля 2, 2015, 14:43
Проблема твоего примера в том, что он явно придуман искусственно.
А вот и не угадал :)
Задача как раз-таки совершенно практическая.
Начну с самого начала.
Имеется трёминутный таймер. В ванной висит. Помогает детям чистить зубы три минуты.
Таймер бесконечный, как часы. «Циферблат» — 20 цветных светодиодов. В верхней половине — белый, красный, оранжевый, жёлтый, ЖЗ, белый, зелёный, СЗ, синий, сиреневый; в нижней половине то же самое в том же порядке. Нужно просто запомнить точку начала отсчёта и ждать возвращения в ту же точку.
Сейчас схема таймера такова: сигнал мультивибратора, построенного на элементе микросхемы триггера Шмидта 74HC14, поступает на вход микросхемы десятичного счётчика CD4017, последовательно переключающего 10 выходов, к каждому из которых подключено по два соседних светодиода. Второй вывод каждого нечётного светодиода подключается к выходу триггера Шмидта напрямую, а каждого чётного — туда же через инвертор. В результате получается, что первые 9 секунд горит первый светодиод в паре, вторые 9 секунд — второй, потом счётчик активирует следующую пару.
Жуть какая :) Мне казалось, такие развлечения ушли в прошлое лет 30 назад. А поди ж ты... Любители вроде тебя все еще такое конструируют.
Сейчас как-то более принято написать приложение на чем-нибудь вроде Objective C или Java, которая делает в точности то, что тебе нужно. И использовать какое-нибудь устройство, для которого такой язык - входной. Скоро, наверно, других микроустройств и вовсе не останется.
А задачи вроде той, которую ты решил, давно ушли в область проектирования микропроцессоров, да и там уже "входные" языки для описания поведения узлов далеко не так просты. Но в любом случае при проектировании и анализе микропроцессоров приходится иметь дело с миллионами элементов, а не с десятками.
Мне вот сейчас пришлось решать задачу о поиске границы у нескольких перекрывающихся прямоугольников. Вполне себе реальная задача - современные микроскопы так себя ведут, снимают картинку серией прямоугольных кадров и потом склеивают их. А для экономии места подчас снимают не все подряд, а область, указанную пользователем (скажем, кусочек ткани). Кабы прямоугольников было три, тоже можно было бы решить "на пальцах". Но их, чаще всего, десятки тысяч. И снова без математики никуда. Соответствующая область геометрии так и называется - вычислительная геометрия, и по сути это именно математика: разработка алгоритма, для которого, во-первых, надо доказать, что он работает, а во-вторых, дать асимптотическую оценку, что он не затратит N^2 операций, но уложится, скажем, в N log N.
Цитата: _Swetlana от июля 2, 2015, 16:26
А если программа бы не выдала ни одного решения? Где гарантия, что их действительно нет?
Это исключено, поскольку программа перебрала
все возможные варианты (больше миллиарда — 1,147,715,240).
Цитата: _Swetlana от июля 2, 2015, 16:26
Цитата: mnashe от июля 2, 2015, 10:53
Цитата: Даниэль от июля 2, 2015, 00:32
Я, например, отлично понимаю, что программирование - намного более низкий уровень интеллектуального развития, чем чистая математика, и знаю, что в свое время просто "не потянул".
Ты напомнил мне недавнюю историю.
Передо мной встала задача: расположить все 20 возможных сочетаний двух чисел из пяти (порядок в паре имеет значение) по кругу так, чтобы рядом (включая диагональ) не оказывались одинаковые числа.
Пример решения для 5 сочетаний:
1 3 5 2 4
2 4 1 3 5
Но нужно уложить все 20.
Я пару часов пытался решить эту задачу в уме. Ничего не получалось.
Потом я взял двухцветные палочки и стал пытаться сложить из них. Провозился ещё полтора часа, ничего не вышло, я предположил, что задача неразрешима, но доказать этого не смог.
На следующий день я за пару часов написал программу из 70 строчек, и она мне менее чем за минуту выдала 38568 решений!
(Причём программа работает в виртуальной машине вроде явы, что заведомо снижает скорость как минимум на порядок).
$MACRO charlie from all trans;
def_int(a,i,value,used,checked_cnt,match_cnt,links_num,neighbours,buf,buf_size,buf_ofs,handle);
def_str(s,links_str);
neighbours:=succ(str_adr('|1|2|3|4|0|6|7|8|9|5|4|0|1|2|3|9|5|6|7|8|7|9|6|8|5|4|2|0|3|1'));
if_not buf:=allocate_memory(buf_size:=44000) then exit; end;
links_num:=checked_cnt:=match_cnt:=handle:=0;
build_values:
links_str:=recode(str(links_num,19,%'0',3),'012','|0|10|20');
value:=0; i:=19; used:=1;
repeat
a:=1 shl double(value:=memb[neighbours+links_str[20-i]+value]);
if used & double(a) then
a:=1;
power3:
--i;
if i then a*=3; goto power3; end;
links_num+=a;
goto next_links;
end;
used+=a;
--i;
until_not i;
++checked_cnt;
if_not pred(value)\3 then
++match_cnt;
value:=0; i:=19; s:='0';
repeat
s+=char(%'0'+(value:=memb[neighbours+links_str[20-i]+value]));
--i;
until_not i;
make_message(tstr(seconds(macro_timer))+str(links_num,11)+' '+str(match_cnt)+' of '+str(checked_cnt)+' match. |0|10'+s);
if buf_ofs>=buf_size then call flush; end;
mems[buf+buf_ofs]:=s+'|13|10'; buf_ofs+=22;
end;
inc_links:
++links_num;
next_links:
if links_num>=1162261467 then
write('Finished.',71,2,%back,%stat);
goto close_file;
end;
if_not key_pressed then goto build_values; end;
read_key;
if_not key=<Esc> then goto build_values; end;
write('Aborted.',71,2,%back,%stat);
close_file:
if handle then
call flush;
r_bx:=handle; r_ah:=$3E; intr($21);
end;
exit;
flush:
if_not handle then
r_edx:=succ(str_adr('OUTPUT.TXT|0'));
r_ds:=word1(r_edx);
r_cx:=0;
r_ah:=$3C;
intr($21);
if r_flags&1 then make_message('Cannot create output file.'); exit; end;
handle:=r_ax; buf_ofs:=0;
end;
r_dx:=buf; r_ds:=word1(buf); r_cx:=buf_ofs;
r_bx:=handle; r_ah:=$40; intr($21);
if r_flags&1 or (r_ax < buf_ofs) then
make_message('Write error.');
goto close_file;
end;
buf_ofs:=0;
ret;
END_MACRO;
А если программа бы не выдала ни одного решения? Где гарантия, что их действительно нет?
Слабонервным под спойлер не лазить. Запутаетесь в жёнах, детях и мужьях.
Муж (мой) щас даёт студентам 1-го курса в качестве научной работы задачки на замощение, какая-то популярная нынче тема на студенческих математических школах. И вот одну задачу он решить не смог.
Конкретно, ему почему-то показалось, что в этой задаче замощения не существует, он стал доказывать, но доказать это не смог. Затем он предложил эту задачу Лене, молодому математику, коллеге по кафедре. Лена поленилась и передала её своему мужу Денису. Денис (наш бывший студент, умница, профессиональный программист и глава нашего клуба ЧГК) написал замащивающую программу, но она не выдала ни одного решения. О чём перед игрой ЧГК Денис проинформировал моего мужа.
Далее, услышавшая об этом дочь капитана нашей команды Лина, аспирантка МФТИ (приехавшая на лето и пришедшая на игру вместо меня, я щас никуда не хожу) за 5 мин. придумала пример замощения. Торжество чистого математического разума над тупым перебором, Давида над Голиафом ;D
:) Бывает. Хотя обычно программу написать легче, но только писать ее надо правильно: доказав перед этим, что она и правда перебирает все возможные замощения. Процесс такого доказательства нередко приводит к тому, что программа оказывается не нужна: замощение находится в процессе обдумывания, все ли варианты учла программа.
Скорее всего, эта задача (она же математикам предлагалась) допускала решение путем "просто подумать". Реально возникающие задачи обычно не так просты - там объемы входных данных очень велики. Но без математики все равно никуда: разработка правильного и быстрого алгоритма остается серьезной математической задачей. Разница примерно такая же, как между решением одного конкретного кубического уравнения, у которого есть целый корень, подобранный автором задачи (и тогда остается его угадать небольшим перебором и свести к квадратному), и между разработкой универсального метода Кардано. Первое - задача для математика-школьника, второе - для профессионала. Так обычно и с алгоритмами. Простое решение для специально подобранной задачи удается найти вручную, а в промышленной задаче с промышленными объемами данных нужен математик-профессионал, который разработает правильный алгоритм, докажет его корректность, оценит память и время, а затем запрограммирует и протестирует (здесь ему может помочь и программист).
Цитата: From_Odessa от июля 2, 2015, 10:58
Мне кажется, тут не все так просто. На самом деле, программирование, как мне кажется, это вообще отдельная отрасль, по сути, хоть ее и называют прикладной математикой. Программирование нередко требует тех умений и склонностей, которые "чистая" математика требует в меньшей степени. Умение создавать алгоритмы, алгоритмически мыслить, умение, охватывать программу взором и выделять в ней ошибки и нерациональности - это особая сфера. И великолепный "чистый" математик может быть к этому не так уж склонен. Программирование, я бы сказал, в определенные моменты превращается в искусство. Мне кажется, что математическое мышление и алгоритмические - это разные вещи. Я понимаю, что Вы хотите сказать, понимаю, что в глубине своей математика требует очень мощные интеллектуальные способности. Я просто хотел сказать, что такое сравнение лоб в лоб не очень верно, как мне видится.
Отличная мысль. Я-то думаю, почему чистое программирование, никаким боком не относящееся к математике, а больше к лингвистике, даётся мне относительно легко, а математика всегда давалась с трудом — видимо, тип мышления под неё не заточен.
Цитата: mnashe от июля 2, 2015, 16:38
Цитата: _Swetlana от июля 2, 2015, 16:26
А если программа бы не выдала ни одного решения? Где гарантия, что их действительно нет?
Это исключено, поскольку программа перебрала все возможные варианты (больше миллиарда — 1,147,715,240).
Потому что у тебя задача тривиальная. Да и то, глядя на программу, я бы не взялся быстро доказать ее правильность.
А мне надо было перебрать набор всех вариантов битовой матрицы, достаточный для того, чтобы быть уверенным, что если процедура скелетизации не "лажается" на них, то она не "лажается" никогда. Переборную программу-то я написал быстро, за неделю. А вот на доказательство того, что этот набор и правда достаточен, т.е. что перебрал ВСЕ возможные случаи, у меня ушло полгода.
Цитата: Даниэль от июля 2, 2015, 16:32
Сейчас как-то более принято написать приложение на чем-нибудь вроде Objective C или Java, которая делает в точности то, что тебе нужно.
Делать больше нечего.
С задачей переключения прекрасно справляется и программа на ассемблере. Там вообще всё тривиально.
Нетривиально, правда, плавное (логарифмическое) управление яркостью с помощью ШИМ. Это действительно была интересная задача. Но я её уже давно решил.
Задача, которую мне сейчас надо было решить, к програмиированию не имеет никакого отношения. Мне нужно было правильно подключить каждый из 20 светодиодов, расположенных по кругу.
Печатная плата уже нарисована (по одному из множества вариантов, выданных программой).
Цитата: Даниэль от июля 2, 2015, 16:32
И использовать какое-нибудь устройство, для которого такой язык - входной. Скоро, наверно, других микроустройств и вовсе не останется.
Пока что обычные 8-битные микроконтроллеры и не думают умирать.
Цитата: Даниэль от июля 2, 2015, 16:48
Потому что у тебя задача тривиальная.
Конечно.
Цитата: Даниэль от июля 2, 2015, 16:48
Да и то, глядя на программу, я бы не взялся быстро доказать ее правильность.
Та не, там всё просто.
Цитата: mnashe от июля 2, 2015, 16:38
Цитата: _Swetlana от июля 2, 2015, 16:26
А если программа бы не выдала ни одного решения? Где гарантия, что их действительно нет?
Это исключено, поскольку программа перебрала все возможные варианты (больше миллиарда — 1,147,715,240).
Про ту программу автор тоже думал, что она перебрала все возможные варианты. Перебор геометрических вариантов вещь довольно сложная, можно и обшибицца. Ещё более интересен перебор всех вариантов замощения бесконечной плоскости.
Но прецедент, однако, был - программе был присвоен статус доказательства для NP-полной задачи раскраски неориентированного графа в минимальное число цветов (конкретно, её частного случая - задачи о четырёх красках).
ЦитироватьК. Аппель и В. Хакен доказали в 1976 г., что так можно раскрасить любую карту. Это была первая крупная математическая теорема, для доказательства которой был применён компьютер. Несмотря на последующие упрощения, доказательство практически невозможно проверить, не используя компьютер. Поэтому некоторые математики отнеслись к этому доказательству с недоверием, что объяснялось не только использованием компьютера, но и громоздкостью описания алгоритма первых доказательств (741 страница), впоследствии были предложены более компактные алгоритмы и скорректирован ряд ошибок[1]. Проблема четырёх красок является одним из известнейших прецедентов неклассического доказательства в современной математике.
Новое доказательство, основанное на алгебраических и топологических методах, дал индийский математик Ашей Дарвадкер[2] в 2000 году.
Цитата: From_Odessa от июля 2, 2015, 10:58
Цитата: Даниэль от июля 2, 2015, 00:32
Я, например, отлично понимаю, что программирование - намного более низкий уровень интеллектуального развития, чем чистая математика, и знаю, что в свое время просто "не потянул". При этом, на самом деле, я немного занимаюсь математикой, но я отчетливо понимаю: в целом математика труднее и интеллектуально выше, чем моя профессия.
Мне кажется, тут не все так просто. На самом деле, программирование, как мне кажется, это вообще отдельная отрасль, по сути, хоть ее и называют прикладной математикой. Программирование нередко требует тех умений и склонностей, которые "чистая" математика требует в меньшей степени. Умение создавать алгоритмы, алгоритмически мыслить, умение, охватывать программу взором и выделять в ней ошибки и нерациональности - это особая сфера. И великолепный "чистый" математик может быть к этому не так уж склонен. Программирование, я бы сказал, в определенные моменты превращается в искусство. Мне кажется, что математическое мышление и алгоритмические - это разные вещи. Я понимаю, что Вы хотите сказать, понимаю, что в глубине своей математика требует очень мощные интеллектуальные способности. Я просто хотел сказать, что такое сравнение лоб в лоб не очень верно, как мне видится.
Программирование - неустоявшийся термин, ему всего полвека. Поэтому этим словом называют что угодно, от верстки сайта до разработки алгоритма быстрой сортировки.
Я бы выделил в
данном случае две области (на самом деле их больше, и они имеют друг к другу отдаленное отношение).
1) Алгоритмическое программирование. По сути, это действительно область математики. Разработка алгоритма, собственно, может начаться и закончиться на бумаге, не подходя к компьютеру (это, конечно, не рекомендуется, но встречается). Книга Кнута "Искусство программирования" - прекрасный образец алгоритмического программирования, и если вы помните, Великая теорема Ферма там значилась в качестве одного из упражнений еще во "Введении".
2) Системное программирование. Только не в смысле "ковыряние в железяках", а в смысле - проектирование сложных систем. Это умение грамотно спроектировать архитектуру пакетов, классов, интерфейсов, методов, решающих задачу, так чтобы программа получилась понятной, доступной для развития и сопровождения, расширяемой и т.д. Это знание так называемых паттернов и антипаттернов проектирования для данного языка (а сегодня это обычно ООП). Это владение собственно языками, знание их сильных и слабых мест, понимание производительности. Это знание существующих и разрабатывающихся сегодня библиотек, умение быстро найти готовое решение в интернете. Некоторое место здесь занимает и умение оптимизировать программу (не алгоритм, а именно программу), но это умение играет все меньшую роль по мере развития "интеллекта" платформ, при этом оно всегда и во все времена было менее важным, чем умение создать эффективный алгоритм (область №1).
А что касается искусства, то математика всегда и с самого начала - чистое искусство. Программирование, особенно вторая область, привносит сюда элементы технологии: можно не иметь гениального ума, просто знать основы и иметь обширное образование, и все же справиться с трудной задачей. Поэтому, собственно, я и предпочел его в свое время: для математики мой ум, на мой вкус, недостаточен.
Цитата: Даниэль от июля 2, 2015, 16:41
Скорее всего, эта задача (она же математикам предлагалась) допускала решение путем "просто подумать".
Конечно. Задачи были взяты из журнала "Квант".
Цитата: mnashe от июля 2, 2015, 16:51
Цитата: Даниэль от июля 2, 2015, 16:32
Сейчас как-то более принято написать приложение на чем-нибудь вроде Objective C или Java, которая делает в точности то, что тебе нужно.
Делать больше нечего.
С задачей переключения прекрасно справляется и программа на ассемблере. Там вообще всё тривиально.
Нетривиально, правда, плавное (логарифмическое) управление яркостью с помощью ШИМ. Это действительно была интересная задача. Но я её уже давно решил.
Задача, которую мне сейчас надо было решить, к програмиированию не имеет никакого отношения. Мне нужно было правильно подключить каждый из 20 светодиодов, расположенных по кругу.
Печатная плата уже нарисована (по одному из множества вариантов, выданных программой).
Вот это тебе делать нечего, уж прости :) Если бы я взялся заниматься чем-то подобным на работе, меня бы шеф сразу остановил. Просто потому, что там вопрос звучит так: что дешевле - потратить 100 долларов на готовое устройство и 10 минуты на его программирование или же потратить 100 долларов на час работы программиста. Потому, собственно, у нас и нет устройств с языком Java за 35 центов: не потому, что их производить дороже, а потому, что это никого не интересует. Просто некому будет для них программировать - не найдется программистов, работа которых будет оцениваться в таких единицах. Исключение, конечно, составляют сверхпопулярные устройства, где одна и та же программа тиражируется в миллионах экземпляров; там цена и правда может быть очень маленькой.
Цитата: _Swetlana от июля 2, 2015, 16:57
Цитата: mnashe от июля 2, 2015, 16:38
Цитата: _Swetlana от июля 2, 2015, 16:26
А если программа бы не выдала ни одного решения? Где гарантия, что их действительно нет?
Это исключено, поскольку программа перебрала все возможные варианты (больше миллиарда — 1,147,715,240).
Про ту программу автор тоже думал, что она перебрала все возможные варианты. Перебор геометрических вариантов вещь довольно сложная, можно и обшибицца. Ещё более интересен перебор всех вариантов замощения бесконечной плоскости.
О чем я и говорю.
ЦитироватьА вот на доказательство того, что этот набор и правда достаточен, т.е. что перебрал ВСЕ возможные случаи, у меня ушло полгода.
Цитата: Даниэль от июля 2, 2015, 16:57
А что касается искусства, то математика всегда и с самого начала - чистое искусство.
Когда я пришла на форум, захотелось мне где-то что-то написать. О чём знаю. Вот нашла я какую-то математическую тему и написала, что математика не является
естественной наукой. Меня повалили и дружно пинали ногами ;D
Цитата: _Swetlana от июля 2, 2015, 17:05
Меня повалили и дружно пинали ногами
За что?
Цитата: _Swetlana от июля 2, 2015, 17:05
Меня повалили и дружно пинали ногами ;D
Интересно, чем
пинали аргументировали...
Цитата: _Swetlana от июля 2, 2015, 17:05
Цитата: Даниэль от июля 2, 2015, 16:57
А что касается искусства, то математика всегда и с самого начала - чистое искусство.
Когда я пришла на форум, захотелось мне где-то что-то написать. О чём знаю. Вот нашла я какую-то математическую тему и написала, что математика не является естественной наукой. Меня повалили и дружно пинали ногами ;D
Разумеется, не является! Вы разве не знали?
Все науки делятся на 4 группы.
1) Естественные науки. Физика там, химия, биология, геология.
2) Неестественные науки. К примеру, шекспироведение. Шекспира читать надо, а не науки вокруг него разводить.
3) Противоестественные науки. Ну это все знают: научный атеизм, история КПСС и т.п. Сегодня я бы добавил "науку каббалу" Лайтмана.
4) Сверхъестественные науки. Это, по сути, одна наука, и это математика.
Цитата: _Swetlana от июля 2, 2015, 16:57
Цитата: mnashe от июля 2, 2015, 16:38Цитата: _Swetlana от июля 2, 2015, 16:26А если программа бы не выдала ни одного решения? Где гарантия, что их действительно нет?
Это исключено, поскольку программа перебрала все возможные варианты (больше миллиарда — 1,147,715,240).
Про ту программу автор тоже думал, что она перебрала все возможные варианты.
У меня действительно очень простая задача и очень простой алгоритм.
Щас объясню алгоритм перебора.
Если не учитывать порядок, то у каждой пары есть только три допустимые соседние пары. Пример я выше уже приводил: для 1-2 это 3-4, 3-5 и 4-5.
Берём и нумеруем допустимых соседей. Для каждой из 10 пар их всего три, а всего есть 19 переходов, стало быть, задача сводится к последовательному перебору всех 19-значных троичных чисел.
Проверки две: одна выполняется на каждом шагу, другая только в конце (после 19-го шага).
Первая проверка: если на очередном преобразовании вышла пара, встречавшаяся ранее уже дважды, то все числа, начинающиеся с этой же последовательности, запрещены и перебирать их нет смысла, так что сразу увеличиваем тот разряд, где мы наткнулись на запрет. Это резко сокращает количество перебираемых вариантов.
Вторая проверка: последняя пара является допустимым соседом первой.
Цитата: Flos от июля 2, 2015, 17:03
У меня для тех же целей в ванной песочные часы на 3 минуты.
У меня тоже есть. Для той же цели куплены. Но стоят в спальне про запас.
Преимущества самоделки:
1. Красиво! С детства обожаю цветные лампочки :)
2. Не бьётся при падении.
3. Может пользоваться одновременно любое количество людей, стартовавших несинхронно. Просто каждый должен отметить в голове свою точку старта.
У наших детей почти всегда ситуация такова. Так что актуально. Песочных часов потребовалось бы 2 штуки.
Цитата: Даниэль от июля 2, 2015, 17:03
Вот это тебе делать нечего, уж прости :) Если бы я взялся заниматься чем-то подобным на работе, меня бы шеф сразу остановил. Просто потому, что там вопрос звучит так: что дешевле - потратить 100 долларов на готовое устройство и 10 минуты на его программирование или же потратить 100 долларов на час работы программиста.
Во-первых, то, что ты говоришь, применимо лишь для продукта, создаваемого в единственном экземпляре. Ну или, если немного сдвинуть диапазоны, для маленьких серий.
Во-вторых, ты чего-то не понял. Моя задача в части программирования настолько проста, что хоть на яве, хоть на ассемблере на неё уходит несопоставимо меньше времени, чем на рисование и производство печатной платы (или распайку на макетке, как я сделал с уже существующим вариантом, без МК).
Так что нет смысла и говорить об этом.
Цитата: Даниэль от июля 2, 2015, 17:03
Исключение, конечно, составляют сверхпопулярные устройства, где одна и та же программа тиражируется в миллионах экземпляров; там цена и правда может быть очень маленькой.
Во-о-от!
Цитата: Даниэль от июля 2, 2015, 17:16
Все науки делятся на 4 группы.
1) Естественные науки. Физика там, химия, биология, геология.
2) Неестественные науки. К примеру, шекспироведение. Шекспира читать надо, а не науки вокруг него разводить.
3) Противоестественные науки. Ну это все знают: научный атеизм, история КПСС и т.п. Сегодня я бы добавил "науку каббалу" Лайтмана.
4) Сверхъестественные науки. Это, по сути, одна наука, и это математика.
;D ;up:
Цитата: VLX от июля 2, 2015, 17:15
Цитата: _Swetlana от июля 2, 2015, 17:05
Меня повалили и дружно пинали ногами ;D
Интересно, чем пинали аргументировали...
Ногами. А могли ведь коньками с ботинками. С тех не выпендриваюсь, пишу не знаю о чём ::)
ЦитироватьСверхъестественные науки. Это, по сути, одна наука, и это математика.
О, как раз тема всплыла, репутация постов на ЛФ. Там ссылка есть, на поиск репутации по имени. Попутала малость. Вот этот пост:
Цитироватьматематическую логику я бы отнесла к языкознанию, как науку о языке, а всё остальное, пожалуй, к метафизике (как разделу теологии), кое-что приходится принимать на веру
Есть изоморфизм Карри-Говарда: программа — это доказательство теоремы. А по hott, есть изоморфизм матлогики, теории множеств, теории гомологий и теории типов. ;)
Цитата: Ыняша от июля 2, 2015, 23:16
Есть изоморфизм Карри-Говарда: программа — это доказательство теоремы. А по hott, есть изоморфизм матлогики, теории множеств, теории гомологий и теории типов. ;)
Никогда об этом не слышала.
Программа (алгоритм) = машина Тьюринга = частично-рекурсивная (вычислимая) функция = алгорифм Маркова, всё это чисто конструктивные вещи. На конструктивных доказательствах даже матанализ не построить, в чём убедились ещё в прошлом веке.
Есть обратная интересная проблема. Современная математика так сложна, что на проверку правильности полученных результатов нужны годы. Если бы удалось формализовать запись доказательства до степени программы и заставить всех математиков выучить этот язык, то проверять логику доказательства можно было бы машинным способом.
Цитата: Даниэль от июля 2, 2015, 16:41
Но без математики все равно никуда: разработка правильного и быстрого алгоритма остается серьезной математической задачей.
Ага. Даже в моей простенькой задачке пришлось слегка математически подумать, чтобы перебор не растянулся на несколько недель.
Представь, если бы я перебирал не миллиард вариантов (3¹⁹), причём периодически перескакивая сразу через десятки и сотни миллионов, а все 10²º, решая задачу тупо в лоб. Я сначала посчитал, сколько времени займёт такой перебор (ибо зачем оптимизировать, если программа пишется на один раз?), и понял, что так не выйдет. Тогда вот и нашёл этот вариант с перебором связей, а не самих групп.
Был такой физик Ричард Фейнман. Его "Фейнмановскими лекциями по физике" я просто восхищался в своё время. И там он написал, что математика вообще не наука, потому что она не изучает природу.
Я для себя решил, что математика всё же изучает природу - природу человеческого мозга.
_Swetlana написала, что математическую логику она бы отнесла к языкознанию. Это вряд ли можно сделать. Математика вообще язык, только он столь точен и столь ограничен, что на нем нельзя разговаривать, как и на любом языке программирования. И вот тут и есть причина, почему люди с математическим образованием, или просто со склонностью к простому и четкому мышлению были востребованы в программировании, как профессии в начале становления этой профессии.
Но как уже написал Даниэль сейчас программирование уже нельзя назвать профессией. Эта область деятельности развилась настолько, что здесь сейчас нужны самые разные специалисты от художников до тех же математиков.
From_Odessa описал качества, которые нужны программисту. На мой взгляд, он описал качества присущие математику. Я в своей жизни занимался математикой не больше двух лет сразу после университета. Не считая, конечно, преподавания. Но математика, как способ мышления, кормила меня почти всю жизнь.
Только ближе к 60-то годам пришлось сменить род занятий. А с этого года вообще чистый пенсионер. Развлекаюсь.
Цитата: _Swetlana от июля 2, 2015, 23:32Есть обратная интересная проблема. Современная математика так сложна, что на проверку правильности полученных результатов нужны годы. Если бы удалось формализовать запись доказательства до степени программы и заставить всех математиков выучить этот язык, то проверять логику доказательства можно было бы машинным способом.
Это уже делают, насколько я слышал. Но не для самых сложных случаев.
Математика - язык. А математическая логика - наука о языке. Логично ;D
Помню, как С.Б. Стечкин на лекции сказал, что сплайны - это кусок хлеба. Математика кормит (если не брать преподавание) только в каких-то прикладных задачах.
ЗЫ. Меня всю жизнь муж-математик кормил (и продолжает), а не математика :) хоть я и занималась прикладными задачами дискретной оптимизации, а муж - функциональным анализом.
И ещё насчет сложности современной математики.
Вне математики постоянно возникают задачи, которые позволяют перевести их в математическую форму. И часто эту уже математические задачи не так уж и сложны. Вот их решением и занимаются многие математики. После решения задачи обычно есть куда развить результаты.
Хотя и не всегда.
Цитата: _Swetlana от июля 2, 2015, 23:50
Математика - язык. А математическая логика - наука о языке. Логично ;D
Помню, как С.Б. Стечкин на лекции сказал, что сплайны - это кусок хлеба. Математика кормит (если не брать преподавание) только в каких-то прикладных задачах.
Нет, совсем не логично.
А про математику, как способ прокормиться это вы в качестве реплики к моему сообщению написали?
Цитата: _Swetlana от июля 2, 2015, 23:32
Никогда об этом не слышала.
Программа (алгоритм) = машина Тьюринга = частично-рекурсивная (вычислимая) функция = алгорифм Маркова, всё это чисто конструктивные вещи. На конструктивных доказательствах даже матанализ не построить, в чём убедились ещё в прошлом веке.
Вкратце: есть типы, которые можно отождествить с высказываниями. Объект типа Т — есть доказательство этого высказывания. Теорема формулируется в типах и их производных (что соотвествует логическим операциям, предикатам и т.п), тогда программа, как объект итогового типа будет её доказательством.
В гомотопической теории типов ещё даётся изоморфизм типов с пространствами, объектов с точками, и дальше сечений, расслоения, пути... Плюс теория категорий высших порядков.
Но таки да это конструктивные вещи :3
На этой основе делают унивалентные основания математики — программу построения средствами гомотопической теории типов универсального формального языка, являющегося конструктивными основаниями для современных разделов математики и обеспечивающего возможность автоматической проверки правильности доказательств на компьютере.
Цитата: Ильич от июля 2, 2015, 23:41
Я для себя решил, что математика всё же изучает природу - природу человеческого мозга.
С этим в полной мере не могу согласиться (с тем, что математика изучает природу только в этом разрезе). На мой взгляд, математика изучает в том числе и природу, вернее, говоря шире, мир или Вселенную, какой мы ее знаем и какой мы ее получаем в наших ощущениях. Математика изучает, в числе прочего, формы, которыми может быть представлена Вселенная (ее составляющие) или материя, соотношение между этими формами, она изучает также... как бы это сказать... общие механизмы, на которых строится взаимоотношение между различными объектами/явлениями и процессами. Изучает на базе очень высоких уровней абстракции и идеальных форм/объектов, но изучает. Я так полагаю.
Я тут вот писал в свое время еще свои мысли о математике - О математике (http://lingvoforum.net/index.php/topic,32545.0.html)
Хотя частично я уже с самим собой не согласен.
Цитата: Ильич от июля 2, 2015, 23:41
программирование уже нельзя назвать профессией. Эта область деятельности развилась настолько, что здесь сейчас нужны самые разные специалисты от художников до тех же математиков.
+1000
Всю трудовую жизнь занимаюсь программированием, математика как таковая потребовалась ровно
один раз (нужно было шифровать данные открытым ключом).
Программирование - это инструмент, но никоим образом не
математический инструмент, просто инструмент, облегчающий любые рутинные задачи.
Цитата: Flos от июля 3, 2015, 09:28
Всю трудовую жизнь занимаюсь программированием, математика как таковая потребовалась ровно один раз (нужно было шифровать данные открытым ключом).
:E:
Ипотеку не брали, проценты не рассчитывали?
Цитата: Ильич от июля 3, 2015, 00:00
Цитата: _Swetlana от июля 2, 2015, 23:50
Математика - язык. А математическая логика - наука о языке. Логично ;D
Помню, как С.Б. Стечкин на лекции сказал, что сплайны - это кусок хлеба. Математика кормит (если не брать преподавание) только в каких-то прикладных задачах.
Нет, совсем не логично.
А про математику, как способ прокормиться это вы в качестве реплики к моему сообщению написали?
В качестве реплики.
Что не логично?
Цитата: _Swetlana от июля 3, 2015, 09:39
Ипотеку не брали, проценты не рассчитывали?
Ага, смешно.
У меня жена деньги считает, мне не доверяет.
;)
Сыну задачки не решали? ;D
Низшая математика
Пап, а пап, у меня тут по математике задали...- Гоша неловко переминался с ноги на ногу.
- У мамы спроси. – отбил подачу Иван Иванович.
- Мама сказала, что в ее жизни слишком много вычитания и деления и отправила к тебе.
- И умножения. Местами. – хихикнул Иван Иванович. – Что там за задача?
- Гражданин взял в банке десять тысяч и через полгода вернул шестнадцать. Под какой процент брал кредит гражданин? – прочитал Гоша.
- И что тебе тут непонятно? – укоризненно спросил Иван Иванович.
- Пап, мне надо задачу решить. – сказал Гоша. – Мне не надо вот это «У нас есть десять и шестнадцать. А еще у нас есть шесть месяцев. Что надо сначала сделать?». Мне ответ нужен. И решение.
- А самому...
- А самому мне мозгами раскинуть слабо. – перебил Гоша и умело имитировал интонации отца: - Я способный, но лень меня погубит. И вот сейчас я пришел не потому, что не умею решать, а потому что мне лень самому напрягаться. Мне легче прийти, ты решишь, я запишу решение и ответ. И поскорее сяду играть в компьютер. А знаний по математике у меня останется ноль. Я бестолковый и позорю отца.
- Хахаха. – не удержался Иван Иванович. – Я так говорю? А.. Ну да... Я так говорю. В общем, надо от шестнадцати отнять десять – получится шесть. Это интерес банка. Шесть поделить на десять и умножить на сто. Получается шестьдесят процентов.
- Значит ответ – шестьдесят? – переспросил Гоша.
- Значит ответ – девяносто процентов годовых. – выдал Иван Иванович.
- Не понял. Откуда девяносто? – удивился Гоша.
- Оттуда. Рассмотрение заявки, заключение договора залога и заключение кредитного договора составит процентов пятнадцать. Остается сорок пять на полгода. Годовых – девяносто. Так и пишут в рекламе. – пояснил Иван Иванович.
- Здорово живешь! – появилась в дверях мать Гоши, Софья Александровна. – А вдруг он на три месяца брал и ему просрочку с пеней вклеили?
- Пеню брать с физических лиц запрещено. – возразил Иван Иванович. – Не слушай ее, Гоша. Пиши – девяносто годовых.
- Да нет таких процентов сейчас! Нету! – начала горячиться Софья Александровна.
- Дай-ка, Гоша, учебник сюда. – попросил Иван Иванович. – Что и требовалось доказать! Учебник девяносто четвертого года. Тогда такие проценты были. Съела?
- Тогда и пеня и просрочка брались. – ответила Софья Александровна. – Съел?
- Тогда физическим лицам вообще не давали! – ляпнул Иван Иванович.
- Под одну пятую от залога – давали! – сказала Софья Александровна. – Грамотей. Взял десять. С ежемесячным погашением процентов и погашением кредита по концу срока. Человек не платил проценты. После первого месяца по первой сумме включается двойная ставка с пеней на сумму задолженности в размере одного процента от суммы задолженности в день. После второго – на вторую сумму. После третьего – на третью сумму процентов, на основной кредит и задолженность за первые два месяца.
- Да там было бы за сто тысяч! – взвыл Иван Иванович.
- Это если по девяносто годовых. А если под меньше – то нет. – спокойно возразила Софья Александровна. – А под сколько – тебе и надо посчитать.
- Фигня вопрос. – сказал Иван Иванович. – Гоша дай лист бумаги и ручку. За икс принимаем месячную процентную ставку. Считаем проценты – икс на сумму кредита. Считаем пеню – перемножаем задолженность на сто пятьдесят, сто двадцать и девяносто дней. Считаем просрочку в два раза. И проценты. Складываем. Все равно шести тысячам. Уравнение.... Итого... получается пятьдесят семь процентов годовых! Или четыре и семь в месяц. Ну, приблизительно.
- А давайте я лучше шестьдесят напишу, а? – тоскливо спросил Гоша. – Я ж этого всего никогда не пойму..
- Трус! – сурово ответили родители. – Вот решение. Пиши.
- Двойку же получу. – заныл Гоша.
- Пиши, тебе говорят! – сказал отец. – И ответ – в случае трехмесячного кредита с просрочкой и пеней, при отсутствии банковской комиссии за выдачу и оформление кредита...
- И отсутствия дисконтирования процентов. – добавила мама. – Тогда модно было дисконтировать. Но тогда и просрочка... А ты посчитал просрочку и пеню по основному долгу?
- Охтыж, йоо. – протянул Иван Иванович. – Забыл совсем.
- Растяпа. – ласково сказала Софья Александровна.
- А нет! Посчитал. Вот же – шестьдесят икс! Это просрочка по основному долгу. Не путай меня!
- А пеню? – ехидно спросила супруга.
- Черт! – ругнулся Иван Иванович и пересчитал все. – Не путай меня, я сказал! Не бралась пеня на основную сумму.
- Это почему это? – поинтересовалась супруга.
- Потому как пеня на десять тысяч за девяносто дней в любом случае больше шести тысяч. – победно пропел Иван Иванович.
- Так и пиши, Гошенька. – сказала мама. – При отсутствии дисконтирования процентов и взымания пени только за просроченные проценты, а не за задолженность по основной сумме – человек брал кредит приблизительно под пятьдесят семь процентов годовых. Приблизительно – из-за округлений.
- За двойку чтоб не ругались! – предупредил Гоша.
...
- Пап, а пап. – переминался Гоша с ноги на ногу на следующий день. – Тут математичка опять задачу задала....
Под домашним заданием, красной пастой было выведено:
«Отлично!!! Гоша, реши, пожалуйста следующую задачу:
Семья учителя математики получает пятьдесят тысяч рублей совокупного дохода в месяц. Какие условия кредита были бы приемлемыми для этой семьи, так чтобы ежемесячный платеж не превышал десять тысяч рублей? Какую максимальную сумму может взять эта семья на пятнадцать лет? В какой валюте лучше брать кредит и в каком банке?»
- Ну это просто, Гоша. – хмыкнул Иван Иванович. – Пусть в сбербанке берет. Миллиона три-четыре. С отсрочкой платежей на пять лет. Под тридцать процентов.
- А это правильный ответ? – засомневался Гоша.
- Неа. – радостно сказал Иван Иванович. – Но твоя математичка узнает об этом только через пять лет. А ты уже в шестом.
Цитата: Lodur от июля 2, 2015, 12:51
Как-то читал у кого-то из великих американских программистов (не помню, у кого... то ли создателя Паскаля, то ли создателя Си), что программирование отнесено к прикладной математике по ошибке. На самом деле, это область прикладной лингвистики, и из линвистов получаются намного лучшие программисты, чем из математиков. :) Мысль парадоксальна, но только на первый взгляд.
Вирт -- швейцарский программист, если чё.
Цитата: _Swetlana от июля 3, 2015, 09:40
Цитата: Ильич от июля 3, 2015, 00:00
Цитата: _Swetlana от июля 2, 2015, 23:50
Математика - язык. А математическая логика - наука о языке. Логично ;D
Помню, как С.Б. Стечкин на лекции сказал, что сплайны - это кусок хлеба. Математика кормит (если не брать преподавание) только в каких-то прикладных задачах.
Нет, совсем не логично.
А про математику, как способ прокормиться это вы в качестве реплики к моему сообщению написали?
В качестве реплики.
Что не логично?
Не вижу логики в вашей фразе. Математическая логика часть математики, а не метаматематика.
Что касается реплики, то я же писал про математику, как способ мышления. А это не то же самое, что математика.
Цитата: Flos от июля 3, 2015, 09:41
Цитата: _Swetlana от июля 3, 2015, 09:39
Ипотеку не брали, проценты не рассчитывали?
Ага, смешно.
У меня жена деньги считает, мне не доверяет.
;)
Признайтесь, ведь просто лень домашними деньгами заниматься.
Цитата: Ильич от июля 3, 2015, 11:30
Признайтесь, ведь просто лень домашними деньгами заниматься.
Признаюсь.
Цитата: Ильич от июля 3, 2015, 11:24
Цитата: _Swetlana от июля 3, 2015, 09:40
Цитата: Ильич от июля 3, 2015, 00:00
Цитата: _Swetlana от июля 2, 2015, 23:50
Математика - язык. А математическая логика - наука о языке. Логично ;D
Помню, как С.Б. Стечкин на лекции сказал, что сплайны - это кусок хлеба. Математика кормит (если не брать преподавание) только в каких-то прикладных задачах.
Нет, совсем не логично.
А про математику, как способ прокормиться это вы в качестве реплики к моему сообщению написали?
В качестве реплики.
Что не логично?
Не вижу логики в вашей фразе. Математическая логика часть математики, а не метаматематика.
Что касается реплики, то я же писал про математику, как способ мышления. А это не то же самое, что математика.
(искусственный) Язык - формальная система. Наука, которая изучает свойства формальных систем - наука о языке. Самолично читала формальные системы в курсе математической логики.
Что не так? :what:
Цитата: zwh от июля 3, 2015, 11:20Вирт -- швейцарский программист, если чё.
Не уверен, что автором был именно Вирт. Может, я ошибся, и это был не создатель упомянутых мной языков программирования, а, например, Дональд Кнут или Ларри Уолл. Очень уж давно читал, но почему-то помнится, что автором книги был именно американец. :donno:
Но если вы встречали подобную мысль именно у Вирта - возможно, я просто неправильно "определил" национальность автора. :)
Цитата: Flos от июля 3, 2015, 09:28
Цитата: Ильич от июля 2, 2015, 23:41
программирование уже нельзя назвать профессией. Эта область деятельности развилась настолько, что здесь сейчас нужны самые разные специалисты от художников до тех же математиков.
+1000
Всю трудовую жизнь занимаюсь программированием, математика как таковая потребовалась ровно один раз (нужно было шифровать данные открытым ключом).
У меня коллега - программист высокого класса, ему математика тоже не нужна. А мне нужна постоянно. Другим коллегам - иногда нужна, иногда нет. Все зависит от того, какие задачи решаешь.
Цитата: _Swetlana от июля 3, 2015, 13:25(искусственный) Язык - формальная система. Наука, которая изучает свойства формальных систем - наука о языке. Самолично читала формальные системы в курсе математической логики.
Что не так? :what:
Наверное, по-вашему всё так. Как понимались в ваших лекциях формальные системы не знаю, а то, что они были в курсе логики, скорей всего дело вкуса.
А то, что самолично читала, не убеждает. Я когда-то самолично читал курс математического моделирования производственных процессов. Студенты жаловались, что учебников не найти. А откуда было взяться учебникам, если я им рассказывал свои взляды на этот предмет, методы и их математические обоснования, которые мне представлялись полезными, а учебника я так и не написал.
Цитата: Даниэль от июля 3, 2015, 14:47
Все зависит от того, какие задачи решаешь.
Конечно.
Цитата: Flos от июля 3, 2015, 14:53
Цитата: Даниэль от июля 3, 2015, 14:47
Все зависит от того, какие задачи решаешь.
Конечно.
Не всё.
Помню случай, когда приятель предложил мне написать программу для уже не помню каких перестановок в массиве. Через час я принес ему результат. Он был крайне удивлен, потому что сам потратил на такую программу, точнее алгоритм, пару дней. Я же увидел, что те перестановки просто группа, и алгоритм получился сразу. Не спрашивайте. что именно там было - не помню.
Да что далеко ходить. Тут Даниэль увидел с какой стороны подходить к задаче Мнаше, а другой станет писать программу тупого перебора вариантов. А сам Мнаше увидел "средний" путь.
То есть, знание математики помогает порой и в тех случаях, когда без неё можно обойтись.
Цитата: Ильич от июля 3, 2015, 14:51
Цитата: _Swetlana от июля 3, 2015, 13:25(искусственный) Язык - формальная система. Наука, которая изучает свойства формальных систем - наука о языке. Самолично читала формальные системы в курсе математической логики.
Что не так? :what:
Наверное, по-вашему всё так. Как понимались в ваших лекциях формальные системы не знаю, а то, что они были в курсе логики, скорей всего дело вкуса.
А то, что самолично читала, не убеждает. Я когда-то самолично читал курс математического моделирования производственных процессов. Студенты жаловались, что учебников не найти. А откуда было взяться учебникам, если я им рассказывал свои взляды на этот предмет, методы и их математические обоснования, которые мне представлялись полезными, а учебника я так и не написал.
Математическое моделирование не читала. Но в журнале "Системный анализ" опубликовала 1(одну) статью с моей собственной моделью оперативного планирования дискретного производства. Теперь числюсь автором РАН ;D надеюсь, меня это очень украшает ::)
Что не отменяет вашего ответа на мой вопрос: к какому разделу математики у приличных людей
принято относить теорию формальных систем, теоремы Гёделя и тому подобные весчи. Вот в чём вопрос :???
Гёдель и прочая выводимость — это матлогика. Куда их можно ещё записать-то?
Цитата: Lodur от июля 3, 2015, 14:10
Цитата: zwh от июля 3, 2015, 11:20Вирт -- швейцарский программист, если чё.
Не уверен, что автором был именно Вирт. Может, я ошибся, и это был не создатель упомянутых мной языков программирования, а, например, Дональд Кнут или Ларри Уолл. Очень уж давно читал, но почему-то помнится, что автором книги был именно американец. :donno:
Но если вы встречали подобную мысль именно у Вирта - возможно, я просто неправильно "определил" национальность автора. :)
Не, просто я с детства помнил, что Вирт был каким-то европейцем (для обрамления текстовых строк используются не кавычки, а апострофы), посему засунул нос в Вики -- ба, швейцарец!
Цитата: Ильич от июля 3, 2015, 15:22
Тут Даниэль увидел с какой стороны подходить к задаче Мнаше, а другой станет писать программу тупого перебора вариантов. А сам Мнаше увидел "средний" путь.
Кстати, я Данину идею так и не понял. Буду рад, если немного конкретизирует, чтобы мне, давно забросившему математику, тоже было понятно.
Цитата: Ильич от июля 3, 2015, 15:22
Да что далеко ходить. Тут Даниэль увидел с какой стороны подходить к задаче Мнаше, а другой станет писать программу тупого перебора вариантов.
Я, кстати, ошибся: уже потом заметил, что в условиях задачи значилось также "по диагонали". А коды Грея - это когда отличается хотя бы одна из цифр на своей позиции, а не вообще все цифры.
Цитата: mnashe от июля 3, 2015, 18:24
Кстати, я Данину идею так и не понял. Буду рад, если немного конкретизирует, чтобы мне, давно забросившему математику, тоже было понятно.
Ошибся я :(
Цитата: Ыняша от июля 3, 2015, 17:13
Гёдель и прочая выводимость — это матлогика. Куда их можно ещё записать-то?
Наверное моё представление о математической логике остановилось на уровне 19-го века. Не было у меня курса математической логики. Для меня теорема Гёделя просто в основаниях математики, а то, что эти основания рассматривают как раздел матлогики. узнаю только сейчас.
Цитата: Ильич от июля 3, 2015, 21:28
Цитата: Ыняша от июля 3, 2015, 17:13
Гёдель и прочая выводимость — это матлогика. Куда их можно ещё записать-то?
Наверное моё представление о математической логике остановилось на уровне 19-го века. Не было у меня курса математической логики. Для меня теорема Гёделя просто в основаниях математики, а то, что эти основания рассматривают как раздел матлогики. узнаю только сейчас.
Резон в этом, конечно, есть. Как только мы сказали true или false, формальная система тут же превратилась в свою интерпретацию.
Цитата: zwh от июля 3, 2015, 17:50Не, просто я с детства помнил, что Вирт был каким-то европейцем (для обрамления текстовых строк используются не кавычки, а апострофы), посему засунул нос в Вики -- ба, швейцарец!
Ну, справедливости ради... Я читал его "Алгоритм и структуры данных" примерно в то же время (когда изучал в институте программирование), когда и "Искусство программирования" Кнута, и много чего ещё из классики. Но в жизни оно как-то не пригодилось... Ничего сложнее скриптов для выполнения рутинных задач по обслуживанию сети писать не приходится по работе. :-[ Вряд ли это можно считать программированием. :)
Цитата: Lodur от июля 3, 2015, 22:39Ничего сложнее скриптов для выполнения рутинных задач по обслуживанию сети писать не приходится по работе. :-[ Вряд ли это можно считать программированием. :)
Хотя, если брать в расчёт и хобби... Для создания красивых караоке-эффектов, используемых в субтитрах, приходилось действительно делать что-то типа минипрограммок на прилагаемом к программе для создания субтитров скриптовом языке. Автор программы предлагает выучить поддерживаемый ею язык программирования Lua (https://ru.wikipedia.org/wiki/Lua), и "варганить" эффекты на нём: типа, намного больше свободы; но мне лень учить целый язык ради нескольких строчек кода. ::)
Да, и ещё о терминологии.
Математическое моделирование в непрерывном случае называется математическое моделирование, соответствующий журнал называется "Математическое моделирование", институт - Институт прикладной математики им. М.В. Келдыша РАН.
Матмоделирование в дискретном случае называется системный анализ :o , соответствующий журнал называется "Информационные технологии и вычислительные системы" (в предыдущем посте малость попутала), соответствующий институт называется Институт системного анализа РАН.
Цитата: Ильич от июля 3, 2015, 15:22
Цитата: Flos от июля 3, 2015, 14:53
Цитата: Даниэль от июля 3, 2015, 14:47
Все зависит от того, какие задачи решаешь.
Конечно.
Не всё.
Помню случай, когда приятель предложил мне написать программу для уже не помню каких перестановок в массиве. Через час я принес ему результат. Он был крайне удивлен, потому что сам потратил на такую программу, точнее алгоритм, пару дней. Я же увидел, что те перестановки просто группа, и алгоритм получился сразу. Не спрашивайте. что именно там было - не помню.
Да что далеко ходить. Тут Даниэль увидел с какой стороны подходить к задаче Мнаше, а другой станет писать программу тупого перебора вариантов. А сам Мнаше увидел "средний" путь.
То есть, знание математики помогает порой и в тех случаях, когда без неё можно обойтись.
У нас в организации однажды был тренинг (модная нынче форма обучения). Разделили нас на две команды и дали задачу вроде "пятнашек" - поменяться местами с точностью до наоборот при наличии одного свободного места, с усложняющими условиями вроде "не разговаривать", "вставать в случайном порядке", "нельзя возвращаться" и т.п. Мы эту задачу начали решать "практическим" способом, стали меняться местами, ухватывать какие-то закономерности, довольно быстро ее решили и наработали четкие моторные навыки. Наши соперники сразу почему-то пошли по пути разработки фундаментального алгоритма решения задачи, перекладывали конфеты двух разных цветов, ну задачу и не решили, мы их победили. Но тут задача приобрела неожиданный оборот, нам велели объединить две команды и переставлять большее количество людей, мы попробовали по нашей старой системе действовать и у нас ничего не получилось. Ступор, смятение чувств. Одна светлая голова из бывшей "вражеской" команды сказал - "дайте пару минут", и пошел играться с конфетами. Надо сказать, что и у нас, и у них в команде по ходу пьесы сформировались свои "лидеры", по крайней мере те, которых, другие слушали, но на момент ступора их никто не слушал, когда светлая голова пошел искать решение, у всех было настроение вроде "да делай что хочешь". И меньше чем через пару минут решение было готово, он говорит что-то вроде "такой-то никогда не должен идти после кого-то то там", или еще какое-то мнемоническое правило, мы, с учетом нашей наработанной моторики, живенько это воплощаем в жизнь, и "вуаля" - задача выполнена. И светлая голова стал, по крайней мере лично для меня, "авторитетом".
К чему это все - иногда лучше дать немного спокойно подумать "математику", чем чем дружно бестолку носиться туда-сюда всему коллективу :)
Сейчас в программирование валят все подряд по единственному объединяющему признаку, что какое-то устройство программируется на какие-то действия, хотя вот есть мнение, что написание на бумажке алгоритма это тоже программирование, по крайней мере "написанием программы" это точно можно назвать. Хотя при этом программирование крупных продуктов подобно строительству - одной из самой сложных и хорошо разработанных сфер человеческой деятельности. Тут тебе и проектирование, и организация процесса, и всяческие согласования на разных этапах, и "взял кирпич-положил кирпич". Математика нужна на этапе проектирования (больше всего) и организации процесса, а также при экономическом обсчете всего этого хозяйства, и то без каких-то граней фантастики, а на уровне университетского курса. Я бы сказал, что для рационального и грамотного программирования на индивидуальном уровне нужна скорее логика, чем математика. Математика может быть "предметом" программирования, и в меньшей степени "инструментом".
Цитата: mnashe от июля 2, 2015, 10:53
Я пару часов пытался решить эту задачу в уме. Ничего не получалось.
Потом я взял двухцветные палочки и стал пытаться сложить из них. Провозился ещё полтора часа, ничего не вышло, я предположил, что задача неразрешима, но доказать этого не смог.
На следующий день я за пару часов написал программу из 70 строчек, и она мне менее чем за минуту выдала 38568 решений!
(Причём программа работает в виртуальной машине вроде явы, что заведомо снижает скорость как минимум на порядок).
$MACRO charlie from all trans;
def_int(a,i,value,used,checked_cnt,match_cnt,links_num,neighbours,buf,buf_size,buf_ofs,handle);
def_str(s,links_str);
neighbours:=succ(str_adr('|1|2|3|4|0|6|7|8|9|5|4|0|1|2|3|9|5|6|7|8|7|9|6|8|5|4|2|0|3|1'));
if_not buf:=allocate_memory(buf_size:=44000) then exit; end;
links_num:=checked_cnt:=match_cnt:=handle:=0;
build_values:
links_str:=recode(str(links_num,19,%'0',3),'012','|0|10|20');
value:=0; i:=19; used:=1;
repeat
a:=1 shl double(value:=memb[neighbours+links_str[20-i]+value]);
if used & double(a) then
a:=1;
power3:
--i;
if i then a*=3; goto power3; end;
links_num+=a;
goto next_links;
end;
used+=a;
--i;
until_not i;
++checked_cnt;
if_not pred(value)\3 then
++match_cnt;
value:=0; i:=19; s:='0';
repeat
s+=char(%'0'+(value:=memb[neighbours+links_str[20-i]+value]));
--i;
until_not i;
make_message(tstr(seconds(macro_timer))+str(links_num,11)+' '+str(match_cnt)+' of '+str(checked_cnt)+' match. |0|10'+s);
if buf_ofs>=buf_size then call flush; end;
mems[buf+buf_ofs]:=s+'|13|10'; buf_ofs+=22;
end;
inc_links:
++links_num;
next_links:
if links_num>=1162261467 then
write('Finished.',71,2,%back,%stat);
goto close_file;
end;
if_not key_pressed then goto build_values; end;
read_key;
if_not key=<Esc> then goto build_values; end;
write('Aborted.',71,2,%back,%stat);
close_file:
if handle then
call flush;
r_bx:=handle; r_ah:=$3E; intr($21);
end;
exit;
flush:
if_not handle then
r_edx:=succ(str_adr('OUTPUT.TXT|0'));
r_ds:=word1(r_edx);
r_cx:=0;
r_ah:=$3C;
intr($21);
if r_flags&1 then make_message('Cannot create output file.'); exit; end;
handle:=r_ax; buf_ofs:=0;
end;
r_dx:=buf; r_ds:=word1(buf); r_cx:=buf_ofs;
r_bx:=handle; r_ah:=$40; intr($21);
if r_flags&1 or (r_ax < buf_ofs) then
make_message('Write error.');
goto close_file;
end;
buf_ofs:=0;
ret;
END_MACRO;
mnashe!Объясните, пожалуйста, подробно как запустить Ваш код. Многое любопытно и непонятно в Ваших рассуждениях.
(http://i84.fastpic.ru/big/2016/1013/74/d498206dfd57c19908cd1b835e382774.jpeg)
У меня ничего не получается. Пытался его скомпилировать, но моему "flat assembler 1.71.54" не понравилась "строка 65": if r_flags&1 or (r_ax < buf_ofs) then
Подскажите в чём дело и как исправить?Особенно интересует, что Вы подразумеваете конкретно под виртуальной машиной Java - Java Virtual Machine (сокращённо JVM). Какая версия?
Цитата: balky_03 от октября 13, 2016, 00:36
Особенно интересует, что Вы подразумеваете конкретно под виртуальной машиной Java - Java Virtual Machine (сокращённо JVM). Какая версия?
Пропустили одно слово:
Цитата: mnashe от июля 2, 2015, 10:53
(Причём программа работает в виртуальной машине вроде явы, что заведомо снижает скорость как минимум на порядок).
«Вроде явы» — это общий принцип (команды виртуальной машины вместо команд физического CPU), но никак не сама ява.
См. тут: *Multi-Edit (http://lingvoforum.net/index.php/topic,69839.html)
Цитата: mnashe от октября 13, 2016, 08:54
«Вроде явы» — это общий принцип (команды виртуальной машины вместо команд физического CPU), но никак не сама ява.
См. тут: *Multi-Edit (http://lingvoforum.net/index.php/topic,69839.html)
mnashe!Занимаюсь программированием на разных языках всего два года, как самоучка — поэтому многое не знаю.
Новичок.
У меня установлены на ПК, помимо прочего:
1) FASM 1.71.54 for Windows. Смотрите картинку ниже.
2) DOSBox 0.74 - эмулятор DOS-окружения на современных компьютерах.
Обычно вначале компилирую файлы с расширением *.asm на FASM, затем запускаю в DOSBox 0.74.
(http://i82.fastpic.ru/big/2016/1013/8c/4ff6aca69963315f28bfb703c784f78c.jpeg)
Полагаю: речь идёт о языке Ассемблер.Просматривал Ваши ссылки на Multi-Edit по веткам форума в течение 40 минут, но ясности не прибавилось.
"Вот тут она выложена: 6 уровней диалога с Богом
И тут (немного устаревшая): Считаем до миллиона
Тут и дальше я рассказывал: Ассемблер для Z80"Напишите, пожалуйста, какие именно
дополнительные программы надо скачать и установить, чтобы лично убедиться в работоспособности Вашего кода.
Цитата: balky_03 от октября 13, 2016, 10:24
Напишите, пожалуйста, какие именно дополнительные программы надо скачать и установить, чтобы лично убедиться в работоспособности Вашего кода.
Если система поддерживает программы DOS, то ничего дополнительного не нужно, только Multi-Edit (по ссылке, которую ты уже увидел).
Если не поддерживает, то тоже ничего не нужно, поскольку у тебя есть DOSbox.
Скачиваешь архив, распаковываешь всё содержимое, запускаешь основной файл MEH.COM.
Копируешь в окошко редактора мой скрипт (если программа запускается напрямую из Windows, то Shift+F12 = paste, иначе придётся сначала сохранить его в каком-нибудь другом редакторе под любым именем с расширением .SRC и затем открыть в Multi-Edit'е), сохраняешь (под любым именем с расширением .SRC), компилируешь (Alt+C) и запускаешь (Shift+F4).
Есть куча способов запуска, и все сочетания клавиш перенастраиваемы, я просто пишу как оно там настроено сейчас и как быстрее всего запустить, чтобы по меню не лазить.
Цитата: mnashe от октября 13, 2016, 11:01
Скачиваешь архив, распаковываешь всё содержимое, запускаешь основной файл MEH.COM.
mnashe!Прошу прощения за свою бестолковость. Для меня указанная на картинке ссылка: закрыта!
The topic or board you are looking for appears to be either missing or off limits to you.
Прошу, пожалуйста, перенесите ссылку на архив Multi-Edit в эту тему: *Математика и программирование.
Вот тут она выложена: 6 уровней диалога с Богом (Reply #1on: July 4, 2014, 00:39)
"6 уровней диалога с Богом", страница 3(http://i84.fastpic.ru/big/2016/1013/2e/76beb8671fa2a4ac962391c93c289e2e.jpeg)
Цитата: balky_03 от октября 13, 2016, 11:30
The topic or board you are looking for appears to be either missing or off limits to you.
Sorry ::) Надо присоединиться к группе Религия (потом можно отписаться, тоже через свой профиль)'
Цитата: mnashe от октября 13, 2016, 11:47
Sorry ::) Надо присоединиться к группе Религия (потом можно отписаться, тоже через свой профиль)'
mnashe!Огромное спасибо за внимание и радушие!Вступил в группу "Религия". Затем скачал оба файла, буду разбираться:
1) MULTEDIT.RAR (989.02 kB - downloaded 4 times.)
2) screenshot.png (22.22 kB, 1132x617 - viewed 7 times.)
Два этапа:(http://i83.fastpic.ru/big/2016/1013/24/2a923c2ee631df7ea33c0cfd0579ca24.jpeg)
(http://i84.fastpic.ru/big/2016/1013/ef/7bf9f18513492d27f73cde7115433cef.jpeg)
Цитата: balky_03 от октября 13, 2016, 12:40
буду разбираться
mnashe!Спасибо, получилось очень легко и без заморочек. Программа практически всё сама делает, кроме MULTEDIT ничего не потребовалось. Почти напрямую в Windows.
Поразительно!! :yes:
Всего 38568 комбинаций, смотрите картинку ниже от Notepad++
Правда, у меня слабый процессор, поэтому он считал 6 мин. 34 секунды.
mnashe, последний раз уточняю для себя:
это действительно язык Ассемблер? Ниже картинки о последовательности моих действий:
Перед компиляцией(http://i83.fastpic.ru/big/2016/1013/e0/58f3fea04833f33b83c1dc2edffbc5e0.jpeg)
Общее время, затраченное на подсчёт(http://i78.fastpic.ru/big/2016/1013/48/070731e4a411adf2c5f1d8ef7f982748.jpeg)
Файл OUTPUT.TXT (829 Kb)(http://i85.fastpic.ru/big/2016/1013/6d/a30ebf8be8fdaa26c4649816d9d0276d.jpeg)
Цитата: balky_03 от октября 13, 2016, 20:45
mnashe, последний раз уточняю для себя: это действительно язык Ассемблер?
:o
Нет, конечно!
Это скриптовый язык Multi-Edit'а. Он в чём-то похож на C, в чём-то на Pascal, в чём-то ещё на что-то... на Аду, что ли... :???
Сильно упрощённый при этом, даже функций и процедур нет, только подпрограммы.
На ассемблере написано ядро Multi-Edit'а.
Вот как выглядит фрагмент ассемблерного ядра Multi-Edit'а (это раздел, отвечающий за пересчёт дат, времени и т.п.)
IDEAL
MODEL TINY
INCLUDE 'globals.inc'
SEGMENT CODE
PROC convert_seconds_to_ticks
mov EDX,001234DDh
mul EDX
shrd EAX,EDX,16
adc EAX,0
ret
ENDP
PROC convert_ticks_to_seconds
xor EDX,EDX
add EAX,6
shld EDX,EAX,16
shl EAX,16
mov ECX,001234DDh
div ECX
ret
ENDP
PROC reset_kbtime
xor AX,AX
mov [word ptr autosave_forbidden],AX
call get_system_timer
mov [last_checkey_time],AX
ret
ENDP
PROC get_system_timer
loadseg ES,0
mov EAX,[ES:046Ch]
ret
ENDP
PROC get_session_time
loadseg ES,0,CX
mov EAX,[ES:046Ch]
mov CL,[session_day_counter]
jcxz @@end
@@loop: add EAX,1573041
loop @@loop
@@end: ret
ENDP
PROC get_alarm_delay
call get_session_time
mov ECX,EAX
mov EAX,[alarm_time]
sub EAX,ECX
jnb @@
xor EAX,EAX
@@: ret
ENDP
PROC set_alarm_time
sub EAX,[last_system_time]
jnb set_alarm_delay
add eax,1573041
LABEL set_alarm_delay near
push EAX
call get_session_time
pop ECX
add EAX,ECX
mov [alarm_time],EAX
ret
ENDP
PROC time
mov AH,2Ch
int 21h
LABEL make_time_string near
pop BX
sub SP,9
mov DI,SP
loadseg ES,SS
cld
mov AL,8
stosb
mov AL,CH
call dstr2
mov AL,':'
stosb
mov AL,CL
call dstr2
mov AL,':'
stosb
mov AL,DH
call dstr2
jmp BX
ENDP
PROC tstr
sub EAX,360000
jnb tstr
add EAX,360000
split AX,DX
mov BX,60
div BX
div BL
mov DH,DL
mov CL,AH
mov CH,AL
jmp make_time_string
ENDP
PROC tsec
cld
mov BH,[ES:DI]
lea SI,[DI+1]
movzx ECX,AX
xor EDI,EDI
@@read: sub BL,1
adc BL,0
xor AH,AH
@@loop: dec BH
jl @@clr
segES
lodsb
sub AL,'0'
cmp AL,9
ja @@mul
aad
mov AH,AL
jmp @@loop
@@clr: xor BH,BH
@@mul: movzx EAX,AH
imul EDI,ECX
add EDI,EAX
or BX,BX
jnz @@read
mov EAX,EDI
ret
ENDP
PROC gdstr
mov CX,AX
cld
mov AL,10
stosb
mov AL,CL
call dstr2
mov AL,'/'
stosb
mov AL,CH
call dstr2
mov AL,'/'
stosb
shr EAX,16
@@year: sub AX,10000
jnb @@year
add AX,10000
mov DL,100
div DL
mov DL,AH
call dstr2
mov AL,DL
dstr2: aam
xchg AH,AL
or AX,'00'
stosw
ret
ENDP
PROC hdstr
LOCAL month:byte:1,day:byte:1,dest_ptr:dword
InitStack
push AX
push ES DI
shr EAX,16 ;year
call gstr
mov AL,' '
call st_lappend_char ;add char before
movzx BX,[month] ;month
shl BX,2
c_6D1C: dec BX
mov AL,[CS:BX+hebrew_months+1]
cmp AL,' '
jz c_6D1C
call st_lappend_char
test BL,3
jnz c_6D1C
movzx AX,[day] ;day
call gstr
call st_space_ladd_str
les DI,[dest_ptr]
push ES
mov CL,0Fh
call str_pop_sr
RestStack
ret
ENDP
PROC gdrec
LOCAL year,month,day
InitStack
movzx BX,[ES:DI]
lea SI,[DI+1]
mov AX,[word ptr greg_day]
xor DX,DX
xchg DL,AH
push [greg_year] DX AX
cld
xor DI,DI
@@read: xor DX,DX
xor CX,CX
@@loop: dec BX
js @@next
segES
lodsb
sub AL,'0'
jb @@next
cmp AL,9
ja @@next
xor AH,AH
MakeOfs DX,AX,DX,10
inc CX
jmp @@loop
@@next: jcxz @@inci
mov [day+DI],DX
@@inci: add DI,2
cmp DI,6
jb @@read
mov EAX,[dword ptr month]
mov AH,AL
mov AL,[byte ptr day]
@@end: RestStack
ret
ENDP
PROC hdrec
LOCAL month:byte:1,day:byte:1,mchar:byte:4
InitStack
movzx CX,[ES:DI]
lea SI,[DI+1]
cld
mov AL,[heb_day]
call @@readgemat
push AX
mov AX,' '
push AX AX
xor DI,DI
jcxz @@rmcmp
@@rmon: segES
lodsb
cmp AL,'.'
jz @@rmset
cmp AL,':'
jz @@rmset
cmp AL,'א'
jb @@rmchk
cmp AL,'ת'
ja @@rmchk
@@rmset:cmp DI,4
jnb @@rmnxt
mov [mchar+DI],AL
@@rmnxt:inc DI
loop @@rmon
inc CX
@@rmchk:dec CX
@@rmcmp:mov AL,[heb_month]
mov AH,15
mov DI,offset(hebrew_months+57)
mov EDX,[dword ptr mchar]
@@scmon:dec AH
jz @@setm
sub DI,4
cmp EDX,[CS:DI]
jne @@scmon
mov AL,AH
@@setm: mov [month],AL
mov AX,[heb_year]
call @@readgemat
cmp AX,1000
jnb @@res
add AX,5000
@@res: shl EAX,16
mov AX,[word ptr day]
RestStack
ret
PROC @@readgemat
jcxz @@end
mov DI,AX
xor DX,DX
mov BX,offset(hfigvals)-11
@@loop: segES
lodsb
xor AH,AH
cmp AL,"'"
jz @@nextf
cmp AL,'"'
jz @@nextf
sub AL,'א'-1
jbe @@setn
cmp AL,10
jbe @@addf
cmp AL,27
ja @@setn
segCS
xlat
shl AX,1
@@addf: add DX,AX
@@nextf:loop @@loop
inc CX
@@setn: dec CX
mov AX,DI
or DX,DX
jz @@end
mov AX,DX
@@end: ret
ENDP
ENDP
PROC read_date
mov AH,2Ah
int 21h
mov [weekday],AL
regptr EAX,DX,CX
mov [dword ptr greg_day],EAX
loadadr DS,date
call gdstr
mov EAX,[dword ptr greg_day]
call day_on_gdate
call hdate_on_day
mov [dword ptr heb_day],EAX
loadadr DS,hdate
jmp hdstr
ENDP
PROC year_first_day
dec AX
cmp AX,7000
jbe @@div1
xor AX,AX
@@div1: xor DX,DX
mov CX,19
div CX
push DX ;מספר שנה בתוך מחזור
mov BX,AX
mov AX,309
mul DX
add AX,3
mov CL,25
div CL
xor AH,AH
xchg BX,AX ;((yearcount\19)*309+3)/25+
mov DX,235 ; (yearcount/19)*235=
mul DX ; מספר חדשים שעברו בין מולד תשרי
add AX,BX ;בשנת תהו למולד תשרי בשנה הנשאלת
adc DX,0
combine AX,DX
imul ESI,EAX,29 ;מספר ימים שלמים בחדש
mov EDX,13753 ;מספר חלקים מעל 92 יום בחדש
mul EDX
add EAX,5604 ;זמן המולד בשנת התהו
mov ECX,25920 ;מספר חלקים ביום
div ECX ;מספר ימים שלמים נקבצים מהחלקים
add EAX,ESI
inc EAX
mov DI,DX ;מספר חלקים עודפים על ימים שלמים
pop CX ;מספר שנה בתוך מחזור
push EAX ;עכשו חישוב דחיות
mov EBX,7
xor EDX,EDX
div EBX ;יום בשבוע
cmp DI,19440
mov BL,1
jnb @@cweek ;מולד זקן
cmp DL,1 ;'יום ב
jne @@thurs
cmp DI,16789
mov BL,0
jb @@cweek
mov EBX,24949h ;10 0100 1001 0100 1001 – שנים שלאחר מעוברות
jmp @@c19
@@thurs:cmp DL,2 ;'יום ג
mov BL,0
jne @@cweek
cmp DI,9924
jb @@cweek
mov EBX,2DB5Bh ;10 1101 1011 0101 1011 – שנים פשוטות
@@c19: shr EBX,CL
@@cweek:and EBX,1
mov CL,DL
add CL,BL
mov CH,10101001b
shr CH,CL
shr CH,1
pop EAX
adc EAX,EBX
ret
ENDP
PROC day_on_gdate
split AX,DI
movzx EBX,AX
xor CX,CX
xchg CL,BH ;month
sub CL,2 ;month
ja set_y
add CL,12 ;month
dec DI ;year
set_y: rol DI,1 ;CF:=sign
ror DI,1
adc DI,3760 ;year
mov AL,30
mul CL ;month
add BX,AX
mov AX,CX ;month
shl AX,1
add AX,CX
dec AX
mov CL,5
div CL ;(month*3-1)/5
xor AH,AH
add BX,AX
mov AX,DI
shr AX,2
add BX,AX
lea AX,[DI+240]
xor DX,DX
mov CX,100
div CX
sub BX,AX
shr AX,2
add BX,AX
mov AX,365
mul DI
combine AX,DX
add EAX,EBX
sub EAX,218
ret
ENDP
PROC gdate_on_day
add EAX,87847
mov ECX,146097
xor EDX,EDX
div ECX
shl AX,2
mov CX,AX
mov AX,DX
shr EDX,16
mov BX,36524;=100 years
cmp DX,BX
jnb @@end
div BX
cmp AL,4 ;29.02.1600 must be 300+100 instead of 400+0
je c_6B9F
mov BX,DX
inc AX
c_6B9F: dec AX
add AX,CX ;century
mov DX,100
mul DX
sub AX,4000
xchg BX,AX ;days from century beg.
xor DX,DX
mov CX,1461 ;=4 years
div CX ;div CX
shl AX,2
add BX,AX ;years
mov AX,DX ;days from 4-year beg.
xor DX,DX
mov CX,365
div CX ;div CX
cmp AL,4 ;29.02 must be 3+1 instead of 4+0
je c_6BC8
mov CX,DX
inc AX
c_6BC8: dec AX
add BX,AX ;years
mov DI,11010110101b ;JanDecNovOctSepAugJulJunMayAprMar
xor DX,DX
c_6BD0: inc DX ;month
xor AX,AX
shr DI,1 ;month_lenth:=bit+30
adc AL,30
sub CX,AX
jnb c_6BD0
add AX,CX
inc AX
mov AH,DL
sub AH,10 ;month
ja c_6BEB
add AH,12 ;month
dec BX ;year
c_6BEB: rol BX,1
ror BX,1
sbb BX,-1
combine AX,BX
@@end: ret
ENDP
PROC day_on_hdate
LOCAL monlen:byte:10
cmp AH,13 ;.אדר
jb @@beg
mov AH,6 ; אדר
je @@beg
add AL,30 ;:אדר
@@beg: push EAX
shr EAX,16 ;year
call year_first_day
pop BX CX
dec BH
jz @@addd
add BL,30
dec BH
jz @@addd
push BX EAX
mov AX,CX
inc AX
call year_first_day
mov CX,AX
pop EAX BX
sub CX,AX
InitStack
movlh SI,29,30
push SI SI SI SI
cmp CX,355
jbe @@idyr
mov [monlen+4],59 ;אדר
sub CX,30
@@idyr: cmp CX,354
je @@m2m3
movlh SI,29,29
jb @@m2m3
movlh SI,30,30
@@m2m3: push SI
xor DI,DI
xor CX,CX
xchg CL,BH ;month
@@addm: add BL,[monlen+DI]
adc BH,0
inc DI
loop @@addm
RestStack
@@addd: dec BX
movzx EBX,BX
add EAX,EBX
@@end: ret
ENDP
PROC hdate_on_day
LOCAL year,rosday,monlen:byte:12
InitStack 4
movlh BX,30,29
REPT 6
push BX
ENDM
push AX
push EAX
add EAX,548 ;1.5 years
shl EAX,7
split AX,DX
mov CX,46751
div CX ;div CX
mov [year],AX
call year_first_day
mov [rosday],AX
pop ECX
sub ECX,EAX
jb @@prev
mov AX,[year]
inc AX
call year_first_day
jmp @@days
@@prev: mov AX,[year]
dec AX
mov [year],AX
call year_first_day
xchg AX,[rosday]
@@days: sub AX,[rosday]
cmp AX,355
jbe @@mlen
mov [monlen+5],59 ;אדר
sub AX,30
@@mlen: cmp AX,354
movlh BX,29,29
jb @@slen
mov BH,30
je @@slen
mov BL,30
@@slen: mov [word ptr monlen+1],BX
mov AX,[year]
shl EAX,16
pop AX ;curday
sub AX,[rosday]
xor DI,DI
xor BH,BH
@@loop: mov BL,[monlen+DI]
inc DI
sub AX,BX
jge @@loop
add AX,BX
inc AX
mov BX,DI
mov AH,BL
cmp AH,6
jne @@end
cmp [monlen+5],59 ;אדר
jne @@end
mov AH,13
cmp AL,30
jbe @@end
mov AH,14
sub AL,30
@@end: RestStack
ret
ENDP
even
ENDS CODE
END
А вот сердце виртуальной машины:
Цитата: balky_03 от октября 13, 2016, 20:45Всего 38568 комбинаций, смотрите картинку ниже от Notepad++
Правда, у меня слабый процессор, поэтому он считал 6 мин. 34 секунды.
А Вы уверены, что это из-за процессора?
Мне кажется, это из-за создания файла OUTPUT.TXT, в который записывается каждый результат.
Если открыть консоль браузера и пустить какой-нибудь цикл с выводом в консоль, витков эдак на 100k... Тоже исполнения долго ждать придётся.
Попробуйте вместо файла вывода сделать в скрипте простую переменную-счётчик результатов.
Цитата: Bhudh от октября 13, 2016, 23:02
А Вы уверены, что это из-за процессора?
Мне кажется, это из-за создания файла OUTPUT.TXT, в который записывается каждый результат.
Нет. Windows кэширует вывод, так что он существенной роли не играет. У меня, во всяком случае.
Без вывода была примерно та же скорость.
Это ещё от размера кэша зависит.
Сорок тыщ чисел не баран чихнул.
Я, кстати, вывод в консоль всегда стараюсь кэшировать, в строковой переменной или в массиве. :)
Bhudh, кэширование же есть в программе.
Посмотри, я выделил всю работу с файлом:
$MACRO charlie from all trans;
def_int(a,i,value,used,checked_cnt,match_cnt,links_num,neighbours,buf,buf_size,buf_ofs,handle);
def_str(s,links_str);
neighbours:=succ(str_adr('|1|2|3|4|0|6|7|8|9|5|4|0|1|2|3|9|5|6|7|8|7|9|6|8|5|4|2|0|3|1'));
if_not buf:=allocate_memory(buf_size:=44000) then exit; end;
links_num:=checked_cnt:=match_cnt:=handle:=0;
build_values:
links_str:=recode(str(links_num,19,%'0',3),'012','|0|10|20');
value:=0; i:=19; used:=1;
repeat
a:=1 shl double(value:=memb[neighbours+links_str[20-i]+value]);
if used & double(a) then
a:=1;
power3:
--i;
if i then a*=3; goto power3; end;
links_num+=a;
goto next_links;
end;
used+=a;
--i;
until_not i;
++checked_cnt;
if_not pred(value)\3 then
++match_cnt;
value:=0; i:=19; s:='0';
repeat
s+=char(%'0'+(value:=memb[neighbours+links_str[20-i]+value]));
--i;
until_not i;
make_message(tstr(seconds(macro_timer))+str(links_num,11)+' '+str(match_cnt)+' of '+str(checked_cnt)+' match. |0|10'+s);
if buf_ofs>=buf_size then call flush; end;
mems[buf+buf_ofs]:=s+'|13|10'; buf_ofs+=22;
end;
inc_links:
++links_num;
next_links:
if links_num>=1162261467 then
write('Finished.',71,2,%back,%stat);
goto close_file;
end;
if_not key_pressed then goto build_values; end;
read_key;
if_not key=<Esc> then goto build_values; end;
write('Aborted.',71,2,%back,%stat);
close_file:
if handle then
call flush;
r_bx:=handle; r_ah:=$3E; intr($21);
end;
exit;
flush:
if_not handle then
r_edx:=succ(str_adr('OUTPUT.TXT|0'));
r_ds:=word1(r_edx);
r_cx:=0;
r_ah:=$3C;
intr($21);
if r_flags&1 then make_message('Cannot create output file.'); exit; end;
handle:=r_ax; buf_ofs:=0;
end;
r_dx:=buf; r_ds:=word1(buf); r_cx:=buf_ofs;
r_bx:=handle; r_ah:=$40; intr($21);
if r_flags&1 or (r_ax < buf_ofs) then
make_message('Write error.');
goto close_file;
end;
buf_ofs:=0;
ret;
END_MACRO;
Посыпаю главу пеплом, скрипт не смотрел (на телефоне проблематично).
Тогда интересно, что же там за процессор.
Покажу ещё один ассемблер. Для 8-битных микроконтроллеров фирмы Microchip.
Это программа, по которой работает мой палаточный фонарик на микроконтроллере PIC12F683 стоимостью меньше полудоллара:
; ┌───v───┐
;4V───┤Vdd Gnd├───0V
;btn1>┤GP5 GP0├>ledBY
;boos<┤GP4 GP1├>ledGR
;btn0>┤GP3 GP2├>PWM
; └───────┘
; PIC12F683
;
list p=12F683
radix dec
include "p12f683.inc"
errorlevel -302 ; Don't complain about BANK 1 Registers
__CONFIG _FCMEN_ON & _BOREN_OFF & _IESO_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
pinBY equ 0
pinGR equ 1
pinPWM equ 2
pinBoost equ 4
pinBtn0 equ 3
pinBtn1 equ 5
mode equ 0x20
brightness equ 0x21
mode_brightness equ 0x22
mode_timer equ 0x23
switchtimeL equ 0x24
switchtimeH equ 0x25
buttons_state equ 0x26
last_buttons_state equ 0x27
start_debounce_state equ 0x28
start_debounce_time equ 0x29
key_event_timeL equ 0x2A
key_event_timeH equ 0x2B
last_key_repeat_time equ 0x2C
last_blink_state equ 0x2D
settings_timeout equ 0x2E
keys equ 0x30
key_stat equ 0x31
btn_pr equ 0
btn_step equ 1
btns_long equ 2
btn1_first equ 3
btns_pr equ 4
before_repeating equ 0
now_repeating equ 1
after_repeating equ 2
AL equ 0x34
AH equ 0x35
BL equ 0x36
BH equ 0x37
time0 equ 0x70
time1 equ 0x71
time2 equ 0x72
;****************************************************************
;Beginning of program
;****************************************************************
org 0
goto SetUp
org 4
btfsc INTCON,T0IF
goto t0int
retfie
t0int bcf INTCON,T0IF
incfsz time0,f ;counts 4.096 ms periods (244 Hz)
retfie
incfsz time1,f ;counts seconds
retfie
incfsz time2,f ;counts 4:28 min periods
retfie
retfie
exptime movf mode_timer,w
andlw 7
addwf PCL,f
dt 23,31,41,54,72,97,129,172
set_timer
clrf time0
clrf time1
clrf time2
clrf switchtimeL
clrf switchtimeH
add_timer
clrf AH
movf mode_timer,w
call exptime
btfsc mode_timer,3
goto mul5d2
addlw 3
movwf AL
rrf AL,f
clrc
rrf AL,f
goto mul60
mul5d2 movwf AL
clrc
rlf AL,f
rlf AH,f
addlw 1
movwf BL
rrf BL,w
addwf AL,f
skpnc
incf AH,f
mul60 movf mode,f
bnz addtime
swapf AH,w ;AH<=1, so swap is *16
movwf BH
swapf AL,w
andlw 0x0F ;high nibble becomes low nibble of *16H
iorwf BH
swapf AL,w
andlw 0xF0 ;low nibble becomes high nibble of *16L
movwf BL
movf AL,w
subwf BL,w
movwf AL
skpc
incf AH
movf AH,w
subwf BH,w
movwf AH
clrc
rlf AL,f
rlf AH,f
rlf AL,f
rlf AH,f
addtime movf AL,w
addwf switchtimeL,f
skpnc
incf AH,f
movf AH,w
addwf switchtimeH,f
return
initPWM clrf WDTCON ;disable WDT
clrf T2CON ;turn off Timer2; no prescaler, no postscaler: 977Hz PWM
clrf PIR1
clrf TMR2
clrf CCPR1L
bcf GPIO,pinPWM ;turn off the LED
movlw 0x0C ;turn on PWM
movwf CCP1CON
banksel PR2
movlw 0x3F ;8 bit PWM
movwf PR2
banksel T2CON
bsf T2CON,TMR2ON
return
increase_brightness
swapf brightness,w
movwf AL
rrf AL,w
andlw 7
addlw 1
addwf brightness,w
skpnc
movlw 0xFF
goto set_brightness
decrease_brightness
swapf brightness,w
movwf AL
rrf AL,w
andlw 7
addlw 1
subwf brightness,w
skpc
clrw
set_brightness
movwf brightness
movf brightness,w
bz turnoff
incf brightness,w
bz turnon
usepwm btfss CCP1CON,CCP1M3
call initPWM
rrf brightness,w
movwf AL
rrf AL,w
andlw 0x3F
movwf CCPR1L
swapf brightness,w
andlw 0x30
iorlw 0x0C
movwf CCP1CON
return
turnoff clrf T2CON ;turn off Timer2
clrf CCP1CON ;turn off CCP
bcf GPIO,pinPWM
return
turnon clrf T2CON ;turn off Timer2
clrf CCP1CON ;turn off CCP
bsf GPIO,pinPWM
return
;8 111 B x1 11
;7 110 GB 11 11
;6 101 G 1x 10
;5 100 GY 10 10
;4 011 Y x0 00
;3 010 YR 00 00
;2 001 R 0x 01
;1 000 RB 01 01
;0 --- -- xx --
display_mode
movlw 6
btfsc mode,0
movlw 4
btfsc mode,1
movlw 8
display_digit
addlw -1
bc swtris
bsf STATUS,RP0 ;Bank 1
bsf TRISIO,pinBY
bsf TRISIO,pinGR
bcf STATUS,RP0 ;Bank 0
return
swtris movwf AL
movlw 0 ;0,2,4,6: TRISIO=00
btfss AL,0
goto settris
movlw 1<<pinBY ;1,5: TRISIO=01
btfsc AL,1
movlw 1<<pinGR ;3,7: TRISIO=10
settris bsf STATUS,RP0 ;Bank 1
bcf TRISIO,pinBY
bcf TRISIO,pinGR
iorwf TRISIO,f
bcf STATUS,RP0 ;Bank 0
rrf AL,w
btfss AL,2
xorlw 1
andlw 3
bcf GPIO,pinBY
bcf GPIO,pinGR
iorwf GPIO,f
return
read_mode_settings
movlw mode_brightness
movwf FSR
clrc
rlf mode,w
bsf STATUS,RP0 ;Bank 1
movwf EEADR
EEread bsf EECON1,0 ;starts EEPROM read operation – result in EEDAT
movf EEDAT,w
movwf INDF
incf FSR,f
incf EEADR,f
bsf EECON1,0 ;starts EEPROM read operation – result in EEDAT
movf EEDAT,w
movwf INDF
bcf STATUS,RP0 ;Bank 0
goto display_mode
write_mode_settings
movlw mode_brightness
movwf FSR
clrc
rlf mode,w
bsf STATUS,RP0 ;Bank 1
movwf EEADR
EEwrite movf INDF,w
movwf EEDAT
bsf EECON1,WREN ;enable write
movlw 55h ;unlock codes
movwf EECON2
movlw 0AAH
movwf EECON2
bsf EECON1,WR ;write begins
bcf STATUS,RP0 ;select bank0
btfss PIR1,EEIF ;wait for write to complete
goto $-1
bcf PIR1,EEIF
bsf STATUS,RP0 ;select bank1
incf FSR,f
incf EEADR,f
btfsc EEADR,0
goto EEwrite
bcf EECON1,WREN ;disable other writes
bcf STATUS,RP0 ;select bank0
return
delay4m addwf time0,w
movwf AL
waitz movf time0,w
xorwf AL,w
bnz waitz
return
readkey clrf keys
clrf buttons_state
btfsc GPIO,pinBtn0
bsf buttons_state,0
btfsc GPIO,pinBtn1
bsf buttons_state,1
movf buttons_state,w
xorwf start_debounce_state,w
bnz restart_debounce
movf start_debounce_time,w
subwf time0,w
addlw -10 ;debounce delay = 41 ms
skpc
return ;too litle time in new state
movf buttons_state,w
xorwf last_buttons_state,w
bnz btnchg
;if no physical event, then check for virtual
btfsc key_stat,before_repeating
goto check_first_repeat
btfsc key_stat,now_repeating
goto check_next_repeat
return ;neither physical nor virtual
check_first_repeat
movf key_event_timeL,w
subwf time0,w
addlw -195 ;0.8s
skpc
return
bcf key_stat,before_repeating
bsf key_stat,now_repeating
goto save_repeat_time
check_next_repeat
movf last_key_repeat_time,w
subwf time0,w
addlw -24 ;98ms
skpc
return
save_repeat_time
movf time0,w
movwf last_key_repeat_time
btfsc key_stat,btn1_first
bsf keys,btn1_first
bsf keys,btn_step
return
btnchg movf buttons_state,w
bz to00 ;isn't new state "none pressed"?
xorlw 3
bz to11 ;isn't new state "both pressed"?
;neither of them – new state is "only one pressed"
movf last_buttons_state,w
bz from00 ;wasn't previous state "none pressed"?
;no – it was "both pressed"
from11 btfss key_stat,after_repeating
goto endbtn
;if autorepeat still hasn't started;
;then ignore the 1st release
;and wait for complete release to report "shift-press ended"
;else report shift-press on every release as usual autorepeat
bsf keys,btn_step
comf key_stat,w
andlw 1<<btn1_first
iorwf keys,f
goto endbtn
;sequence start:
;transition from "none pressed" to "one pressed"
;just save the initial information
from00 clrf key_stat
btfsc buttons_state,1
bsf key_stat,btn1_first
bsf key_stat,before_repeating
bcf INTCON,GIE
movf time1,w
movwf key_event_timeH
movf time0,w
movwf key_event_timeL
bsf INTCON,GIE
endbtn movf buttons_state,w
movwf last_buttons_state
return
to00 btfsc key_stat,btns_pr
goto endbl
btfsc key_stat,now_repeating
goto endseq
btfsc key_stat,after_repeating
goto endseq
;neither shift-press nor repeating
;so report normal "single button press & release"
bsf keys,btn_pr
goto retkey
;shift-press sequence end (both released)
endbl bcf INTCON,GIE
movf key_event_timeL,w
subwf time0,w
skpc
incf key_event_timeH,f
movf key_event_timeH,w
subwf time1,w
bsf INTCON,GIE
skpz
bsf keys,btns_long ;long shift-press (>1 second)
bsf keys,btns_pr ;report "shift-press ended"
retkey btfsc key_stat,btn1_first
bsf keys,btn1_first
endseq clrf key_stat
goto endbtn
;shift-press
to11 btfss key_stat,now_repeating
goto double
;if the second button was pressed late (autorepeat already on)
;then end autorepeat and make sequential shift-presses work on release
bcf key_stat,now_repeating
bsf key_stat,after_repeating
goto endbtn
;else mark that both are pressed and wait until both released
double bcf key_stat,before_repeating
bsf key_stat,btns_pr
goto endbtn
restart_debounce
xorwf start_debounce_state,f
movf time0,w
movwf start_debounce_time
return
SetUp clrf time0
clrf time1
clrf time2
clrf last_buttons_state
clrf start_debounce_state
clrf mode ; 0 for m2, 1 for m1, 2 for m3
incf mode,f
clrf settings
movlw 0x07
movwf CMCON0 ;turn off Comparator
clrf INTCON
bsf STATUS,RP0 ;Bank 1
clrf ANSEL ;no analog inputs
movlw 0x67 ;4MHz HFINTOSC
movwf OSCCON
movlw b'00101011' ;CCP1=GP2->output; GP4->output; all other inputs
movwf TRISIO
movlw (1<<pinBtn0)|(1<<pinBtn1) ;enable interrupt by buttons change
movwf IOC
movlw b'11000011' ;pull-ups disabled; TMR0<-CLKOUT; TMR0:16
movwf OPTION_REG
bcf STATUS,RP0 ;Bank 0
bsf INTCON,T0IE
bsf INTCON,GIE
bcf GPIO,pinBoost
init_cur_mode
call read_mode_settings
clrf brightness
softst call increase_brightness
movlw 5
call delay4m
movf mode_brightness,w
subwf brightness,w
bnc softst ;brightness<mode_brightness
bz setimer
setmode movf mode_brightness,w
call set_brightness
setimer call set_timer
main_loop
call readkey
movf keys,f
bnz pkeys
check_timer
bcf INTCON,GIE
movf time2,w
movwf AH
movf time1,w
movwf AL
bsf INTCON,GIE
movf switchtimeH,w
subwf AH,w ;time-switchtime
bnc main_loop ;<0 => not reached
bnz switch_mode ;>0 => reached
movf switchtimeL,w
subwf AL,w
bnc main_loop
goto switch_mode
pkeys btfsc keys,btns_long
goto settings
btfsc keys,btns_pr
goto switch_to_boost
btfsc keys,btn_pr
goto buttons_norm
btfsc keys,btn_step
goto buttons_step
goto main_loop
buttons_norm
btfsc keys,btn1_first
goto pbtn1
pbtn0 movf mode,f
bnz cb0m1
incf mode,f ;switch from m2 to m1
goto reinit_mode
cb0m1 btfss mode,0
goto switch_mode ;switch from m3 to m2
call add_timer ;increase time in m1
movlw 5
call display_digit
goto main_loop
pbtn1 btfss mode,0
goto switch_mode ;turn off from m2 or switch to m2 from m3
goto reinit_main_mode;from m1
buttons_step
btfsc keys,btn1_first
goto sbtn1
call decrease_brightness
goto main_loop
sbtn1 call increase_brightness
goto main_loop
settings
btfsc keys,btn1_first
goto set_timer_start
set_brightness_start
call display_mode
movf mode_brightness,w
call set_brightness
movf time1,w
addlw 60
movwf settings_timeout
set_brightness_loop
movf time1,w
xorwf settings_timeout,w
bz save_settings
call readkey
movf keys,f
bz set_brightness_loop
set_brightness_keys
btfsc keys,btns_pr
goto save_settings
btfsc keys,btn1_first
goto incbrtn
call decrease_brightness
goto updbrtn
incbrtn call increase_brightness
updbrtn movf brightness,w
movwf mode_brightness
goto set_brightness_loop
set_timer_start
movlw 6
call set_brightness
movlw 32 ;animate digit from 1 to 8
movwf AH
animate decf AH,w
andlw 7
addlw 1
call display_digit
movlw 12
call delay4m
decfsz AH,f
goto animate
movf time1,w
addlw 60
movwf settings_timeout
clrf last_blink_state
set_timer_loop
btfss mode_timer,3
goto blinkon
rlf time0,w
addlw 51
movlw 0
skpnc ;0 for first 2/3 of each second
movlw 1 ;1 for last 1/3
xorwf last_blink_state,w
bz set_timer_timeout
xorwf last_blink_state,f
movlw 0
skpnz ;display 0 for last 1/3
blinkon incf mode_timer,w ;display current mode for first 2/3
call display_digit
set_timer_timeout
movf time1,w
xorwf settings_timeout,w
bz save_settings
call readkey
movf keys,f
bz set_timer_loop
set_timer_keys
btfsc keys,btns_pr
goto save_settings
decf mode_timer,w
btfsc keys,btn1_first
addlw 2
andlw 0x0F
movwf mode_timer
goto set_timer_loop
save_settings
call write_mode_settings
goto init_cur_mode
switch_to_boost
movlw 0
call set_brightness
bsf GPIO,pinBoost
movlw 2
movwf mode
call read_mode_settings
goto setmode
switch_mode
btfss mode,1
goto prepair_to_sleep
movlw 0
call set_brightness
bcf GPIO,pinBoost
reinit_main_mode
clrf mode
reinit_mode
call read_mode_settings
goto setmode
prepair_to_sleep
call decrease_brightness
movlw 5
call delay4m
movf brightness,f
bnz prepair_to_sleep
movlw 0
call display_digit
bcf INTCON,GIE
bcf GPIO,pinPWM
bcf INTCON,GPIF
bsf INTCON,GPIE
sleep
clrf mode
btfsc GPIO,pinBtn0
incf mode,f
bcf INTCON,GPIE
bcf INTCON,GPIF
bsf INTCON,GIE
wait_key_released
movlw 2
call delay4m
btfsc GPIO,pinBtn0
goto wait_key_released
btfsc GPIO,pinBtn1
goto wait_key_released
goto init_cur_mode
org 0x2100
de 80,8,40,8,160,5
END
Цитата: Bhudh от октября 13, 2016, 23:19
Это ещё от размера кэша зависит.
Сорок тыщ чисел не баран чихнул.
Это же где-то полмегабайта всего. Чтобы 6 минут писать полмегабайта на диск...
Цитата: balky_03Файл OUTPUT.TXT (829 Kb)
Согласен, немного. Но каждое из чисел как-то там сложно вычисляется?
И шёл ли вывод только в файл?
Цитата: mnashe от октября 14, 2016, 00:25
Покажу ещё один ассемблер. Для 8-битных микроконтроллеров фирмы Microchip.
Это программа, по которой работает мой палаточный фонарик на микроконтроллере PIC12F683 стоимостью меньше полудоллара:
; ┌───v───┐
;4V───┤Vdd Gnd├───0V
;btn1>┤GP5 GP0├>ledBY
;boos<┤GP4 GP1├>ledGR
;btn0>┤GP3 GP2├>PWM
; └───────┘
; PIC12F683
;
list p=12F683
radix dec
include "p12f683.inc"
errorlevel -302 ; Don't complain about BANK 1 Registers
__CONFIG _FCMEN_ON & _BOREN_OFF & _IESO_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
pinBY equ 0
pinGR equ 1
pinPWM equ 2
pinBoost equ 4
pinBtn0 equ 3
pinBtn1 equ 5
mode equ 0x20
brightness equ 0x21
mode_brightness equ 0x22
mode_timer equ 0x23
switchtimeL equ 0x24
switchtimeH equ 0x25
buttons_state equ 0x26
last_buttons_state equ 0x27
start_debounce_state equ 0x28
start_debounce_time equ 0x29
key_event_timeL equ 0x2A
key_event_timeH equ 0x2B
last_key_repeat_time equ 0x2C
last_blink_state equ 0x2D
settings_timeout equ 0x2E
keys equ 0x30
key_stat equ 0x31
btn_pr equ 0
btn_step equ 1
btns_long equ 2
btn1_first equ 3
btns_pr equ 4
before_repeating equ 0
now_repeating equ 1
after_repeating equ 2
AL equ 0x34
AH equ 0x35
BL equ 0x36
BH equ 0x37
time0 equ 0x70
time1 equ 0x71
time2 equ 0x72
;****************************************************************
;Beginning of program
;****************************************************************
org 0
goto SetUp
org 4
btfsc INTCON,T0IF
goto t0int
retfie
t0int bcf INTCON,T0IF
incfsz time0,f ;counts 4.096 ms periods (244 Hz)
retfie
incfsz time1,f ;counts seconds
retfie
incfsz time2,f ;counts 4:28 min periods
retfie
retfie
exptime movf mode_timer,w
andlw 7
addwf PCL,f
dt 23,31,41,54,72,97,129,172
set_timer
clrf time0
clrf time1
clrf time2
clrf switchtimeL
clrf switchtimeH
add_timer
clrf AH
movf mode_timer,w
call exptime
btfsc mode_timer,3
goto mul5d2
addlw 3
movwf AL
rrf AL,f
clrc
rrf AL,f
goto mul60
mul5d2 movwf AL
clrc
rlf AL,f
rlf AH,f
addlw 1
movwf BL
rrf BL,w
addwf AL,f
skpnc
incf AH,f
mul60 movf mode,f
bnz addtime
swapf AH,w ;AH<=1, so swap is *16
movwf BH
swapf AL,w
andlw 0x0F ;high nibble becomes low nibble of *16H
iorwf BH
swapf AL,w
andlw 0xF0 ;low nibble becomes high nibble of *16L
movwf BL
movf AL,w
subwf BL,w
movwf AL
skpc
incf AH
movf AH,w
subwf BH,w
movwf AH
clrc
rlf AL,f
rlf AH,f
rlf AL,f
rlf AH,f
addtime movf AL,w
addwf switchtimeL,f
skpnc
incf AH,f
movf AH,w
addwf switchtimeH,f
return
initPWM clrf WDTCON ;disable WDT
clrf T2CON ;turn off Timer2; no prescaler, no postscaler: 977Hz PWM
clrf PIR1
clrf TMR2
clrf CCPR1L
bcf GPIO,pinPWM ;turn off the LED
movlw 0x0C ;turn on PWM
movwf CCP1CON
banksel PR2
movlw 0x3F ;8 bit PWM
movwf PR2
banksel T2CON
bsf T2CON,TMR2ON
return
increase_brightness
swapf brightness,w
movwf AL
rrf AL,w
andlw 7
addlw 1
addwf brightness,w
skpnc
movlw 0xFF
goto set_brightness
decrease_brightness
swapf brightness,w
movwf AL
rrf AL,w
andlw 7
addlw 1
subwf brightness,w
skpc
clrw
set_brightness
movwf brightness
movf brightness,w
bz turnoff
incf brightness,w
bz turnon
usepwm btfss CCP1CON,CCP1M3
call initPWM
rrf brightness,w
movwf AL
rrf AL,w
andlw 0x3F
movwf CCPR1L
swapf brightness,w
andlw 0x30
iorlw 0x0C
movwf CCP1CON
return
turnoff clrf T2CON ;turn off Timer2
clrf CCP1CON ;turn off CCP
bcf GPIO,pinPWM
return
turnon clrf T2CON ;turn off Timer2
clrf CCP1CON ;turn off CCP
bsf GPIO,pinPWM
return
;8 111 B x1 11
;7 110 GB 11 11
;6 101 G 1x 10
;5 100 GY 10 10
;4 011 Y x0 00
;3 010 YR 00 00
;2 001 R 0x 01
;1 000 RB 01 01
;0 --- -- xx --
display_mode
movlw 6
btfsc mode,0
movlw 4
btfsc mode,1
movlw 8
display_digit
addlw -1
bc swtris
bsf STATUS,RP0 ;Bank 1
bsf TRISIO,pinBY
bsf TRISIO,pinGR
bcf STATUS,RP0 ;Bank 0
return
swtris movwf AL
movlw 0 ;0,2,4,6: TRISIO=00
btfss AL,0
goto settris
movlw 1<<pinBY ;1,5: TRISIO=01
btfsc AL,1
movlw 1<<pinGR ;3,7: TRISIO=10
settris bsf STATUS,RP0 ;Bank 1
bcf TRISIO,pinBY
bcf TRISIO,pinGR
iorwf TRISIO,f
bcf STATUS,RP0 ;Bank 0
rrf AL,w
btfss AL,2
xorlw 1
andlw 3
bcf GPIO,pinBY
bcf GPIO,pinGR
iorwf GPIO,f
return
read_mode_settings
movlw mode_brightness
movwf FSR
clrc
rlf mode,w
bsf STATUS,RP0 ;Bank 1
movwf EEADR
EEread bsf EECON1,0 ;starts EEPROM read operation – result in EEDAT
movf EEDAT,w
movwf INDF
incf FSR,f
incf EEADR,f
bsf EECON1,0 ;starts EEPROM read operation – result in EEDAT
movf EEDAT,w
movwf INDF
bcf STATUS,RP0 ;Bank 0
goto display_mode
write_mode_settings
movlw mode_brightness
movwf FSR
clrc
rlf mode,w
bsf STATUS,RP0 ;Bank 1
movwf EEADR
EEwrite movf INDF,w
movwf EEDAT
bsf EECON1,WREN ;enable write
movlw 55h ;unlock codes
movwf EECON2
movlw 0AAH
movwf EECON2
bsf EECON1,WR ;write begins
bcf STATUS,RP0 ;select bank0
btfss PIR1,EEIF ;wait for write to complete
goto $-1
bcf PIR1,EEIF
bsf STATUS,RP0 ;select bank1
incf FSR,f
incf EEADR,f
btfsc EEADR,0
goto EEwrite
bcf EECON1,WREN ;disable other writes
bcf STATUS,RP0 ;select bank0
return
delay4m addwf time0,w
movwf AL
waitz movf time0,w
xorwf AL,w
bnz waitz
return
readkey clrf keys
clrf buttons_state
btfsc GPIO,pinBtn0
bsf buttons_state,0
btfsc GPIO,pinBtn1
bsf buttons_state,1
movf buttons_state,w
xorwf start_debounce_state,w
bnz restart_debounce
movf start_debounce_time,w
subwf time0,w
addlw -10 ;debounce delay = 41 ms
skpc
return ;too litle time in new state
movf buttons_state,w
xorwf last_buttons_state,w
bnz btnchg
;if no physical event, then check for virtual
btfsc key_stat,before_repeating
goto check_first_repeat
btfsc key_stat,now_repeating
goto check_next_repeat
return ;neither physical nor virtual
check_first_repeat
movf key_event_timeL,w
subwf time0,w
addlw -195 ;0.8s
skpc
return
bcf key_stat,before_repeating
bsf key_stat,now_repeating
goto save_repeat_time
check_next_repeat
movf last_key_repeat_time,w
subwf time0,w
addlw -24 ;98ms
skpc
return
save_repeat_time
movf time0,w
movwf last_key_repeat_time
btfsc key_stat,btn1_first
bsf keys,btn1_first
bsf keys,btn_step
return
btnchg movf buttons_state,w
bz to00 ;isn't new state "none pressed"?
xorlw 3
bz to11 ;isn't new state "both pressed"?
;neither of them – new state is "only one pressed"
movf last_buttons_state,w
bz from00 ;wasn't previous state "none pressed"?
;no – it was "both pressed"
from11 btfss key_stat,after_repeating
goto endbtn
;if autorepeat still hasn't started;
;then ignore the 1st release
;and wait for complete release to report "shift-press ended"
;else report shift-press on every release as usual autorepeat
bsf keys,btn_step
comf key_stat,w
andlw 1<<btn1_first
iorwf keys,f
goto endbtn
;sequence start:
;transition from "none pressed" to "one pressed"
;just save the initial information
from00 clrf key_stat
btfsc buttons_state,1
bsf key_stat,btn1_first
bsf key_stat,before_repeating
bcf INTCON,GIE
movf time1,w
movwf key_event_timeH
movf time0,w
movwf key_event_timeL
bsf INTCON,GIE
endbtn movf buttons_state,w
movwf last_buttons_state
return
to00 btfsc key_stat,btns_pr
goto endbl
btfsc key_stat,now_repeating
goto endseq
btfsc key_stat,after_repeating
goto endseq
;neither shift-press nor repeating
;so report normal "single button press & release"
bsf keys,btn_pr
goto retkey
;shift-press sequence end (both released)
endbl bcf INTCON,GIE
movf key_event_timeL,w
subwf time0,w
skpc
incf key_event_timeH,f
movf key_event_timeH,w
subwf time1,w
bsf INTCON,GIE
skpz
bsf keys,btns_long ;long shift-press (>1 second)
bsf keys,btns_pr ;report "shift-press ended"
retkey btfsc key_stat,btn1_first
bsf keys,btn1_first
endseq clrf key_stat
goto endbtn
;shift-press
to11 btfss key_stat,now_repeating
goto double
;if the second button was pressed late (autorepeat already on)
;then end autorepeat and make sequential shift-presses work on release
bcf key_stat,now_repeating
bsf key_stat,after_repeating
goto endbtn
;else mark that both are pressed and wait until both released
double bcf key_stat,before_repeating
bsf key_stat,btns_pr
goto endbtn
restart_debounce
xorwf start_debounce_state,f
movf time0,w
movwf start_debounce_time
return
SetUp clrf time0
clrf time1
clrf time2
clrf last_buttons_state
clrf start_debounce_state
clrf mode ; 0 for m2, 1 for m1, 2 for m3
incf mode,f
clrf settings
movlw 0x07
movwf CMCON0 ;turn off Comparator
clrf INTCON
bsf STATUS,RP0 ;Bank 1
clrf ANSEL ;no analog inputs
movlw 0x67 ;4MHz HFINTOSC
movwf OSCCON
movlw b'00101011' ;CCP1=GP2->output; GP4->output; all other inputs
movwf TRISIO
movlw (1<<pinBtn0)|(1<<pinBtn1) ;enable interrupt by buttons change
movwf IOC
movlw b'11000011' ;pull-ups disabled; TMR0<-CLKOUT; TMR0:16
movwf OPTION_REG
bcf STATUS,RP0 ;Bank 0
bsf INTCON,T0IE
bsf INTCON,GIE
bcf GPIO,pinBoost
init_cur_mode
call read_mode_settings
clrf brightness
softst call increase_brightness
movlw 5
call delay4m
movf mode_brightness,w
subwf brightness,w
bnc softst ;brightness<mode_brightness
bz setimer
setmode movf mode_brightness,w
call set_brightness
setimer call set_timer
main_loop
call readkey
movf keys,f
bnz pkeys
check_timer
bcf INTCON,GIE
movf time2,w
movwf AH
movf time1,w
movwf AL
bsf INTCON,GIE
movf switchtimeH,w
subwf AH,w ;time-switchtime
bnc main_loop ;<0 => not reached
bnz switch_mode ;>0 => reached
movf switchtimeL,w
subwf AL,w
bnc main_loop
goto switch_mode
pkeys btfsc keys,btns_long
goto settings
btfsc keys,btns_pr
goto switch_to_boost
btfsc keys,btn_pr
goto buttons_norm
btfsc keys,btn_step
goto buttons_step
goto main_loop
buttons_norm
btfsc keys,btn1_first
goto pbtn1
pbtn0 movf mode,f
bnz cb0m1
incf mode,f ;switch from m2 to m1
goto reinit_mode
cb0m1 btfss mode,0
goto switch_mode ;switch from m3 to m2
call add_timer ;increase time in m1
movlw 5
call display_digit
goto main_loop
pbtn1 btfss mode,0
goto switch_mode ;turn off from m2 or switch to m2 from m3
goto reinit_main_mode;from m1
buttons_step
btfsc keys,btn1_first
goto sbtn1
call decrease_brightness
goto main_loop
sbtn1 call increase_brightness
goto main_loop
settings
btfsc keys,btn1_first
goto set_timer_start
set_brightness_start
call display_mode
movf mode_brightness,w
call set_brightness
movf time1,w
addlw 60
movwf settings_timeout
set_brightness_loop
movf time1,w
xorwf settings_timeout,w
bz save_settings
call readkey
movf keys,f
bz set_brightness_loop
set_brightness_keys
btfsc keys,btns_pr
goto save_settings
btfsc keys,btn1_first
goto incbrtn
call decrease_brightness
goto updbrtn
incbrtn call increase_brightness
updbrtn movf brightness,w
movwf mode_brightness
goto set_brightness_loop
set_timer_start
movlw 6
call set_brightness
movlw 32 ;animate digit from 1 to 8
movwf AH
animate decf AH,w
andlw 7
addlw 1
call display_digit
movlw 12
call delay4m
decfsz AH,f
goto animate
movf time1,w
addlw 60
movwf settings_timeout
clrf last_blink_state
set_timer_loop
btfss mode_timer,3
goto blinkon
rlf time0,w
addlw 51
movlw 0
skpnc ;0 for first 2/3 of each second
movlw 1 ;1 for last 1/3
xorwf last_blink_state,w
bz set_timer_timeout
xorwf last_blink_state,f
movlw 0
skpnz ;display 0 for last 1/3
blinkon incf mode_timer,w ;display current mode for first 2/3
call display_digit
set_timer_timeout
movf time1,w
xorwf settings_timeout,w
bz save_settings
call readkey
movf keys,f
bz set_timer_loop
set_timer_keys
btfsc keys,btns_pr
goto save_settings
decf mode_timer,w
btfsc keys,btn1_first
addlw 2
andlw 0x0F
movwf mode_timer
goto set_timer_loop
save_settings
call write_mode_settings
goto init_cur_mode
switch_to_boost
movlw 0
call set_brightness
bsf GPIO,pinBoost
movlw 2
movwf mode
call read_mode_settings
goto setmode
switch_mode
btfss mode,1
goto prepair_to_sleep
movlw 0
call set_brightness
bcf GPIO,pinBoost
reinit_main_mode
clrf mode
reinit_mode
call read_mode_settings
goto setmode
prepair_to_sleep
call decrease_brightness
movlw 5
call delay4m
movf brightness,f
bnz prepair_to_sleep
movlw 0
call display_digit
bcf INTCON,GIE
bcf GPIO,pinPWM
bcf INTCON,GPIF
bsf INTCON,GPIE
sleep
clrf mode
btfsc GPIO,pinBtn0
incf mode,f
bcf INTCON,GPIE
bcf INTCON,GPIF
bsf INTCON,GIE
wait_key_released
movlw 2
call delay4m
btfsc GPIO,pinBtn0
goto wait_key_released
btfsc GPIO,pinBtn1
goto wait_key_released
goto init_cur_mode
org 0x2100
de 80,8,40,8,160,5
END
mnashe!Опять ничего не получается.
1) Код не чисто Ассемблер, компиляция не проходит! Моему "flat assembler 1.71.54" не понравилась строка 12:
include "p12f683.inc" — зарубил идею!
(http://i84.fastpic.ru/big/2016/1014/46/1b863011ca829c4c5a121deb79d74046.jpeg)
2)
MULTEDIT тоже "рогом упёрся", не проходит компиляция. Как быть?
Multi-Edit V4.13 [Text Edit] Insert Mem[380k] ëÿÖÜ üë 10:31 ▌ä"ü▐
ERROR 28: $command expected
─L[00001]─C[007]─P[001]─────────────────────────────────────────────────────────
; ┌───v───┐(http://i82.fastpic.ru/big/2016/1014/d0/e77b335f42ff023fe9c44f35f4187ed0.jpeg)
Цитата: Bhudh от октября 14, 2016, 00:24
Тогда интересно, что же там за процессор.
Bhudh!Мой процессор двухъядерный 1.66 GHz.
(http://i82.fastpic.ru/big/2016/1014/82/e4b93707548fb3f0d3c598b5b8f3a282.jpeg)
Цитата: balky_03 от октября 14, 2016, 11:15
Цитата: mnashe от октября 14, 2016, 00:25
Покажу ещё один ассемблер. Для 8-битных микроконтроллеров фирмы Microchip.
mnashe!
Опять ничего не получается.
1) Код не чисто Ассемблер, компиляция не проходит! Моему "flat assembler 1.71.54" не понравилась строка 12: include "p12f683.inc" — зарубил идею!
:fp:
Прочтите уже что-нибудь по языкам программирования.
«Как и сам язык, ассемблеры, как правило, специфичны для конкретной архитектуры, операционной системы и варианта синтаксиса языка (https://ru.wikipedia.org/wiki/%D0%90%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80)».
Было бы станно, если бы у вас скомпилировалась эта программа - у вас ведь, как я понимаю, такого контроллера (Microchip P12F683) нет? Скорее всего, нужный файл "инклюд" (include (http://the-programmer.ru/publ/assembler_2/programmirovanie_na_assemblere/urok_105_komandy_include)) распространяется вместе с контроллером, и представляет собой набор рутин (то бишь, стандартных подпрограмм) для работы с оным. У вас же, как я понимаю, этого файла просто нет, поэтому компилятор ругается.
Цитата: Lodur от октября 14, 2016, 12:13
Прочтите уже что-нибудь по языкам программирования...
Было бы станно, если бы у вас скомпилировалась эта программа - у вас ведь, как я понимаю, такого контроллера (Microchip P12F683) нет?.. поэтому компилятор ругается.
Lodur!Осилил только ограничения: 3 и 8! С Ассемблером вижусь раз в полгода, редко. :-[ Шапочное знакомство.
Хорошо, вот он — "p12f683.inc", скачал его (13 Кб) https://class.ee.washington.edu/475/peckol/code/Microchip/microchipExamples/mpasm/P12F683.INC
(http://i78.fastpic.ru/big/2016/1014/c9/fac5b87cc519302974311d197b7eb7c9.jpeg)
Что с ним делать, чтобы "
код mnashe" сработал? Куда его вставить? Подскажите, пожалуйста.
Цитата: balky_03 от октября 14, 2016, 13:22
Что с ним делать, чтобы "код mnashe" сработал? Куда его вставить? Подскажите, пожалуйста.
Чем дальше в лес, тем больше дров!!Прописываю "p12f683.inc" по адресу:
C:\FASM\INCLUDE\P12F683.INC(http://i82.fastpic.ru/big/2016/1014/c6/bdd1f8b2c7c810ffa97a50e4eca1a8c6.jpeg)
Запускаю "flat assembler 1.71.54"!
Теперь ему не нравится "строка 103" в самом " P12F683.INC", где он сомневается в СТАТУСЕ: RP1 EQU H'0006'
(http://i85.fastpic.ru/big/2016/1014/0b/69348922886f8ed73e20734e4a76cc0b.jpeg)
"Строка 103" выглядит так (
на общем фоне)
(http://i78.fastpic.ru/big/2016/1014/04/81b250716230fa2115b7b9a85cc0eb04.jpeg)
Цитата: Bhudh от октября 14, 2016, 10:41
И шёл ли вывод только в файл?
Да.
Цитата: balky_03 от октября 14, 2016, 13:22
Что с ним делать, чтобы "код mnashe" сработал?
1. Нарисовать схему и развести печатную плату фонарика (или воспользоваться моими).
2. Придумать конструкцию корпуса и собрать корпус (моей конструкцией лучше не пользоваться, она мне не понравилась, слишком много возни).
3. Купить все нужные детали:
- микроконтроллер PIC12F683 в формате SO8
- светодиодный драйвер AP3031 в формате SOT23-6
- 4 светодиода разных цветов (RYGB) в формате 1206 и ещё три таких любых цветов (у меня два оранжевых и синий)
- две микросхемы ёмкостного датчика касания ttp223 в формате SOT23-6
- два полевых транзистора AO3400 или SI2300 в формате SOT23
- диод Шоттки SS24 или SS34
- пара резисторов на 100–300Ω в формате 1206 или 0805
- пара резисторов на ≈1kΩ в формате 1206 или 0805
- резистор на 47–0200Ω в формате 1206 или 0805
- катушка индуктивности с ферритовым сердечником (то есть предназначенная для высоких частот) на 4,7μH 2A
- керамический или танталовый конденсатор на 10μF 6,3V (или больше)
- керамический или танталовый конденсатор на 0,47μF 20V (или больше)
- пара керамических конденсаторов 25-35 pF
- держатель литиевого аккумулятора или разъём для подключения
- светодиодная матрица (COB) на цепочках из двух или трёх светодиодов в каждой
- несколько разъёмов и проводков
4. Спаять плату.
5. Приклеить (на термопроводящий клей) или прикрутить (через термопасту) светодиодную матрицу на подходящий радиатор (в зависимости от мощности матрицы и конструкции корпуса).
6. Купить программатор (оптимальный вариант — PICkit3, цена порядка $12, точно не знаю сколько сейчас).
7. Загрузить с сайта Microchip и установить среду разработки MPLabX.
8. Подключить программатор к USB, а разъём программирования микроконтроллера на плате — к программатору (5 проводов, включая питание).
9. Запустить MPLabX.
10. Создать новый проект.
11. Добавить туда мой исходный код (файл tentlamp.asm).
12. Откомпилировать и залить в мк.
13. Отсоединить плату от программатора.
14. Перебросить перемычки или разъёмы на плате из режима программирования в рабочий режим.
15. Собрать весь фонарик: корпус, плату, держатель батарейки, радиатор с матрицей.
Я ничего не забыл? :???
Цитата: mnashe от октября 14, 2016, 16:05
...
- диод Шоттки SS24 или SS34
- пара резисторов на 100–300Ω в формате 1206 или 0805
- пара резисторов на ≈1kΩ в формате 1206 или 0805
...
13. Отсоединить плату от программатора.
14. Перебросить перемычки или разъёмы на плате из режима программирования в рабочий режим.
15. Собрать весь фонарик: корпус, плату, держатель батарейки, радиатор с матрицей.
Я ничего не забыл? :???
mnashe!Нет!
И так впечатляюще! ;up:
Спасибо, что вовремя меня предупредили (остановили). Хватит мне, выше крыши — сильных потрясений на сегодня.
mnashe,
давайте земные (детские) задачи решать. Например, на оптимизацию ниже:
Условия
1) После переработки сырья M получаем: 16a + 12b + 10c + 7d + 3e;
2) Перерабатывая сырья N: 20a + 15b + 13c + 4d + 5e;
3) Сырьё K: 11a + 10b + 9c + 5d + 4e.Какое надо оптимальное соотношение (пропорция) между частями M, N и K — если общая потребность: 575a + 458b + 371c + 178d + 142e?
Неужели никто не знает? Вроде ещё не ночь, спать рановато. Америка не в счёт.
Предполагаю: вокруг иностранцы, поскольку в России такие задачи под силу ребёнку.
Смотрите моё решение, затратил 2-3 минуты — возможно у кого-нибудь получится лучше.
(http://i84.fastpic.ru/big/2016/1014/af/9c987d79de3d44371646f579be62caaf.jpeg)
Имеется четыре агрегата (автомата) для изготовления однотипных изделий.
Таблица. Вид и длительность операций на единицу продукции, в минутах
___________Штамповка_____Сборка_____Покраска_____Упаковка
Агрегат 1______0,51__________1,25_________0,25________0,20
Агрегат 2______0,43__________1,44_________0,35________0,18
Агрегат 3______0,35__________1,52_________0,34________0,16
Агрегат 4______0,41__________1,39_________0,33________0,17
Как правильно разделить операции между агрегатами, чтобы часовой выпуск готовой продукции был максимальным?
За что люблю программирование? Достаточно предложить любую детскую, но конкретную задачу, как математики тут же замолкают. Как бы теряют дар мышления.
Цитата: balky_03 от октября 15, 2016, 09:41
Как правильно разделить операции между агрегатами, чтобы часовой выпуск готовой продукции был максимальным?
В Интернете аналогов подобных задач нет.Затратил 5-7 минут на решение — чисто умозрительное, чтобы каждый агрегат занимался делом, которое у него получается лучше. Никакое программирование не потребовалось.
Узкое место "сборка", поэтому максимальный часовой выпуск — 111 штук готовых изделий.(http://i82.fastpic.ru/big/2016/1017/7b/a160ef99d753e46ea0782303f6d3487b.jpeg)
Программирование<>математике по одной простой причине
- не существует идеального компьютера с идеальным компилятором, как не существует идеального газа, сферического коня в ваккууме и прочих удобных для манипуляций, но отсутствующих в реальной жизни объектов.
"Мы живём в суровом аналоговом мире" (с) СтивенсОн.
Когда берут программера на работу, первое, о чём его спрашивают - знает ли он конкретный компилятор А, редактор В этсетера. Потому что часто А=B даёт в результате иной код, чем В=А. И всё это надо знать...
Лет 20 назад Дейкстра носился с идеей универсального верификатора программ... Ну и чем это кончилось? А ничем, собственно. По прежнему практика - критерий истины. Тестеры не нашли ошибок - и ладушки.
Цитата: balky_03 от октября 17, 2016, 08:27
Никакое программирование не потребовалось.
Поправка компьютера, ниже, заметил мою описку.Правильно:
максимальный часовой выпуск — 112 штук готовых изделий.
У меня счётная ошибка по сборке из-за рассеянности, :-[ считал в уме — вроде всё просто.
Проверить на калькуляторе поленился [26 + 41 + 2 + 42(??) = 111] <—> [59,77/1,39 = 43!!].
Напоролся, споткнулся на ровном месте.(http://i85.fastpic.ru/big/2016/1017/99/73a24e9706c2e813e3cf6e1ca595b399.jpeg)
Недавно, для наведения порядка в скачиваемых с интернетов картинках сделал себе программу для «фингерпринтинга» изображений.
Программа анализирует изображение и добавляет спереди к названию файла его фингерпринт так, чтобы похожие изображения в результате оказывались рядом при сортировке файлов.
Программа, вроде бы, работает нормально.
Но как форумчане решили бы эту задачу? Как, по-вашему, должен выглядеть фингерпринт, и какую информацию он должен содержать?
Цитата: balky_03 от октября 14, 2016, 21:05
Неужели никто не знает? Вроде ещё не ночь, спать рановато. Америка не в счёт.
Предполагаю: вокруг иностранцы, поскольку в России такие задачи под силу ребёнку.
Смотрите моё решение, затратил 2-3 минуты — возможно у кого-нибудь получится лучше.
(http://i84.fastpic.ru/big/2016/1014/af/9c987d79de3d44371646f579be62caaf.jpeg)
За такие задачи Канторович нобелевскую премию получил.
(wiki/ru) Канторович,_Леонид_Витальевич (http://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D0%BD%D1%82%D0%BE%D1%80%D0%BE%D0%B2%D0%B8%D1%87,_%D0%9B%D0%B5%D0%BE%D0%BD%D0%B8%D0%B4_%D0%92%D0%B8%D1%82%D0%B0%D0%BB%D1%8C%D0%B5%D0%B2%D0%B8%D1%87)
Раз уж мы этого коснулись, на ночь глядя. ЛП - медленная вещь. Многие задачи, которые допускают сетевую постановку (через графы), например, все варианты транспортной задачи, быстрее решаются алгоритмами построения потоков в сетях. Линейное программирование - универсальный метод; потоковые алгоритмы более специализированы, потому быстрее. Но с формальной точки зрения, как бы мы не решали NP-полные задачи, линейным программированием или потоковыми алгоритмами, всё равно в худшем случае выч. сложность экспоненциальна. Просто у потоковых алгоритмов экспоненциальный взрыв отодвинут до нескольких тысяч вершин.
Цитата: Hellerick от октября 17, 2016, 11:22
Недавно, для наведения порядка в скачиваемых с интернетов картинках сделал себе программу для «фингерпринтинга» изображений.
Программа анализирует изображение и добавляет спереди к названию файла его фингерпринт так, чтобы похожие изображения в результате оказывались рядом при сортировке файлов.
Программа, вроде бы, работает нормально.
Но как форумчане решили бы эту задачу? Как, по-вашему, должен выглядеть фингерпринт, и какую информацию он должен содержать?
Хмм, наверно нужно разложить в ряд Фурье. Фингерпринт будет содержать конечное число кофициентов при гармониках.
Цитата: _Swetlana от ноября 2, 2016, 23:01
За такие задачи Канторович нобелевскую премию получил.
(wiki/ru) Канторович,_Леонид_Витальевич
Цитировать
После того, как Л. В. Канторовичем был предложен оптимальный метод распила фанерного листа, этот метод в том числе попытались применить к разрезанию стальных листов. После внедрения методов оптимизации на производстве одной из фабрик инженерам удалось улучшить показатели, что привело, однако, к негативным последствиям: система социалистического планирования требовала, чтобы в следующем году план был перевыполнен, что было принципиально невозможно при имеющихся ресурсах, поскольку найденное решение было абсолютным максимумом; фабрика не выполнила план по металлолому, львиная доля которого складывалась из обрезков стальных листов. Руководство фабрики получило выговор и больше с математиками не связывалось.
:D
Цитата: svarog от ноября 3, 2016, 01:53
Хмм, наверно нужно разложить в ряд Фурье. Фингерпринт будет содержать конечное число кофициентов при гармониках.
Звучит здорово.
Жаль, непонятно. Нам практическое применение рчдов Фурье вообще никак не объясняли.
Цитата: Hellerick от ноября 3, 2016, 03:22
Жаль, непонятно. Нам практическое применение рчдов Фурье вообще никак не объясняли.
Схема такая.
Берём пиксельное представление картинки, т.е. функцию f(x,y) -> (R,G,B). Для каждой из цветовых компонент проделываем следующий алгоритм. Для примера возьмём компоненту R. Для неё имеем скалярную функцию:
f(x,y) -> R
Применяем к ней двумерное преобразование Фурье, т.е. находим коэффициенты ряда Фурье при разложении этой функции по какому-то ортогональному базису (обычно берутся синусы-косинусы):
http://math.stackexchange.com/questions/211689/real-valued-2d-fourier-series
(Существуют вычислительные алгоритмы, позволяющие быстро найти коэффициенты Фурье, например Fast Foruier transform (https://en.wikipedia.org/wiki/Fast_Fourier_transform))
В итоге получаем набор коэффициентов c
i,j. Для создания сжатого образа картинки берём конечный набор этих коэффициентов (меньший, чем размер исходной картинки). На этом принципе работают алгоритмы сжатия типа jpeg или mp3.
Для создания fingerprint'a можно отсортировать коэффициенты в одномерный массив, например, пронумеровав "змейкой" (имеем в виду, что чем меньше номер коэффициента, тем важнее отвечающая ему гармоника).
(wiki/en) Pairing_function#/media/File:Diagonal_argument.svg (https://en.wikipedia.org/wiki/Pairing_function#/media/File:Diagonal_argument.svg)
После этого обрезаем массив и преобразуем его в строку. По сути, такой метод -- тот же jpeg с очень большим коэффициентом сжатия.
Цитата: svarog от ноября 3, 2016, 14:12
Цитата: Hellerick от ноября 3, 2016, 03:22
Жаль, непонятно. Нам практическое применение рчдов Фурье вообще никак не объясняли.
Схема такая.
Берём пиксельное представление картинки, т.е. функцию f(x,y) -> (R,G,B). Для каждой из цветовых компонент проделываем следующий алгоритм. Для примера возьмём компоненту R. Для неё имеем скалярную функцию:
f(x,y) -> R
Для фингерпринта это не нужно, надо брать Y (яркость, lumu). А цветные компоненты надо вообще выбрасывать, в них информации практически нет.
Цитата: svarog от ноября 3, 2016, 14:12
Берём пиксельное представление картинки, т.е. функцию f(x,y) -> (R,G,B). Для каждой из цветовых компонент проделываем следующий алгоритм. Для примера возьмём компоненту R. Для неё имеем скалярную функцию:
f(x,y) -> R
Фурье ведь работает с рядом, а не с двухмерым массивом. То есть в него надо скармливть не двухмерное изображение, а один поток пикселей, собираемый по строкам? А не получатся ли итоговые коэффициенты зависящими от размера изображения? Хотелось бы, чтобы у разных размеров одной картинки фингерпринт был один.
Цитата: Hellerick от ноября 3, 2016, 14:37
Фурье ведь работает с рядом, а не с двухмерым массивом.
Фурье работает с функцией. В одномерном случае он преобразует функцию R->R в ряд c
i.
Существует преобразование Фурье для любых размерностей, я выше давал ссылку.
http://math.stackexchange.com/questions/211689/real-valued-2d-fourier-series
В двумерном случае, функция R
2 -> R преобразуется в двумерный массив с
i,j.
Цитата: Hellerick от ноября 3, 2016, 14:37
А не получатся ли итоговые коэффициенты зависящими от размера изображения?
Получатся. Нужно над этим отдельно подумать (кажется, достаточно будет просто пронормировать, т.е. разделить все коэффициенты на первый).
Так же, над сдвигом нужно подумать. Для сдвига наверно просто нужно выкинуть свободный коэффициент.
Hellerick, а как вы сделали?
Цитата: svarog от ноября 3, 2016, 15:04
Цитата: Hellerick от ноября 3, 2016, 14:37
А не получатся ли итоговые коэффициенты зависящими от размера изображения?
Получатся. Нужно над этим отдельно подумать (кажется, достаточно будет просто пронормировать, т.е. разделить все коэффициенты на первый).
Так же, над сдвигом нужно подумать. Для сдвига наверно просто нужно выкинуть свободный коэффициент.
Это плохо, очень. Для этих целей лучше всего подходят вейвлет-преобразования.
Цитата: лад от ноября 3, 2016, 15:10
Цитата: svarog от ноября 3, 2016, 15:04
Цитата: Hellerick от ноября 3, 2016, 14:37
А не получатся ли итоговые коэффициенты зависящими от размера изображения?
Получатся. Нужно над этим отдельно подумать (кажется, достаточно будет просто пронормировать, т.е. разделить все коэффициенты на первый).
Так же, над сдвигом нужно подумать. Для сдвига наверно просто нужно выкинуть свободный коэффициент.
Это плохо, очень. Для этих целей лучше всего подходят вейвлет-преобразования.
Для этого достаточно просто предварительно сжать изображение до стандартной миниатюры. Например, 16x16 пикселей.
Цитата: лад от ноября 3, 2016, 15:10
Это плохо, очень. Для этих целей лучше всего подходят вейвлет-преобразования.
Как вейвлеты решат проблемы со сдвигом и масштабированием? Вейвлет-функции -- это такой же ортонормированный базис как и синусы-косинусы. Никаких качественно новых свойств у них нет.
Цитата: svarog от ноября 3, 2016, 15:18
Цитата: лад от ноября 3, 2016, 15:10
Это плохо, очень. Для этих целей лучше всего подходят вейвлет-преобразования.
Как вейвлеты решат проблемы со сдвигом и масштабированием? Вейвлет-функции -- это такой же ортонормированный базис как и синусы-косинусы. Никаких качественно новых свойств у них нет.
Не тот же. Вейвлеты это и есть разложение с масштабированием, грубо говоря. Новые качественные свойства у них есть.
Цитата: лад от ноября 3, 2016, 15:20
Не тот же. Вейвлеты это и есть разложение с масштабированием, грубо говоря.
То есть, вы хотите сказать, что у функции 3*f(x) будут такие же коэффициенты в вейвлет-разложении, что и у функции f(x)? Это же нелогично. Понятно, что коэффициенты всё равно будут в три раза больше.
В целом я согласен, вейвлет-базис лучше подходит для картинок и музыки. Он вроде бы лучше выделяет значимые для глаза/уха компоненты.
Цитата: svarog от ноября 3, 2016, 15:24
Цитата: лад от ноября 3, 2016, 15:20
Не тот же. Вейвлеты это и есть разложение с масштабированием, грубо говоря.
То есть, вы хотите сказать, что у функции 3*f(x) будут такие же коэффициенты в вейвлет-разложении, что и у функции f(x)? Это же нелогично. Понятно, что коэффициенты всё равно будут в три раза больше.
Мы же говорим о дискретном случае. Так вот, старшие коэффициенты вейлет-преобразования не зависят от величины картинки. Грубо говоря, это просто как коэффициенты всегда уменьшенной картинка скажем до 16х16, только качественнее. В этом то и смысл вейвлетов.
Цитата: svarog от ноября 3, 2016, 15:09
Hellerick, а как вы сделали?
Да я мудрствовал.
В первую очередь изображение кадрируется — чтобы избавиться от неинформативного фона.
Потом для каждого цветового уровня изображения замеряю среднее значение. Потом замеряю, а в каждой четверти средний уровень выше или ниже среднего по изображению — таким образом получаю 4 бита информации. А для трех цветовых уровней — 12 бит.
Потом такую же операцию проделываю для каждой четверти. Всего таким образом получаю 60 бит. При перекодировании в латиницу-26 эта информация умещается в 13 символах, которые добавляются спереди к названию файла.
Цитата: Hellerick от ноября 3, 2016, 15:30
Цитата: svarog от ноября 3, 2016, 15:09
Hellerick, а как вы сделали?
Да я мудрствовал.
В первую очередь изображение кадрируется — чтобы избавиться от неинформативного фона.
Потом для каждого цветового уровня изображения замеряю среднее значение.
Вот это излишне. Качественнее перевести изображение в YCbCr, CbCr выкинуть, то есть вообще не считать. С Y сделать то что вы делаете. А если хочется, то приибавить средние по Cb Cr, чтобы различать цвета картинок. Так сжатие будет сильнее, и качество картинки будет передаваться лучше.
Цитата: лад от ноября 3, 2016, 15:35
CbCr выкинуть, то есть вообще не считать.
Тут ещё неизвестно, что сильнее влияет на «похожесть». Может захотеться сгруппировать жёлтые картинки с жёлтыми, красные — с красными и т. д.
Цитата: Hellerick от ноября 3, 2016, 15:30
Потом для каждого цветового уровня изображения замеряю среднее значение. Потом замеряю, а в каждой четверти средний уровень выше или ниже среднего по изображению — таким образом получаю 4 бита информации. А для трех цветовых уровней — 12 бит.
Потом такую же операцию проделываю для каждой четверти.
Это практически и есть фурье.
Цитата: Тайльнемер от ноября 3, 2016, 17:50
Цитата: Hellerick от ноября 3, 2016, 15:30
Потом для каждого цветового уровня изображения замеряю среднее значение. Потом замеряю, а в каждой четверти средний уровень выше или ниже среднего по изображению — таким образом получаю 4 бита информации. А для трех цветовых уровней — 12 бит.
Потом такую же операцию проделываю для каждой четверти.
Это практически и есть фурье.
Нет. Это больше похоже на преобразование Уолша(Адамара) или вейвлет Хаара. Коэффициентами Фурье тут и не пахнет.
Задачка из моей темы Проект автомобильных номеров России (http://lingvoforum.net/index.php/topic,86503.0.html)
Чтобы автомобильные номера выдавались не по порядку, а максимально разными, я их порядок перепутываю по такой формуле:
n = p*128142731%207339264,
где:
% — операция остатка от деления:
p — изначальный порядковый номер;
n — число, определяющее, что именно будет написано на собственно номерном знаке;
207339264 — теоретическое максимальное количество выдаваемых номеров;
128142731 — простое число, используемое для «перетасовывания» номеров (выбрано так, чтобы 207339264/128142731 было похоже на золотое сечение).
Но что если мне наоборот хочется из n получить p?
Я составил для этого формулу, но сам не понимаю, как и почему она работает. Что-то у меня мозги вообще в теме остатка от деления плохо работают.
Как бы вы находили p?
Цитата: Hellerick от ноября 24, 2016, 15:41
Как бы вы находили p?
Так же как и вы. Нагуглил бы, что это называется "деление в кольце" и как делается, а на объяснения "почему работает" забил бы.
Кто-нибудь пытался освоить разведение нейросетей?
Цитата: Hellerick от декабря 9, 2016, 04:27
Кто-нибудь пытался освоить разведение нейросетей?
Вадимий щас этим занимается в универе. Если есть вопросы, могу ему передать.
Да я вот прикидывал, можно ли нейросеть заставить составлять транскрипции незнакомых английских слов.
Понятно, что можно — вот только насколько реалистично для непрофессионалов?
Цитата: ВадимийНе готов ответить содержательно, хотя ставлю на да.
Скорее всего, проще обойтись скриптом, дающим варианты с вероятностями. Сетки в мелочах путаются.