Forth
http://fforum.winglion.ru/

Вывод последовательности чисел.
http://fforum.winglion.ru/viewtopic.php?f=19&t=2759
Страница 1 из 2

Автор:  chess [ Вт сен 13, 2011 14:07 ]
Заголовок сообщения:  Вывод последовательности чисел.

Даны два произвольных десятичных целых числа одинаковой разрядности, таких, что все цифры первого меньше соответствующих цифр второго.
Как пример 12 и 35. 1 меньше 3 и 2 меньше 5. Вывести последовательность чисел начиная с меньшего до большего.
Например в случае 12 35 выведется последовательность 12 13 14 15 22 23 24 25 32 33 34 35.
Решение дать в виде:
Код:
: seq ( n1 n2 -- ) .. ;

Автор:  WingLion [ Вт сен 13, 2011 18:18 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

Решение:
Код:
: seq 2DROP 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . ;


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

Автор:  Hishnik [ Вт сен 13, 2011 21:00 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

Код:
: seq
  DUP 10 / 1 + 2 PICK 10 / DO
    DUP 10 MOD 1 + 2 PICK 10 MOD DO
      J 10 * I + .
    LOOP
  LOOP
  2DROP 
;

Автор:  chess [ Вт сен 13, 2011 21:21 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

WingLion писал(а):
Так как в условии не указано зависимости выходной последовательности от входных чисел

Зависимость указана примером, однозначно описывающим, что надо вывести взависимости
от входных данных. Или вам все-таки реально непонятно? :o
Ну ладно, тогда будет больше писанины, однозначность появится, а понятность вряд-ли:
Даны два входных десятичных числа, в каждом из которых одинаковое количество цифр.
Цифры первого числа в каждой позиции меньше цифр второго числа в соответствующих позициях. Вывести все числа начиная с меньшего входного числа до большего входного числа, при условии что цифры в каждой позиции выводимых чисел принимают значения от цифры в соответствующей позиции меньшего входного числа до цифры в соответствующей позиции большего входного числа. Числа в выводимой последовательности идут нарастающим порядком, то есть каждое последующее больше предыдущего.

Автор:  chess [ Вт сен 13, 2011 22:39 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

Хищник писал(а):
: seq
DUP 10 / 1 + 2 PICK 10 / DO
DUP 10 MOD 1 + 2 PICK 10 MOD DO
J 10 * I + .
LOOP
LOOP
2DROP
;

решение неверное.

Автор:  Hishnik [ Вт сен 13, 2011 23:34 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

chess писал(а):
решение неверное.

А какие из выведенных чисел неверны?

Автор:  chess [ Ср сен 14, 2011 08:19 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

Хищник писал(а):
А какие из выведенных чисел неверны?

Многие. :)
Я даже не запускал ваше решение. Видно сразу - алгоритм некорректный.
В нем вы не учитываете, что разрядность входных чисел может быть произвольной.
А так, пожалуйста:
Код:
123 234 seq
лог
Код:
123 124 133 134 143 144 153 154 163 164 173 174 183 184 193 194 203 204 213 214 223 224 233 234
Ok

Автор:  вопрос [ Ср сен 14, 2011 11:30 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

для чисел произвольной разрядности возможно регшение только в виде строки цифр

Автор:  chess [ Ср сен 14, 2011 12:22 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

вопрос писал(а):
для чисел произвольной разрядности возможно регшение только в виде строки цифр

В принципе, да. Но для чисел меньше чем 2 в 32-ой можно обойтись и без строки цифр. Это естественное ограничение
для 32-х разрядной форт-системы, поэтому такие решения тоже засчитываются.

Автор:  Hishnik [ Ср сен 14, 2011 13:38 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

chess писал(а):
Я даже не запускал ваше решение. Видно сразу - алгоритм некорректный.
В нем вы не учитываете, что разрядность входных чисел может быть произвольной.

Аа, ну да. Я почему-то решил, что числа строго двузначные.

Автор:  WingLion [ Ср сен 14, 2011 20:03 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

chess писал(а):
от цифры в соответствующей позиции меньшего входного числа до цифры в соответствующей позиции большего входного числа.


Вот этого в первоначальном условии просто нет и НЕ ВИДНО абсолютно.

Автор:  chess [ Чт сен 15, 2011 09:29 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

Код:
: seq ( n1 n2 -- )
0 a! 0 c! \ служебные переменные
10 b] 10 e] 10 t] \ место в памяти для цифр нач. кон. и текущего чисел
q>s( is a is c 10 0 DO c 10 /MOD is c c IF I a + C! ELSE I a + C! I LEAVE THEN LOOP ) \ процедура - цифры числа положить в память
e q>s 1+ d!  \ цифры кон. числа положить в память
b q>s DROP   \ цифры нач. числа положить в память
b t d MOVE   \ текущему значению цифр числа в памяти присвоить цифры нач. числа
.t( 0 d 1- DO I t + C@ 1 .0 -1 +LOOP SPACE ) \ процедура - вывод текущего числа
next( 0 is c \ с - перенос                   \ процедура - из цифр текущего числа сформировать цифры следующего текущего числа
d 0 DO I 0= IF t C@ e C@ = IF b C@ t C! 1 is c ELSE t C@ 1+ t C! 0 is c LEAVE THEN
            ELSE c IF I t + C@ I e + C@ =
                      IF I b + C@ I t + C! 1 is c ELSE I t + C@ 1+ I t + C! 0 is c THEN
                   ELSE LEAVE
                   THEN
            THEN
    LOOP )
BEGIN .t next t d e d COMPARE 0= UNTIL .t ;

STARTLOG
123
456 seq

лог
Код:
123 124 125 126 133 134 135 136 143 144 145 146 153 154 155 156 223 224 225 226 233 234 235 236 243 244 245 246 253 254 255 256 323 324 325 326 333 334 335 336 343 344 345 346 353 354 355 356 423 424 425 426 433 434 435 436 443 444 445 446 453 454 455 456
Ok

Ps.
Задачка решается корректно и при условии, что любое количество цифр начального и конечного числа совпадают.

Автор:  chess [ Чт сен 15, 2011 12:21 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

chess писал(а):
Задачка решается корректно и при условии, что любое количество цифр начального и конечного числа совпадают.

Кроме этого начальное число можно задавать в свободном формате.
Все отсутствующие старшие цифры будут восприниматься как нули. И выводится числа будут с ведущими нулями.
Например:
Код:
0
111 seq

лог.
Код:
000 001 010 011 100 101 110 111

ps. Впрочем ведущие нули можно убрать изменив процедуру вывода.

Автор:  Ethereal [ Сб сен 17, 2011 18:41 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

Вот, решение интуитивного понимания той задачи, которую chess имел ввиду :

: SEQ ( u1 u2 -- )
2DUP 1+ SWAP
DO
2DUP I
BEGIN
DUP 10 MOD 2OVER 10 MOD >R 10 MOD OVER > R> ROT < OR INVERT
WHILE
10 / ROT 10 / ROT 10 / ROT
DUP 0=
UNTIL
I .
THEN
DROP 2DROP
LOOP
2DROP
;

Автор:  Ethereal [ Сб сен 17, 2011 18:59 ]
Заголовок сообщения:  Re: Вывод последовательности чисел.

Лог :

123 456 SEQ
123 124 125 126 133 134 135 136 143 144 145 146 153 154 155 156 223 224 225 226 233 234 235 236 243 244 245 246 253 254 255 256 323 324 325 326 333 334 335 336 343 344 345 346 353 354 355 356 423 424 425 426 433 434 435 436 443 444 445 446 453 454 455 456 Ok

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/