Automatize o OEIS

26

Vemos muitos desafios aqui, solicitando uma função para criar uma sequência a partir do OEIS . Embora esses desafios sejam divertidos, como programador, vejo uma oportunidade para automação.

Seu desafio é criar um programa que pegue o índice de uma sequência (por exemplo, A172141 ) e algum número inteiro n (por exemplo, 7) e extraia o valor apropriado da página da web apropriada.

I / O

Como mencionado, seu programa deve usar um índice de sequência e algum valor n como entrada e saída do enésimo termo nessa sequência. Você aceita qualquer índice nos arquivos B da sequência . Se o índice for maior que o maior índice listado nos arquivos B, você poderá lançar uma exceção ou emitir o que quiser (estes não estão nos casos de teste). Métodos padrão de entrada e saída são permitidos.

Restrições ao uso da web

Você não deve acessar sites que não sejam https://oeis.org e http://oeis.org . Isso inclui encurtadores de URL, seu próprio site pessoal e essa pergunta em si. Se você deseja acessar algum outro site e acredita que não é injusto permitir isso, deixe um comentário e eu arbitrarei.

Pontuação

Este é um desafio de código de golfe, para que o programa com o mínimo de bytes usado em seu código-fonte ganhe. As brechas padrão não são permitidas.

Casos de teste

Supondo que sua máquina tenha conexão adequada à Internet e que os servidores OEIS estejam funcionando, as seguintes entradas e saídas devem corresponder.

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

Gorjeta

  • Ao acessar os arquivos B, ele http://oeis.org/b<A-number>.txtserá redirecionado para o arquivo B apropriado.
Assistente de Trigo
fonte
1
Não está claro para mim quais índices temos de apoiar. Os dois últimos casos de teste sugerem que devemos consultar, por exemplo, em oeis.org/A000796/b000796.txtvez de oeis.org/A000796/list. É o que você quer dizer com arquivos B ? Nesse caso, mencionar o deslocamento é supérfluo.
214 Dennis
@ Dennis Desculpe, acho que foi o resultado de várias edições ao longo do tempo. Vou editar para maior clareza:
Wheat Wizard
Acho que isso deveria ter passado mais tempo na sandbox, porque tenho certeza de que não era sua intenção que sequências sem arquivos B não fossem suportadas.
Peter Taylor
1
@PeterTaylor de acordo com a OeisWiki "Se nenhum arquivo b foi carregado para uma sequência específica, o servidor gera um arquivo b contendo exatamente os termos exibidos, por conveniência, com ferramentas automatizadas". portanto, deve haver um arquivo B para cada sequência. Embora você possa estar certo ao mover prematuramente esse desafio da caixa de areia.
Wheat Wizard
1
Bem, eu aprendi algo útil hoje.
Peter Taylor

Respostas:

11

Bash + coreutils + w3m, 51 45 42 bytes

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

Graças a @EamonOlive por jogar fora 3 bytes!

Exemplo de execução

$ bash oeis.sh A172141 7
980

Como funciona

O w3m é um navegador da Web baseado em texto, que exibe HTML e texto sem formatação em formato legível. Ao contrário do curl , ele segue os redirecionamentos por padrão (isso é obrigatório, pois éoeis.org/bxxxxxx.txtredirecionado paraoeis.org/Axxxxxx/bxxxxxx.txt), não produz saída dispersa para STDERR e tem um nome de três bytes.

O comando

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

o URL desejado, onde ${1:1}é o primeiro argumento da linha de comandos sem seu primeiro caractere.

A saída é canalizada para o comando

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

que extrai a saída desejada. s/^$2 //ptenta substituir ^$2 (início da linha, seguido pelo segundo argumento da linha de comandos, seguido por um espaço) pela sequência vazia. Se a substituição for bem sucedida, pimprime o resultado. Depois, dexclui incondicionalmente o padrão para impedir que o sed imprima toda a entrada.

Dennis
fonte
Você pode economizar alguns bytes usando oeis.org/b${1:1}.txtem vez deoeis.org/$1/b${1:1}.txt
Assistente de trigo
Heh, eu normalmente usaria sed -n ..., mas isso seria mais um personagem.
Vatine 11/08/16
1
@Vatine With -n, as aspas duplas podem ser substituídas por um espaço de escape, para a mesma contagem de bytes.
Dennis
3

Perl, 59 bytes

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

Precisa -M5.010ou -Epara correr. Por exemplo :

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

Economizou 8 bytes graças à resposta @Dennis , removendo http://, como ele fez.

