Arvi the Hacker (Арви Хэкер) ([info]arvi) wrote in [info]mk_152,

Первый вариант, для затравки.

Чтобы было с чего начинать, публикую программу «Hex-1» (КС 12097/45) — первую версию вывода шестнадцатеричного числа «в лоб». Конечно же, это ещё далеко не Грааль, вывод реализован простым циклом. Даже двумя (40-41 и 49-50). Но задаёт границу «сверху» в 62 шага и теперь другим есть, от чего отталкиваться.

На входе числа от 0 до 99999999 (восемь десятичных знаков), на выходе числа от 0 до 5f5e0ff. На самом деле программа корректно переводит и отображает числа вплоть до fffffff, просто их сложнее вводить с клавиатуры.

00.ПП   01.05  02.С/П  03.БП  04.00   05.П0   06.6   07.В↑  08.1    09.6
10.FXy  11.П1  12.ИП0  13.ИП1 14.-    15.Fx≥0 16.47  17.Cx  18.П6   19.ИП0

20.ИП1  21.-   22.Fx<0 23.43  24.ИП6  25.1    26.0   27.-   28.Fx≥0 29.33
30.3    31.9   32.+    33.5   34.8    35.+    36.ПП  37.53  38.ПП   39.57
40.Fx=0 41.17  42.В/О  43.П0  44.КИП6 45.БП   46.19  47.ПП  48.57   49.Fx=0
50.12   51.4   52.8    53.PPП 54.90   55.25   56.В/О 57.ИП1 58.1    59.6
60.%    61.9   62.F1/x 63.+   64.K[x] 65.П1   66.В/О

«Сердцем» программы являются шаги 24-37, осуществляющие вывод одной шестнадцатеричной цифры. К тонкостям можно отнести шаги 61-64, введённые из-за ошибок округления на шагах 10 и 60, а также обращающие в ноль R1 после вывода последней шестнадцатеричной цифры. В подпрограмме 53-56 применён приём, называющийся хвостовой рекурсией. С одной стороны она вызывается с шагов 36-37, с другой стороны её оператор В/О также служит для возврата из основной подпрограммы 05-66. Надеюсь, что ваша программа получится значительно меньше, чем этот первый блин.

2 декабря я заменил два цикла математическими формулами, что позволило сократить программу на 4 шага и довести длину подпрограммы до 58 шагов. Встречайте программу «Hex-2» (КС 12789/165). Теперь в программе всего один цикл 35-53, а вывод шестнадцатеричной цифры вынесен в отдельную подпрограмму 07-21. Новая программа прекрасно справляется с числами от 0 до 99999999 (и даже больше), при попытке вывода отрицательного числа выдаёт ошибку "Неверный аргумент":

00.ПП   01.05   02.С/П  03.БП  04.00  05.Fx=0 06.22  07.1   08.0    09.-
10.Fx≥0 11.15   12.3    13.9   14.+   15.5    16.8   17.+   18.PPП  19.90
20.25   21.В/О  22.П0   23.Fln 24.1   25.6    26.ПA  27.Fln 28.ПП   29.55
30.ИПA  31.Fxy  32.1    33.ПП  34.57  35.ИП0  36.В↑  37.ИП1 38.%    39.K[x]

40.П6   41.ИП1  42.x    43.-   44.П0  45.ИП6  46.ПП  47.07  48.ИП1  49.ИПA
50.ПП   51.55   52.Fx=0 53.35  54.В/О 55.%    56.9   57./-/ 58.F10x 59.+
60.K[x] 61.П1   62.В/О

  • Post a new comment

    Error

    Your reply will be screened

    Your IP address will be recorded 

  • 32 comments

[info]black_queen152

November 29 2007, 21:39:56 UTC 4 years ago

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

[info]arvi

November 30 2007, 05:44:10 UTC 4 years ago

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

Иногда сидишь целыми днями, смотришь на программу и думаешь, где бы ещё выиграть байтик по мелочам. Думаешь — вот он Грааль. И тут кто-нибудь (может быть до этого даже не обращал на этого человека внимание) заходит с совершенно неожиданной стороны и предлагает намного меньший код. А иногда сам откладываешь написанное в сторону, заходишь с чистого листа. Потом сравниваешь, и порой действительно получается короче.

[info]black_queen152

November 30 2007, 06:54:22 UTC 4 years ago

Эх... вряд ли что у меня получится

[info]arvi

November 30 2007, 19:46:58 UTC 4 years ago

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

[info]black_queen152

November 30 2007, 21:07:34 UTC 4 years ago

Хм... честно говоря, до того, как вы опубликовали свой пример, я пыталась сделать что-то своё. Там было определение максимального N для введённого числа, такого, что данное число не превышает 16^N, затем циклическое вычитание последовательно k*16^(N-1), k*16(N-2), ... , k*16^0. (К пробегал все значения от 0 до 16 и выбиралось максимальное), дальше не дописАла. Стоило ли говорить, каков был размер программы и как я удивилась, увидев такую маленькую у вас. И естественно всё это пошло "ф топку".

