ZABAVY 2006 SELDECR

Заметка из ABAPEDIA.

Перейти к: навигация, поиск

eltliace racsitric cchich

Содержание

ZABAVY_2006_SELDECR

Программа поиска заданной последовательности в шифрованном табличном наборе.

На экране выбора пользователь вводит символьную строку длиной от 20 до 40 символов, состоящую из заглавных ASCII-символов и пробелов (см. C_SENT_CHARS). В прозрачной таблице ZABAPEDIA_SELDEC содержится порядка 2х миллионов записей, строки таблицы упорядочены по ключу ID.

/*Необходимо найти все вхождения введённой строки (только большие буквы латинского алфавита и пробелы) в текстовом поле таблицы, причём строка может начинаться на одной записи а заканчиваться на другой произвольной (переноситься), при этом переносится не менее 5 символов. */

Программа должна определить координаты всех регистронезависимых вхождений зашифрованной кодом Цезаря строки, найденных в текстовом поле SEQUENCE таблицы, и заполнить внутреннюю таблицу GT_RESULTS. Координатами является ключ таблицы GT_RESULTS-ID и смещение первого символа подстроки относительно начала текстового поля таблицы GT_RESULTS-POS. Зашифрованная строка может быть расположена как в одной строке таблицы, так и разбита между строками (начинаться в конце одной строки, а оканчиваться в начале следующей по ключу ID); при этом первые и последние 5 символов искомой строки не разрываются.

Код Цезаря — циклический код, в котором каждая исходная буква латинского алфавита сдвинута на определённое число символов (но не превращается в пробел или иной символ, сдвиг только внутри C_SENT_CHARS+1(26)). Так, при сдвиге 3 буква A переходит в D, а Z — в C.

В тестовой таблице есть как нужные цели (с искомым сдвигом), так и отвлекающие приманки (разные другие сдвиги). Критерий определения, какой сдвиг правилен, будет опубликован 2 апреля, пока у вас есть время для написания пробного варианта который по фразе будет находить все её вхождения с любым сдвигом.

Критерии оценки:

  • минимум ошибок 1 рода (найдены неверные позиции) и минимум 2 рода (не найдены верные);
  • минимум затраченного времени;
  • изящность и красота алгоритма (только если вы сопроводите работу комментариями и пояснениями, например блок-схемой или иным способом).

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

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

  1. были или нет ошибки генерации/активации;
  2. число ошибок 1 рода и число ошибок 2 рода (когда будет опубликован критерий проверки, какой сдвиг правилен).

Таблица с данными ZABAPEDIA_SELDEC

На рисунках видно определение таблицы и её технические параметры. Дополнительных индексов (помимо первичного ключа) нет. thumb|Определение таблицы

thumb|Технические параметры

Программа и соглашения о возврате результатов

Вы должны скопировать программу ZABAVY_2006_SELDECR_000 в свою собственную (вместо 000 вам будет сообщён личный код, запросить который можно либо до разработок либо после высылки первого варианта).

Запрещается вносить изменения в инклюды ZABAVY_2006_SELDECR_data, ZABAVY_2006_SELDECR_sscr, ZABAVY_2006_SELDECR_form -- весь ваш код должен быть внутри ZABAVY_2006_SELDECR_000 и только после комментария с началом места для собственного кода.

ZABAVY_2006_SELDECR_000

  1.  
  2. report ZABAVY_2006_SELDECR_000 .
  3.  
  4. * -- стандартная часть (не изменять)
  5. include: ZABAVY_2006_SELDECR_data
  6. , ZABAVY_2006_SELDECR_sscr
  7. , ZABAVY_2006_SELDECR_form
  8. .
  9.  
  10. start-of-selection .
  11. perform check_sentence .
  12. perform initialization .
  13. perform build .
  14.  
  15. end-of-selection .
  16. perform end .
  17.  
  18. * -- отсюда идёт место для вашего кода
  19.  
  20. form build .
  21.  
  22. endform .

ZABAVY_2006_SELDECR_data

  1. tables: ZABAPEDIA_SELDEC .
  2.  
  3. constants: C_MIN type i value 32
  4. , C_MAX type i value 126 " минимальный и максимальный символы соответственно
  5. , C_CHARSET_LENGTH type int2 value 95 " длина алфавита
  6. , C_SENT_MIN type i value 65 " минимальный код символа (не пробела) во фразе
  7. , C_SENT_MAX type i value 90 " максимальный код символа (не пробела) во фразе
  8. , C_SENT_CHARS(27) value ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  9. .
  10.  
  11. types: begin of ts_results
  12. , id type ZABAPEDIA_SELDEC-id
  13. , offset type i
  14. , end of ts_results
  15. .
  16.  
  17. data: gt_results type sorted table of ts_results with unique key id offset with header line
  18. , g_starttime type f " время перед запуском
  19. , g_endtime type f " время после выполнения
  20. , g_charset(C_CHARSET_LENGTH)
  21. .
  22.  
  23. *

ZABAVY_2006_SELDECR_sscr

  1. parameters: sentence(40) obligatory .

ZABAVY_2006_SELDECR_form

  1.  
  2. form check_sentence .
  3. data: sentence_length type i .
  4. sentence_length = strlen( sentence ) .
  5. if not ( sentence_length >= 20 and sentence co C_SENT_CHARS ) .
  6. message e005(zabapedia) .
  7. endif .
  8. endform .
  9.  
  10. form initialization .
  11. * начало, замеряем время
  12. clear: gt_results[], g_charset .
  13. data: i type i, x type x, xs type xstring, rs type string .
  14. do C_CHARSET_LENGTH times .
  15. i = sy-index - 1 .
  16. x = sy-index + C_MIN - 1 .
  17. xs = x .
  18. CALL FUNCTION 'NLS_STRING_CONVERT_TO_SYS'
  19. EXPORTING
  20. LANG_USED = sy-langu
  21. SOURCE = xs
  22. IMPORTING
  23. RESULT = rs
  24. .
  25. g_charset+i(1) = rs .
  26. enddo .
  27.  
  28. write: / g_charset .
  29. get run time field g_starttime .
  30. endform .
  31.  
  32. form end .
  33. * конец, замеряем время
  34. get run time field g_endtime .
  35. data: g_repid type sy-repid .
  36. g_repid = sy-repid .
  37.  
  38. data: dt type i .
  39. dt = g_endtime - g_starttime .
  40. write: / 'Работа окончена, время работы=', dt .
  41. * perform external_procedure tables gt_rezults[] using g_repid dt .
  42. endform .

Пример запуска и ответы на вопросы

Содержимое g_charset

После запуска приведённой выше программы в g_charset попадает строка [ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~] (выделено цветом, первый символ -- пробел), см. рисунок -- должно сходиться.

Изображение:ZABAVY_2006_SELDECR_000_zapusk.png

Текущее состояние и список присланных работ

Категория:Zабавы-2006

Личные инструменты
Популярные категории
Прочее