dada
fonte
2

CJam, 36 bytes

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

Exemplo de execução

$ cjam oeis.cjam <<< 'A172141 7'
980
Dennis
fonte
2

Python 2, 125 118 113 bytes

7 12 bytes salvos graças ao 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]

Bem, aqui está a minha chance no meu próprio problema. É provavelmente subótimo, mas acho que fiz um trabalho bastante decente. Ele cria uma função anônima que pega uma sequência e um número inteiro como argumentos e retorna uma sequência como resultado ou gera um erro se o índice estiver fora do intervalo.

Isso pode ser transformado em um programa completo de 124 bytes.

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

Isso solicita a entrada do usuário. Primeiro, solicite o índice e depois o número A da sequência.

Assistente de Trigo
fonte
Algumas pequenas poupanças: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
E lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]é mais curto ainda!
Lynn
2

Python 3, 153 146 135 bytes

7 bytes graças a FryAmTheEggman.

6 bytes graças a Eamon Olive.

5 bytes graças 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

Chame assim:

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

Execute em uma máquina em que o padrão é utf-8.

Freira Furada
fonte
1
Na minha opinião, exigir uma string para um argumento e uma matriz de bytes para outro é um formato de entrada muito branda, e você deve adicionar os bytes necessários para codificar em bytes. Nada sobre esse desafio torna razoável exigir bytes brutos como entrada.
orlp
Você não pode mudar A%spara %se depois o primeiro a[1:]para a?
Lynn
@ orlp Tudo bem, pronto.
Leaky Nun
@ Lynn Sim, porque aparentemente eu sou estúpido.
Leaky Nun
1
@FryAmTheEggman Sim e não. O padrão é o código de idioma do ambiente.
Dennis
2

PHP 5.6, 93 92 bytes

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

Este é bem direto. Puxe a página com file(), obtenha a linha em $line - 1(0-index), exploda no espaço e imprima o segundo elemento da matriz a partir dele.

Samsquanch
fonte
2

Nim , 123 115 113 bytes

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

Esta é uma expressão lambda; Para usá-lo, ele deve ser passado como argumento para um procedimento de teste. Um programa completo que pode ser usado para teste é fornecido aqui:

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+")

Espera entrada como duas strings. Exemplo de uso:

$ nim c oeis.nim
$ ./oeis
980

Usamos httpcliento getContentproc para obter o arquivo b do OEIS, depois usamos um regex para finda linha com o índice. findretorna um Option[RegexMatch], então usamos getpara recuperar o valor de Option. echoautomaticamente, por isso deixamos de fora a especificação.

Cobre
fonte
2

Mathematica + OEIS.m , 31

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

exemplo de uso: %[A172141,36]


Mathematica, 85

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

exemplo de uso: %["A002206",-1]

dbanet
fonte
2

R, 94 89 bytes

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

Usando em sprintfvez de paste0resultados no mesmo bytecount:

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

Cinco bytes salvos graças ao plannapus .

pajonk
fonte
Pena que você pode biblioteca (stringr) para str_sub gratuito e uso de -2 bytes ^^
AlexR
@AlexR Eu não acho que eu posso importar uma biblioteca de graça ;-)
Pajonk
Ops, ocorreu um erro de digitação no meu comentário - Pena que você não pode . Foi apenas uma idéia inicial para o golfe, porque stringr é um dos meus pacotes padrão carregados no perfil .R de todos os meus projetos.
AlexR
1
Você não precisa usar url, o argumento filede read.tablepode ser a URL como uma sequência de caracteres.
plannapus
@ plannapus Na verdade, está certo. Obrigado!
Pajonk
1

Clojure, 103

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

re-findencontra um vetor dos grupos regex do primeiro matche, é usado como uma função e 1coloca a string na posição 1. read-stringconverte string em int. Não tenho 100% de certeza se esse regex sempre encontra a linha correta.

NikoNyrh
fonte
1

R, 87 bytes

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

Crie a cadeia de URLs com expressões regulares em vez de pasteou sprintf.

plannapus
fonte
0

Node.js + request, 109 bytes

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

Leva o ID da sequência e um número.

Mama Fun Roll
fonte
0

Julia, 88 bytes

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

Jogou golfe com a ajuda de @Dennis!

Verifique se você Requests.jlinstalou antes de executar.

Mama Fun Roll
fonte
0

ListSharp , 266 bytes

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 uma linguagem criada para a raspagem da Web precisa de tantas linhas porque as instruções de aninhamento no ListSharp são um tabu

downrep_nation
fonte