Кстати, уже несколько дней как я исправила ошибки в программах "Арифметика", только исправление ещё не выложили на сайте Семико. А сейчас пытаюсь делать "Арифметика 2" - улучшенные версии тех же программ. Надо же доводить до ума всё это.

[info]arvi

November 30 2007, 21:19:27 UTC 4 years ago

Зря сдалась. Лучше доведи до ума, я посмотрю. Во-первых, выскажу своё «фи» с точным указанием шагов, следовательно чуточку лучше начнёшь программировать. Во-вторых, некоторые идеи могут оказаться ценными для последующего поиска Грааля. Порой сокращение кода идёт с той стороны, с которой и не ожидаешь. Поэтому много программ, реализующих разные подходы, иметь полезно.

Это всё можно делать параллельно с сокращением моего кода. Свою программу я короткой не считаю. Ведь программы для ПМК это не просто программы для ПМК, абы какие. Это ещё и как знак качества, старая школа. Куча народу со всех 15 Республик понимает, о чём я сейчас говорю.

[info]black_queen152

December 2 2007, 10:23:19 UTC 4 years ago

АНТИ-ГРААЛЬ!

Я написАла программу [правда, по слегка другому алгоритму, чем ту, которую недописала и стёрла, но тоже собственной выдумки]. И - о чудо! - моя программа:

1) Заработала...
2) Заработала правильно! (тьфу-тьфу-тьфу!)
3) Заняла менее 1 страницы.

Поскольку она самая длинная из всех предложенных, я назвала её "Анти-грааль". Ура! Последнее место в конкурсе на самую короткую программу теперь точно моё ;)))
	0	1	2	3	4	5	6	7	8	9
0	П0	2	0	П4	6	2	П D	ИП 0	1	6
1	%	K[x]	П А	1	6	х	ИП 0	-	/-/	К П 4
2	ИП А	П 0	/-/	F x≥0	07	ИП 4	П В	6	2	П D
3	КИПВ	F x≠0	56	ИП D	2	+	П D	КИПВ	1	-
4	К П В	БП	30	ИП В	2	2	-	F x≥0	55	ИП В
5	1	-	П В	БП 	27	С/П	ИП D	РР П	90	26
6	БП	43	30h		31h		32h		33h	
7	34h		35h		36h		37h		38h	
8	39h		41h		42h		43h		44h	
9	45h		46h							

[info]arvi

December 2 2007, 10:26:54 UTC 4 years ago

Re: АНТИ-ГРААЛЬ!

Поздравляю! Сегодня у меня тяжёлый день. После долгой тишины — в один день сразу три программы от участников Похода, плюс обновление «затравочной» версии. Надеюсь, что успею проверить «Анти-грааль» сегодня же. По крайней мере мне это интересно, ждал варианта Чёрной Королевы.

[info]arvi

December 2 2007, 10:31:26 UTC 4 years ago

Re: АНТИ-ГРААЛЬ!

Да, а какой смысл было на 60 шаге делать переход на 43-й? Ведь можно просто продолжить там программу с 43-го адреса, и два шага на переход было бы сэкономлено.

Также считывать из программы коды символов, конечно, хорошо. Но таблица это целых 16 шагов! В 16 шагов вполне можно уложить вычисление кода символа. Ещё один резерв, чтобы уложиться в полстраницы. ;-)

[info]black_queen152

December 2 2007, 10:41:38 UTC 4 years ago

Re: АНТИ-ГРААЛЬ!

