Automatizza OEIS


26

Qui vediamo molte sfide che richiedono una funzione per creare una sequenza dall'OEIS . Mentre queste sfide sono divertenti, come programmatore vedo un'opportunità per l'automazione.

La tua sfida è quella di creare un programma che prenda l'indice di una sequenza (es. A172141 ) e un numero intero n (es. 7), e tira il valore appropriato dalla pagina web appropriata.

I / O

Come accennato, il programma dovrebbe prendere un indice di sequenza e un certo valore n come input e produrre l'ennesimo termine in quella sequenza. Accetti qualsiasi indice nei file B della sequenza . Se l'indice è maggiore dell'indice più grande elencato nei file B, è possibile generare un'eccezione o generare qualunque cosa si scelga (questi non si trovano nei casi di test). Sono consentiti metodi standard di input e output.

Restrizioni all'uso del Web

Non devi accedere a siti Web diversi da https://oeis.org e http://oeis.org . Ciò include accorciatori di URL, il tuo sito Web personale e questa domanda stessa. Se desideri accedere ad altri siti Web e ritieni che non sia ingiusto permetterti di farlo, puoi lasciare un commento e io arbitro.

punteggio

Questa è una sfida del codice golf, quindi vince il programma con il minor numero di byte utilizzati nel suo codice sorgente. Le scappatoie standard non sono ammesse.

Casi test

Supponendo che la macchina disponga di una corretta connessione Internet e che i server OEIS siano attivi e funzionanti, i seguenti input e output dovrebbero corrispondere.

A172141, 7   -> 980
A173429, 4   -> 276
A190394, 6   -> 16
A002911, 11  -> 960
A052170, 3   -> 24
A060296, 8   -> 3
A178732, 5   -> 27
A000001, 1   -> 1
A000796, 314 -> 3
A001622, 162 -> 8
A002206, -1  -> 1

Mancia

  • Quando si accede ai file B. http://oeis.org/b<A-number>.txtreindirizzerà al file B. corretto.

1
Non mi è chiaro quali indici dobbiamo sostenere. Gli ultimi due casi di test suggeriscono che dovremmo interrogare, ad esempio, oeis.org/A000796/b000796.txtanziché oeis.org/A000796/list. Il fomer è ciò che intendi per B-files ? In tal caso, menzionare l'offset è piuttosto superfluo.
Dennis,

@Dennis Mi dispiace, penso che sia stato il risultato di più modifiche nel tempo. Modificherò per chiarezza,
Wheat Wizard

Penso che questo avrebbe dovuto passare più tempo nella sandbox, perché sono sicuro che non era tua intenzione che le sequenze senza file B non fossero supportate.
Peter Taylor,

1
@PeterTaylor secondo OeisWiki "Se non è stato caricato alcun file b per una sequenza particolare, il server genera un file b contenente esattamente i termini visualizzati, per comodità con strumenti automatizzati." quindi dovrebbe esserci un file B per ogni sequenza. Anche se potresti aver ragione a spostare prematuramente questa sfida dalla sandbox.
Wheat Wizard

1
Bene, ho imparato qualcosa di utile oggi.
Peter Taylor,

Risposte:


11

Bash + coreutils + w3m, 51 45 42 byte

w3m oeis.org/b${1:1}.txt|sed "s/^$2 //p;d"

Grazie a @EamonOlive per giocare a golf con 3 byte!

Esempio di esecuzione

$ bash oeis.sh A172141 7
980

Come funziona

w3m è un browser Web basato su testo che visualizza sia HTML che testo semplice in formato leggibile. Diversamente dall'arricciatura , segue i reindirizzamenti di default (questo è necessario, dal momento cheoeis.org/bxxxxxx.txtreindirizza aoeis.org/Axxxxxx/bxxxxxx.txt), non produce alcun output errato su STDERR e ha un nome di tre byte.

Il comando

w3m oeis.org/b${1:1}.txt

l'URL desiderato, dove ${1:1}è il primo argomento della riga di comando senza il suo primo carattere.

L'output viene reindirizzato al comando

sed "s/^$2 //p;d"

che estrae l'output desiderato. s/^$2 //ptenta di sostituire ^$2 (inizio della riga, seguito dal secondo argomento della riga di comando, seguito da uno spazio) con la stringa vuota. Se la sostituzione ha esito positivo, pstampa il suo risultato. Successivamente, delimina incondizionatamente il motivo per impedire a sed di stampare l'intero input.


È possibile salvare alcuni byte utilizzando oeis.org/b${1:1}.txtinvece dioeis.org/$1/b${1:1}.txt
Procedura guidata per il grano

Heh, normalmente avrei usato sed -n ..., ma sarebbe un personaggio in più.
Vatine,

1
@Vatine Con -n, le doppie virgolette potrebbero essere sostituite con uno spazio di escape, per lo stesso conteggio di byte.
Dennis,

3

Perl, 59 byte

($_,$v)=@ARGV;/./;say`curl oeis.org/$_/b$'.txt`=~/$v (.*)/m

Ha bisogno -M5.010o -Edi correre. Per esempio :

$ cat oeis.pl
($_,$v)=@ARGV;/./;say`curl oeis.org/$_/b$'.txt`=~/$v (.*)/m
$ perl -M5.010 oeis.pl A178932 5 2>&-
27

8 byte salvati grazie alla risposta di @Dennis , rimuovendo http://, come ha fatto lui.


2

CJam, 36 byte

"oeis.org/b"r1>+".txt"+gN%Sf%z~\ra#=

Esempio di esecuzione

$ cjam oeis.cjam <<< 'A172141 7'
980

2

Python 2, 125 118 113 byte

7 12 byte salvati grazie a Lynn

import re,urllib2 as u;lambda x,y:re.findall("(?<=%d ).*"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[0]

Bene, ecco il mio tentativo di risolvere il mio problema. Probabilmente non è ottimale ma penso di aver fatto un lavoro abbastanza decente. Crea una funzione anonima che accetta una stringa e un numero intero come argomenti e restituisce una stringa come risultato o genera un errore se l'indice non è compreso nell'intervallo.

Questo può essere trasformato in un programma completo da 124 byte.

import re,urllib2 as u;print re.findall("(?<=%d ).*"%input(),u.urlopen("http://oeis.org/b%s.txt"%raw_input()[1:]).read())[0]

Questo richiede all'utente l'input. Prima chiedendo l'indice e poi il numero A della sequenza.


Alcuni piccoli salvataggi:import re,urllib2 as u;lambda x,y:re.search("%d (.*)\n"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read()).group(1)
Lynn,

Ed lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]è ancora più corto!
Lynn,

2

Python 3, 153 146 135 byte

7 byte grazie a FryAmTheEggman.

6 byte grazie a Eamon Olive.

5 byte grazie a Rod.

from urllib.request import*
def f(a,n):
 for l in urlopen("http://oeis.org/b%s.txt"%a[1:]):
  p,q=l.split()
  if n==p.decode():return q

Chiamalo così:

print(f("A000796","314"))

Esegui su una macchina in cui l'impostazione predefinita è utf-8.


1
A mio avviso, richiedere una stringa per un argomento e un array di byte per un altro è un formato di input troppo clemente e si dovrebbe semplicemente aggiungere i byte necessari per codificare i byte. Nulla di questa sfida rende ragionevole richiedere byte grezzi come input.
orlp,

Non puoi cambiare A%sin %se poi il primo a[1:]in a?
Lynn,

@orlp Va bene, fatto.
Leaky Nun,

@Lynn Sì, perché apparentemente sono stupido.
Leaky Nun,

1
@FryAmTheEggman Sì e no. L'impostazione predefinita è la locale dell'ambiente.
Dennis,

2

PHP 5.6, 93 92 byte

function f($i,$l){echo explode(' ',file('http://oeis.org/b'.substr($i,1).'.txt')[--$l])[1];}

Questo è piuttosto semplice. Tirare la pagina con file(), ottenere la linea in $line - 1(indice 0), esplodere nello spazio e stampare il secondo elemento dell'array da quello.


2

Nim , 123 115 113 byte

import httpclient,nre,future
(a,n)=>get getContent("http://oeis.org/b"&a[1..^0]&".txt").find re "(?<="&n&r" )\d+"

