GitHub - gcomneno/oeis-probe: Tool CLI Python per riconoscere sequenze di interi archiviate su OEIS, con ricerca offline su stripped/names e cache SQLite (original) (raw)
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 🐒)
Install
python -m venv .venv source .venv/bin/activate pip install -e ".[dev]"
Quick start
probe online
oeis-probe "1,2,3,6,11,23,47,106"
salva JSON
oeis-probe "1,2,3,6,11,23,47,106" --json-out oeis_hits.json
fetch completo per A-number
oeis-probe fetch A000045
Offline mode (stripped / names)
Questo repo NON include i dump OEIS. Se vuoi usare la modalità offline, scarica i dataset in./artifacts/oeis/ (ignorata da git) con:
Poi 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-online
Nota: se distribuisci i dump OEIS devi rispettare CC BY-SA 4.0 + termini/EULA OEIS (attribution e condizioni).
Offline index (SQLite) — molto più veloce del dump scan
Se fai tante probe (o vuoi velocità), conviene creare un indice SQLite locale che generacandidati velocemente e poi applica il match vero sui termini.
1) Crea l’indice (una tantum)
Output di default:
./artifacts/oeis/oeis_index.sqlite
2) Probe offline usando l’indice
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
Suggerimento: puoi regolare la “larghezza” dei candidati con:
--index-max-candidates(default: 400)--index-grams(default: 3)
Performance (offline): scan vs index
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/null
Nota 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à.
🧪 Esempi d’uso (laboratorio)
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].
1) Fibonacci “pulita” (match perfetto)
oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144" --max-hits 5
Output atteso: A000045 in cima.
2) Ranking: strict vs prefer-early
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
3) Disambiguazione vera: “aggiungi un termine oltre la divergenza”
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-early
Se una variante diverge prima, sparirà (o scenderà) appena includi il termine “killer”.
4) Recamán “rotta” (un termine sbagliato): quasi-hit + spiegazione
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-top
Esempio: 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-top
Output extra atteso (indicativo):
first mismatch at query[11] (#12) -> got 99; expected 22 ...
6) Van Eck (esempio “non banale”)
oeis-probe "0,0,1,0,2,0,2,2,1,6,0,5,0,2,6,5" --max-hits 5 --rank prefer-early
7) Look-and-say (termini “grossi”)
oeis-probe "1,11,21,1211,111221,312211,13112221" --max-hits 5 --rank prefer-early
8) Fetch di una sequenza per A-number (JSON)
Utile per:
- ispezionare
data - confrontare varianti
- trovare il punto di divergenza tra due sequenze
9) Salva risultati in JSON (per pipeline/script)
oeis-probe "2,3,5,7,11,13,17,19,23,29,31,37" --max-hits 5 --json-out /tmp/hits.json
10) Modalità offline (stripped / names)
Se 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 5
Oppure 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
Suggerimenti pratici
- 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.
Respectful usage
- usa pochi hit e cache (default ok)
- non fare spam di query automatiche senza backoff
- offline consigliato per batch/ricerche pesanti
License
Codice: MIT (vedi LICENSE). Dati OEIS: licenze e termini sul sito OEIS.