Ух, а я увидев, что пришёл комментарий, испугалась, что программа неправильно заработала (хоть и тщательно проверила код, но всё равно боюсь!)
Спасибо за замечания! На то он и "Анти-грааль", чтобы иметь много лишних шагов :) Когда будет время, я конечно, задумаюсь над его сокращением. Это просто черновик, набросанный минут за 40 - нет времени, нужно делать уроки, заданные в технаре :(
Скоро ведь сессия!

[info]arvi

4 years ago

[info]arbinada

4 years ago

[info]arvi

4 years ago

[info]black_queen152

December 3 2007, 06:59:21 UTC 4 years ago

63 шага

Вот и заработано почётное предпоследнее место, перед "Hex-1".

	0	1	2	3	4	5	6	7	8	9
0	П0	2	0	П4	ИП 0	ИП 0	1	6	%	K[x]
1	П0	1	6	х	-	К П 4	ИП0	/-/	F x≥0	04
2	ИП 4	П В	4	8	П 5	КИПВ	F x≠0	48	КИП5	КИПВ
3	1	-	К П В	БП	25	ИП В	2	2	-	F x≥0
4	47	ИП В	1	-	П В	БП 	22	С/П	ИП 5	5
5	8	-	F x≥0	56	7	+	5	8	+	РР П
6	90	25	БП	35


Никакого плагиатства! Я ещё даже не разбирала чужие программы, только перепечатала их на свой МК-152, чтобы посмотреть, как работают. Даже Hex1 разобрать времени ещё не нашлось с этим технарём дурацким и другими делами житейскими...
Интересно, что на преобразование Антиграаля в программу, по размеру более-менее сравнимую с программами других участников, ушло целых 4 часа - в 6 раз больше, чем на разработку "Антиграаля"! Так что пойду покамест отдохну...
P.S. А интересно, сколько времени другие участники "похода" потратили на разработку и улучшение своих версий?

[info]arvi

November 30 2007, 21:21:34 UTC 4 years ago

Интереснее всего, конечно, сможет ли кто-нибудь сократить шаги 24-37.

[info]arbinada

December 1 2007, 14:08:13 UTC 4 years ago

Пока соорудил перевод в двоичную систему, но для МК-52.
Вывод на индикатор МК-152 должен быть гораздо удобнее, т.е. программа сократится.
Думаю, теперь перейти к шестнадцатеричной будет проще.

Добавил новые забавные возможности форматирования текста на сайте :)

[info]arvi

December 1 2007, 14:15:12 UTC 4 years ago

Жду 16-ричного победителя! Кстати, не обязательно использовать именно R9025. Можно записывать результат в байтах (R1000…R8167, хоть в обратном порядке), а потом выводить через R9027.

[info]arbinada

December 2 2007, 01:54:52 UTC 4 years ago

Готово, только попрошу тебя прогнать тест за отсутствием аггрегата.
http://arbinada.com/pmk/node/39
47 шагов + нет ошибки при целочисленном делении

[info]arvi

December 2 2007, 19:53:31 UTC 4 years ago

Чтож. С указанными исправлениями работает, хотя только в диапазоне от 0 до 16777215 (FFFFFF).

[info]arbinada

December 2 2007, 22:27:15 UTC 4 years ago

Странно, а что мешает бОльшим цифрам? Может, увеличить счетчик в Р0 до 1008 или 1009?

[info]arvi

December 2 2007, 22:58:45 UTC 4 years ago

Да, до 1008 спасает. Когда R0 становится 999, то записать-то в десятичный регистр он запишет. Вот только R9027 фиг с два из него что-нибудь толковое в строчку комментария выведет.

[info]arbinada

December 2 2007, 23:24:33 UTC 4 years ago

Ну, я так и понял, потому сразу после твоего сообщения исправил в тексте до 1009 :) Ведь алгоритм был проверен при 99999999 на МК-52.

[info]arvi

December 3 2007, 00:05:53 UTC 4 years ago

Кстати, 01.3 02.2 03.Fx2 даст 1024 и на один шаг короче. :-))))

[info]arbinada

4 years ago

[info]arvi

4 years ago

[info]a_avl

December 1 2007, 22:26:26 UTC 4 years ago

51 шаг

Вообще то программа была написана еще в четверг, но не было времени ее запостить
Вывод через Р9027

00.П1  01.7    02.П0  03.1   04.6    05.П2  06.1   07.0  08.0     09.7
10.П3  11.ПП   12.23  13.ИП3 14.1    15.+   16.РРП 17.90 18.27    19.К ЭКР
20.С/П 21.БП   22.00  23.Сх  24.КП3  25.ИП1 26.ИП2 27./  28.К[x]  29.П1
30.FBx 31.K{x} 32.ИП2 33.*   34.K[x] 35.1   36.0   37.+  38.Fx>=0 39.47
40.6   41.5    42.+   43.КП3 44.FL0  45.25  46.B/O 47.5  48.8     49.БП
50.42

[info]a_avl

December 1 2007, 22:42:37 UTC 4 years ago

Re: 51 шаг

Прошу прощения, по адресу 37 должно быть 37.-
Возможности программы - целые положительные числа до 99999999

[info]arvi

December 2 2007, 20:28:49 UTC 4 years ago

Re: 51 шаг

Только до 16777215, зато ноль тоже выводит.

[info]arbinada

December 2 2007, 18:25:17 UTC 4 years ago

Кстати

Куда бы мне новоиспеченную кнопочку втиснуть? :)

ПМК - программируемые микрокалькуляторы: МК-152, советские, зарубежные


Код кнопки:
<a href="http://pmk.arbinada.com">
<img src="http://arbinada.com/pmk/system/files/pmk_button.gif" border=0
alt="ПМК - программируемые микрокалькуляторы: МК-152, советские, зарубежные">
</a>

[info]arvi

December 2 2007, 19:16:06 UTC 4 years ago

Re: Кстати

Добавлено.
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…