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