Automatizar el OEIS


26

Vemos muchos desafíos aquí pidiendo una función para crear una secuencia desde el OEIS . Si bien estos desafíos son divertidos, como programador veo una oportunidad para la automatización.

Su desafío es crear un programa que tome el índice de una secuencia (por ejemplo, A172141 ) y algún número entero n (por ejemplo, 7), y extraiga el valor apropiado de la página web correspondiente.

I / O

Como se mencionó, su programa debe tomar un índice de secuencia y algún valor n como entrada y salida del enésimo término en esa secuencia. Acepta cualquier índice en los archivos B de la secuencia . Si el índice es mayor que el índice más grande listado en los archivos B, puede lanzar una excepción o generar lo que elija (estos no están en los casos de prueba). Se permiten métodos estándar de entrada y salida.

Restricciones en el uso de la web.

No debe acceder a ningún sitio web que no sea https://oeis.org y http://oeis.org . Esto incluye acortadores de URL, su propio sitio web personal y esta pregunta en sí. Si desea acceder a otro sitio web y cree que no es injusto permitirle hacerlo, puede dejar un comentario y arbitraré.

Tanteo

Este es un desafío de código de golf, por lo que gana el programa con la menor cantidad de bytes utilizados en su código fuente. Las lagunas estándar no están permitidas.

Casos de prueba

Suponiendo que su máquina tenga una conexión a Internet adecuada y que los servidores OEIS estén funcionando, las siguientes entradas y salidas deberían 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

Propina

  • Al acceder a los archivos B http://oeis.org/b<A-number>.txtse redirigirá al archivo B adecuado.

1
No me queda claro qué índices tenemos que apoyar. Los dos últimos casos de prueba sugieren que deberíamos consultar, por ejemplo, en oeis.org/A000796/b000796.txtlugar de oeis.org/A000796/list. ¿Es el fomer lo que quieres decir con archivos B ? En ese caso, mencionar el desplazamiento es bastante superfluo.
Dennis

@Dennis Lo siento, creo que fue el resultado de varias ediciones a lo largo del tiempo. Voy a editar para mayor claridad,
Wheat Wizard

Creo que esto debería haber pasado más tiempo en la caja de arena, porque estoy seguro de que no fue su intención que las secuencias sin archivos B no sean compatibles.
Peter Taylor

1
@PeterTaylor según OeisWiki "Si no se ha cargado un archivo b para una secuencia particular, el servidor genera un archivo b que contiene exactamente los términos que se muestran, para mayor comodidad con herramientas automatizadas". entonces debería haber un archivo B para cada secuencia. Aunque puede que tengas razón acerca de mover prematuramente este desafío desde el sandbox.
Wheat Wizard

1
Bueno, he aprendido algo útil hoy.
Peter Taylor

Respuestas:


11

Bash + coreutils + w3m, 51 45 42 bytes

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

¡Gracias a @EamonOlive por jugar golf en 3 bytes!

Ejecución de ejemplo

$ bash oeis.sh A172141 7
980

Cómo funciona

w3m es un navegador web basado en texto, que muestra tanto HTML como texto sin formato en formato legible. A diferencia de curl , sigue las redirecciones de forma predeterminada (esto es obligatorio, ya queoeis.org/bxxxxxx.txtredirige aoeis.org/Axxxxxx/bxxxxxx.txt), no produce ninguna salida perdida a STDERR y tiene un nombre de tres bytes.

El comando

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

la URL deseada, donde ${1:1}es el primer argumento de línea de comandos sin su primer carácter.

La salida se canaliza al comando

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

que extrae el resultado deseado. s/^$2 //pintenta reemplazar ^$2 (inicio de línea, seguido del segundo argumento de la línea de comandos, seguido de un espacio) con la cadena vacía. Si la sustitución es exitosa, pimprime su resultado. Luego, delimina incondicionalmente el patrón para evitar que sed imprima toda la entrada.


Puede guardar algunos bytes utilizando en oeis.org/b${1:1}.txtlugar deoeis.org/$1/b${1:1}.txt
Wheat Wizard

Je, normalmente lo hubiera usado sed -n ..., pero ese sería un personaje más.
Vatine

1
@Vatine With -n, las comillas dobles podrían reemplazarse con un espacio escapado, para el mismo recuento de bytes.
Dennis

