Skip navigation.

проФорт

Форт и всё такое

Python Challenge 0-5

,

Решение The Python Challenge на Форте, а именно с использованием SPF 4.18 для Windows.

Задачки простые, но затрагивают много разных практических аспектов, как то: http, картинки, рисование, архивы, итп. Для решения надо использовать библиотеки из devel, т.е. получается хорошая иллюстрация существующих наработок для СП-Форта.

Внимание, spoiler! Далее будут приведены решения задачек!

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

Итак, приступим.

Задачка 0

Вычислить 2 в степени 38.

Решение

Соображаем что 238 больше чем 232 поэтому одним CELL'ом не обойдёмся (система 32-битная, CELL = 4 байта). Но 238 меньше чем 264 и поэтому двойных значений хватит.


\ 2**38

:NONAME 1 S>D 38 0 DO D2* LOOP ; EXECUTE D.





Задачка 1

Требуется выполнить простое преобразование над текстом, сдвинуть все латинские символы на 2 вправо в алфавите (моноалфавитная подстановка - простейшая разновидность, известная также как шифр Цезаря). Т.е. a переходит в c, а z в b.

Решение


\ K -> M
\ O -> Q
\ E -> G

REQUIRE BOUNDS ~ygrek/lib/string.f

: each
DUP [CHAR] a < IF EXIT THEN
DUP [CHAR] z > IF EXIT THEN
[CHAR] a -
2 +
[CHAR] z [CHAR] a - 1+ MOD
[CHAR] a + ;

: decode BOUNDS DO I C@ each EMIT LOOP ;

: string S" g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj." ;
CR string decode

CR S" map" decode




Задачка 2

Дан текст (смотрите html код страницы с заданием), требуется найти в нём редкие символы.

Решение

Заданный текст выделим в отдельный файл 2.in. Сначала соберём информацию и посмотрим что имеется ввиду под редким. Это делают collect и stats. Видим что редкие встречаются по одному разу. Пользуясь этим критерием - пробегаем текст ещё раз и получаем искомое слово-решение.


\ find rare characters in the mess below: see 2.in

REQUIRE FILE ~ac/lib/str5.f
REQUIRE BOUNDS ~ygrek/lib/string.f
REQUIRE replace-str- ~pinka/samples/2005/lib/replace-str.f

: vector CREATE CELLS ALLOT DOES> SWAP CELLS + ;
256 vector chars

: FILE-TEXT
FILE " {s}"
DUP " {CRLF}" "" replace-str- \ get rid of the unnedeed line endings
STR@ ;

: collect
0 chars 256 CELLS ERASE
S" 2.in" FILE-TEXT BOUNDS DO I C@ chars 1+! LOOP ;

: stats
255 0 DO
I chars @ IF CR I EMIT 2 SPACES I chars @ . THEN
LOOP ;

: solve
CR
S" 2.in" FILE-TEXT BOUNDS DO
I C@ chars @ 1 = IF I C@ EMIT THEN
LOOP ;

collect
stats
solve





Задачка 3

Опять задан текст, а критерий поиска такой - последовательность из любых трёх заглавных символов, потом один прописной символ, и потом ещё три произвольных заглавных символа.

Решение

Воспользуемся простым конечным автоматом. Переменная counter используется для уменьшения числа состояний с 8 до 2-х. Схема автомата очень простая - путь успеха выделен жирным, при любом несоответствии идёт откат в начальное состояние, т.е. можно было обойтись простым набором IF'ов :



Не забудем удалить переводы строк из исходного текста.


\ One small letter, surrounded by EXACTLY three
\ big bodyguards on each of its sides.

REQUIRE FILE ~ac/lib/str5.f
REQUIRE BOUNDS ~ygrek/lib/string.f
REQUIRE replace-str- ~pinka/samples/2005/lib/replace-str.f
REQUIRE состояние ~profit/lib/chartable.f

состояние s1
состояние s2

VARIABLE counter
0 VALUE ch

s1
все: counter 0! ;
CHAR a CHAR z диапазон: counter @ 3 = IF символ TO ch s2 THEN counter 0! ;
CHAR A CHAR Z диапазон: counter 1+! ;

s2
все: counter @ 3 = IF ch EMIT THEN counter 0! s1 ;
CHAR A CHAR Z диапазон: counter 1+! ;

: main
1 TO размер-символа
s1
S" 3.in"
\ load-file 2DUP S>STR DUP
FILE " {s}"
DUP " {CRLF}" "" replace-str-
STR@ BOUNDS DO I C@ выполнить-один-раз LOOP
закончить-обработку ;

main





Задачка 4

Требуется прокликать по ссылкам, выдирая адрес назначения из полученной на очередном шаге страницы. Воспользуемся словом GET-FILE из библиотеки ~ac/lib/lin/curl/curl.f. Потребуется libcurl (скачать). Положите curl.dll в системный каталог или рядом с spf.exe.

Решение


\ Follow the chain

REQUIRE GET-FILE ~ac/lib/lin/curl/curl.f
REQUIRE /STRING lib/include/string.f

: url ( n -- s )
" http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={n}" ;

: NUMBER ( a u -- n -1 | 0 )
0 0 2SWAP >NUMBER NIP IF 2DROP FALSE ELSE D>S TRUE THEN ;

: prompt S" and the next nothing is " ;

: parse ( a u -- n )
prompt SEARCH 0= IF 2DROP 0 EXIT THEN
prompt NIP /STRING
NUMBER 0= IF 0 EXIT THEN ;

: next
BEGIN
DUP CR ." GO TO " .
url
>R R@ STR@ GET-FILE R> STRFREE
>R
R@ STR@
2DUP CR TYPE
parse
R> STRFREE
DUP
0=
UNTIL
DROP
CR ." STOP" ;

: go 12345 next ;

\ spf 4.f 12345 next >> 4.log





Задачка 5

Для решения этой задачи требуется PICKLE - модуль сериализации в Питоне Реализовывать его функционал - это слишком - пришлось подсмотреть ответ. google it :-(

FAQ:
Do I have to use Python to solve the riddles?
Most of the riddles can be solved with any language.
Currently, only riddles 5 and 23 require Python.
The hints in all riddles are geared towards Python programmers.



Продолжение следует :smile:

Эвересты и Марианские жёлобы ФортаСтроки в Форте и в СПФ в частности

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies