module AtCoderFriends::Parser::Modulo
parses problem page and extract modulo values
Constants
- MOD_PATTERN
<var>1,000,000,007</var> (素数)で割った余り
- SECTIONS
rubocop:disable Style/AsciiComments
- VALUE_PATTERN
(998244353) 十億九
Public Instance Methods
normalize_content(s)
click to toggle source
# File lib/at_coder_friends/parser/modulo.rb, line 58 def normalize_content(s) s .tr('0-9A-Za-z', '0-9A-Za-z') .gsub(/[[:space:]]/, ' ') .gsub(%r{[^一-龠_ぁ-ん_ァ-ヶーa-zA-Z0-9 -/:-@\[-`\{-~]}, '') .gsub(/{\\rm\s*mod\s*}\\?/i, 'mod') # {\rm mod} -> mod .gsub(/\\rm\s*{\s*mod\s*}\\?/i, 'mod') # \rm{mod}\ -> mod .gsub(/\\mbox\s*{\s*mod\s*}/i, 'mod') # \mbox{mod} -> mod .gsub(%r{<var>\s*mod\s*</var>}i, 'mod') # <var>mod</var> -> mod end
normalize_value(s)
click to toggle source
# File lib/at_coder_friends/parser/modulo.rb, line 69 def normalize_value(s) s .gsub(/\A([^(=]+)[(=].*\z/, '\1') # 1000000007 (10^9+7), ... =10^9+7 .gsub(/[{}()=\\ ]/, '') end
parse(str)
click to toggle source
# File lib/at_coder_friends/parser/modulo.rb, line 47 def parse(str) str = normalize_content(str) str .scan(MOD_PATTERN) .map(&:compact) .map { |(v)| normalize_value(v) } .reject(&:empty?) .uniq .map { |v| Problem::Constant.new('mod', :mod, v) } end
process(pbm)
click to toggle source
rubocop:enable Style/AsciiComments
# File lib/at_coder_friends/parser/modulo.rb, line 37 def process(pbm) mods = [] SECTIONS.any? do |section| next unless (html = pbm.sections[section]&.html) !(mods = parse(html)).empty? end pbm.constants += mods end