3

Perl, 59 bytes

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

Necesita -M5.010o -Epara correr. Por ejemplo :

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

Ahorró 8 bytes gracias a la respuesta de @Dennis , al eliminar http://, como lo hizo.


2

CJam, 36 bytes

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

Ejecución de ejemplo

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

2

Python 2, 125 118 113 bytes

7 12 bytes guardados gracias 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]

Bueno, aquí está mi ir a mi propio problema. Es probable que sea subóptimo, pero creo que hice un trabajo bastante decente. Crea una función anónima que toma una cadena y un entero como argumentos y devuelve una cadena como resultado o arroja un error si el índice está fuera de rango.

Esto se puede convertir en un 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]

Esto solicita al usuario la entrada. Primero preguntando por el índice y luego el número A de la secuencia.


Algunos pequeños ahorros: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

¡Y lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]aún es más corto!
Lynn

2

Python 3, 153 146 135 bytes

7 bytes gracias a FryAmTheEggman.

6 bytes gracias a Eamon Olive.

5 bytes gracias 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

Llámalo así:

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

Ejecutar en una máquina donde el valor predeterminado es utf-8.


1
En mi opinión, requerir una cadena para un argumento, y una matriz de bytes para otro es un formato de entrada demasiado indulgente, y solo debe agregar los bytes necesarios para codificar en bytes usted mismo. Nada de este desafío hace que sea razonable requerir bytes sin procesar como entrada.
orlp

¿No puedes cambiar A%sa %sy luego el primero a[1:]a a?
Lynn

@orlp Muy bien, listo.
Leaky Nun

@ Lynn Sí, porque aparentemente soy estúpido.
Leaky Nun

1
@FryAmTheEggman Sí y no. El valor predeterminado es la configuración regional del entorno.
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 es bastante sencillo. Tire de la página con file(), obtenga la línea en $line - 1(índice 0), explote en el espacio e imprima el segundo elemento de matriz a partir de eso.


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 es una expresión lambda; para usarlo, se debe pasar como argumento a un procedimiento de prueba. Aquí se ofrece un programa completo que se puede utilizar para realizar pruebas:

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 dos cadenas. Ejemplo de uso:

$ nim c oeis.nim
$ ./oeis
980

Utilizamos httpclient's getContentproc para obtener la columna b OEIS, a continuación, utilizar una expresión regular a findla línea con el índice. finddevuelve un Option[RegexMatch], por lo que utilizamos getpara recuperar el valor de Option. echostringifica automáticamente, por lo que dejamos fuera la stringificación.


2

Mathematica + OEIS.m , 31

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

ejemplo de uso: %[A172141,36]


Mathematica, 85

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

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


2

R, 94 89 bytes

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

Usando en sprintflugar de paste0resultados en el mismo bytecount:

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

Cinco bytes guardados gracias a plannapus .


Lástima que puedas usar la biblioteca (stringr) de forma gratuita y usar str_sub por -2 bytes ^^
AlexR

@AlexR No creo que pueda importar una biblioteca gratis ;-)
pajonk

Vaya, hubo un error tipográfico en mi comentario. Lástima que no puedas . Fue solo un primer pensamiento para el golf, porque stringr es uno de mis paquetes predeterminados cargados en el .Rprofile de todos mis proyectos.
AlexR

1
No necesita usar url, el argumento filede read.tablepuede ser la URL como una cadena de caracteres.
plannapus

@plannapus De hecho, es cierto. ¡Gracias!
pajonk

1

Clojure, 103

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

re-findencuentra un vector de los grupos de expresiones regulares del primer matche, se usa como una función y 1coloca la cadena en su posición 1. read-stringconvierte cadena a int. No estoy 100% seguro de si esta expresión regular siempre encuentra la fila correcta.


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]

Construya la cadena URL con expresiones regulares en lugar de pasteo sprintf.


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]))

Toma la secuencia ID y un número.


0

Julia, 88 bytes

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

¡Golfé con la ayuda de @Dennis!

Asegúrese de haberlo Requests.jlinstalado antes de ejecutarlo.


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]

Es triste cuando un lenguaje creado para el raspado web necesita tantas líneas porque las declaraciones de anidamiento en ListSharp son tabú

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.