#!/usr/bin/env bash
# Written by Erez Binyamin (github.com/ErezBinyamin)
# Search for an integer sequence
oeis() {
local URL='https://oeis.org'
local TMP=/tmp/oeis
local DOC=/tmp/oeis/doc.html
mkdir -p $TMP
# Search sequence by ID
if [ $# -eq 1 ]
then
# Generate URL
[[ ${1:0:1} == 'A' ]] && ID=${1:1} || ID=${1}
ID=$(bc <<< "$ID")
ID="A$(printf '%06d' ${ID})"
URL+="/${ID}"
curl $URL 2>/dev/null > $DOC
# ID
printf "ID: ${ID}\n"
# Description
grep -A 1 '
' $DOC \
| sed '/ | /d; /--/d; s/^[ \t]*//; s/<[^>]*>//g;' \
| sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</.*, .*[0-9]' $DOC \
| sed 's/<[^>]*>//g' \
| grep -v '[a-z]' \
| grep -v ':'
printf "\n"
# Code
if grep -q 'MAPLE' $DOC
then
GREP_REGEX='MAPLE.*CROSSREFS'
grep -q 'PROG' $DOC && GREP_REGEX='MAPLE.*PROG'
grep -q 'MATHEMATICA' $DOC && GREP_REGEX='MAPLE.*MATHEMATICA'
cat $DOC \
| tr '\n' '`' \
| grep -o "${GREP_REGEX}" \
| tr '`' '\n' \
| sed 's/^[ \t]*//; s/<[^>]*>//g; /^\s*$/d;' \
| sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</]*>//g; /^\s*$/d;' \
| sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</]*>//g; /^\s*$/d;' \
| sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</ ${TMP}/lang
langs=("Axiom" "MAGMA" "PARI" "Python" "Sage" "Haskell" "Julia" "GAP" "Scala")
for L in ${langs[@]}
do
echo "foo" | pygmentize -l ${L,,} &>/dev/null && PYG="${L,,}" || PYG="c"
if grep -q "(${L})" $DOC
then
awk -v tgt="${L}" -F'[()]' '/^\(/{f=(tgt==$2)} f' ${TMP}/lang \
| pygmentize -f terminal256 -g -P style=monokai -l ${PYG}
printf "\n"
fi
done
# Search unknown sequence
else
# Build URL
URL+="/search?q=signed%3A$(echo $@ | tr ' ' ',')"
curl $URL 2>/dev/null > $DOC
# Sequence IDs
grep -o '=id:.*&' $DOC \
| sed 's/=id://; s/&//' > $TMP/id
# Descriptions
grep -A 1 ' | ' $DOC \
| sed '/ | /d; /--/d; s/^[ \t]*//; s/<[^>]*>//g' \
| sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</ $TMP/nam
# Sequences
grep -o '.*' $DOC \
| sed 's/<[^>]*>//g' > $TMP/seq
# Print data for all
readarray -t ID < $TMP/id
readarray -t NAM < $TMP/nam
readarray -t SEQ < $TMP/seq
for i in ${!ID[@]}
do
printf "${ID[$i]}: ${NAM[$i]}\n"
echo ${SEQ[$i]}
printf "\n"
done
fi
}
oeis $@
|