#!/usr/bin/ruby # Daniel "Trizen" Șuteu # Date: 11 January 2021 # Edit: 07 June 2022 # https://github.com/trizen # Check and use formulas defined in terms of OEIS sequences. # usage: # sidef oeis.isf 'formula' [from=1] [to=10] # Examples: # sidef oeis.sf 'A033676(n)^2 + A033677(n)^2' # first 10 terms # sidef oeis.sf 'A033676(n)^2 + A033677(n)^2' 5 # 5-th term # sidef oeis.sf 'A033676(n)^2 + A033677(n)^2' 5 20 # terms 5..20 # Sum example: # sidef oeis.sf 'sum(0..n, {|k| A048994(n, k) * A048993(n+k, n) })' local Num!PREC = 4096 include OEIS func eval_formula(formula, n = nil) { Sidef.new.execute_code((defined(n) ? "var n = #{n};" : "") + formula) } func process_input(formula, indices) { formula.gsub!(/\^/, '**') \ .gsub!(/\b\d+\Kn\b/, '*n') \ .gsub!(/\xC2/, '') \ .gsub!(/\bxor\b/i, '^') \ .gsub!(/\bor\b/i, '|') \ .gsub!(/\band\b/i, '&') \ .gsub!(/\bnot\b/i, '~') \ .gsub!(/ = /, ' == ') if (formula =~ /\bn\b/) { var terms = [] for n in (indices) { terms << (eval_formula(formula, n) \\ do { say $@; break }) } say terms.join(", ") return true } say eval_formula(formula) return true } ARGV || do { STDERR << "usage: #{File(__MAIN__).basename} [formula] [from=1] [to=10]\n" Sys.exit(1) } var formula = ARGV[0] var indices = 1..10 if (ARGV.len == 2) { indices = [Num(ARGV[1])] } elsif (ARGV.len == 3) { indices = Num(ARGV[1])..Num(ARGV[2]) } elsif (ARGV.len > 3) { indices = ARGV.ft(1).map{ Num(.gsub(/,/, '')) } } process_input(formula, indices)