Questa è un'espressione lambda; per usarlo, deve essere passato come argomento a una procedura di test. Un programma completo che può essere utilizzato per i test è riportato qui:

import httpclient,nre,future
proc test(x: (string, string) -> RegexMatch) = echo x("A172141", "7") # Your input here
test((a,n)=>get getContent("http://oeis.org/b"&a[1..^0]&".txt").find re "(?<="&n&r" )\d+")

Prevede input come due stringhe. Esempio di utilizzo:

$ nim c oeis.nim
$ ./oeis
980

Usiamo httpclient's getContentproc per ottenere il file di b-OEIS, quindi utilizzare una regex per findla linea con l'indice. findrestituisce un Option[RegexMatch], quindi usiamo getper recuperare il valore da Option. echosi stringe automaticamente, quindi lasciamo fuori la stringificazione.


2

Mathematica + OEIS.m , 31

(OEISFunction@ToString@#;#@#2)&

esempio di utilizzo: %[A172141,36]


Mathematica, 85

#2/.Rule@@@Import["http://oeis.org/b"<>#~StringDrop~1<>".txt","Data"]~DeleteCases~{}&

esempio di utilizzo: %["A002206",-1]


2

R, 94 89 byte

t=read.table(paste0("http://oeis.org/b",substring(scan(,""),2),".txt"));t[t$V1==scan(),2]

Utilizzando sprintfinvece di paste0risultati nello stesso byte:

t=read.table(sprintf("http://oeis.org/b%s.txt",substring(scan(,""),2)));t[t$V1==scan(),2]

Cinque byte salvati grazie a plannapus .


Peccato che tu possa libreria (stringr) gratuitamente e usare str_sub per -2 byte ^^
AlexR

@AlexR Non credo di poter importare una libreria gratuitamente ;-)
pajonk

Oops, c'era un errore di battitura nel mio commento - Peccato che non puoi . Era solo un primo pensiero per il golf, perché stringr è uno dei miei pacchetti predefiniti caricati nel .Rprofile di tutti i miei progetti.
AlexR,

1
Non è necessario utilizzare url, argomento filedi read.tablepuò essere l'URL, una stringa di caratteri.
plannapus

@plannapus In effetti, è vero. Grazie!
pajonk,

1

Clojure, 103

#(read-string((re-find(re-pattern(str %2" (\\d+)"))(slurp(str"http://oeis.org/b"(subs % 1)".txt")))1)))

re-findtrova un vettore dei primi gruppi regex di matche, viene usato come una funzione e 1ottiene la stringa in posizione 1. read-stringconverte la stringa in int. Non sono sicuro al 100% se questo regex trova sempre la riga corretta.


1

R, 87 byte

f=function(A,n)(R<-read.table(gsub("A(\\d+)","http://oeis.org/b\\1.txt",A)))[R$V1==n,2]

Crea la stringa URL con regex invece di pasteo sprintf.


0

Node.js + request, 109 byte

x=>n=>require('request')(`http://oeis.org/b${x.slice(1)}.txt`,(a,b)=>console.log(b.body.match(n+` (.+)`)[1]))

Accetta l'ID sequenza e un numero.


0

Julia, 88 byte

x\y=match(Regex("$y (.*)"),readall(Requests.get("http://oeis.org/b$(x[2:end]).txt")))[1]

Giocato a golf con l'aiuto di @Dennis!

Assicurati di aver Requests.jlinstallato prima di eseguire.


0

ListSharp , 266 byte

STRG a=READ[<here>+"\\a.txt"]
ROWS x=ROWSPLIT a BY [","]
STRG a=GETRANGE x[0] FROM [2] TO [a LENGTH]
NUMB y=<c#int.Parse(x[1])c#>
STRG a=DOWNLOAD["http://oeis.org/b"+a+".txt"]
ROWS x=ROWSPLIT a BY [<newline>]
STRG a=GETLINE x [y]
ROWS x=ROWSPLIT a BY [" "]
SHOW=x[1]

È triste quando un linguaggio creato per il web scraping ha bisogno di così tante righe perché le istruzioni di nidificazione in ListSharp sono tabù

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.