Tool CLI Python per riconoscere sequenze di interi archiviate su OEIS, con ricerca offline su stripped/names e cache SQLite. Ideale come “oracolo esterno” da laboratorio per validare le sequenze generate da algoritmi, regressioni, e riconoscimento rapido di pattern noti.
Sequence fingerprinting contro OEIS:
- online via
&fmt=json(JSON API) - offline via file
stripped(.gz)+ opzionalenames(.gz) - cache SQLite per non martellare OEIS (e per non far bannare la scimmia 🐒)
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"oeis-probe "1,2,3,6,11,23,47,106"
oeis-probe "1,2,3,6,11,23,47,106" --json-out oeis_hits.json
oeis-probe fetch A000045
Questo repo NON include i dump OEIS. Se vuoi usare la modalità offline, scarica i dataset in
./artifacts/oeis/ (ignorata da git) con:
make oeis-dataPoi puoi fare una probe offline “classica” via scan del dump:
oeis-probe "1,2,3,6,11,23,47,106" \
--offline-stripped ./artifacts/oeis/stripped.gz \
--offline-names ./artifacts/oeis/names.gz \
--no-onlineNota: se distribuisci i dump OEIS devi rispettare CC BY-SA 4.0 + termini/EULA OEIS (attribution e condizioni).
Se fai tante probe (o vuoi velocità), conviene creare un indice SQLite locale che genera candidati velocemente e poi applica il match vero sui termini.
make indexOutput di default:
./artifacts/oeis/oeis_index.sqlite
oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144,233" \
--offline-index ./artifacts/oeis/oeis_index.sqlite \
--offline-names ./artifacts/oeis/names.gz \
--no-onlineSuggerimento: puoi regolare la “larghezza” dei candidati con:
--index-max-candidates(default: 400)--index-grams(default: 3)
Indicazione pratica: lo scan su stripped.gz è semplice ma tende ad essere più lento; l’indice SQLite
accelera parecchio sulle probe ripetute perché evita di “macinare” tutto il dump ogni volta.
Misura rapida (usa /usr/bin/time):
/usr/bin/time -f "scan: %E" oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144,233" \
--offline-stripped ./artifacts/oeis/stripped.gz \
--offline-names ./artifacts/oeis/names.gz \
--no-online > /dev/null
/usr/bin/time -f "index: %E" oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144,233" \
--offline-index ./artifacts/oeis/oeis_index.sqlite \
--offline-names ./artifacts/oeis/names.gz \
--no-online > /dev/nullNota onesta: l’indice è un candidate generator. Può proporre candidati “in più”, che poi il match consecutivo scarta. È voluto: si paga un po’ di rumore per guadagnare velocità.
oeis-probe cerca corrispondenze tra una sequenza di interi e le sequenze OEIS, usando:
- online: OEIS JSON API (default)
- offline (opzionale): file
stripped(.gz)enames(.gz)scaricabili da OEIS
Nota: il tool valuta la qualità del match cercando la miglior corrispondenza consecutiva (match_len) dentro i termini OEIS e calcola uno score in [0..1].
oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144" --max-hits 5Output atteso: A000045 in cima.
Quando tanti risultati hanno score=1.00, puoi preferire quelli che matchano subito dall’inizio (at più piccolo):
oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144" --max-hits 5 --rank prefer-early--rank strict(default): ordina per score e match_len--rank prefer-early: a parità di score/match_len preferisceatpiù piccolo
A volte una sequenza “cugina” coincide su un prefisso lungo (es. alcune varianti di “dying rabbits” possono imitare Fibonacci per molti termini).
La soluzione più semplice è allungare la query finché la cugina diverge:
oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144,233,377" --max-hits 5 --rank prefer-earlySe una variante diverge prima, sparirà (o scenderà) appena includi il termine “killer”.
oeis-probe "0,1,3,6,2,7,13,20,12,21,11,99,10,23,9,24,8,25" \
--max-hits 5 --rank prefer-early \
--relax-online --min-match-len 10 \
--explain-topEsempio: corruzione “in mezzo” + spiegazione del mismatch:
oeis-probe "0,1,3,6,2,7,13,20,12,21,11,99,10,23,9,24,8,25" \
--max-hits 5 --rank prefer-early \
--relax-online --min-match-len 10 \
--explain-topOutput extra atteso (indicativo):
first mismatch at query[11] (#12) -> got 99; expected 22 ...
oeis-probe "0,0,1,0,2,0,2,2,1,6,0,5,0,2,6,5" --max-hits 5 --rank prefer-earlyoeis-probe "1,11,21,1211,111221,312211,13112221" --max-hits 5 --rank prefer-earlyoeis-probe fetch A000045Utile per:
- ispezionare
data - confrontare varianti
- trovare il punto di divergenza tra due sequenze
oeis-probe "2,3,5,7,11,13,17,19,23,29,31,37" --max-hits 5 --json-out /tmp/hits.jsonSe hai scaricato stripped(.gz) e opzionalmente names(.gz):
oeis-probe "1,4,9,16,25,36,49,64,81,100" \
--offline-stripped /path/to/stripped.gz \
--offline-names /path/to/names.gz \
--no-online \
--max-hits 5Oppure online+offline insieme (merge dei risultati):
oeis-probe "1,4,9,16,25,36,49,64,81,100" \
--offline-stripped /path/to/stripped.gz \
--offline-names /path/to/names.gz \
--max-hits 5- Se ti escono troppi
1.00, usa--rank prefer-early. - Se ottieni “No hits” su sequenze mutate/rumorose, usa
--relax-onlinee alza--min-match-len. --explain-topè il “martello”: ti dice dove hai rotto la sequenza rispetto al miglior candidato.
- usa pochi hit e cache (default ok)
- non fare spam di query automatiche senza backoff
- offline consigliato per batch/ricerche pesanti
Codice: MIT (vedi LICENSE). Dati OEIS: licenze e termini sul sito OEIS.