Automatisez l'OEIS


26

Nous voyons beaucoup de défis ici demandant une fonction pour créer une séquence à partir de l' OEIS . Bien que ces défis soient amusants, en tant que programmeur, je vois une opportunité d'automatisation.

Votre défi consiste à créer un programme qui prend l'index d'une séquence (par exemple A172141 ) et un entier n (par exemple 7), et extrait la valeur appropriée de la page Web appropriée.

E / S

Comme mentionné, votre programme doit prendre un index de séquence et une valeur n en entrée et sortir le nième terme de cette séquence. Vous acceptez n'importe quel index dans les fichiers B de la séquence . Si l'index est supérieur au plus grand index répertorié dans les fichiers B, vous pouvez lever une exception ou afficher ce que vous choisissez (ce ne sont pas dans les cas de test). Les méthodes standard d'entrée et de sortie sont autorisées.

Restrictions sur l'utilisation du Web

Vous ne devez pas accéder à des sites Web autres que https://oeis.org et http://oeis.org . Cela inclut les raccourcisseurs d'URL, votre propre site Web personnel et cette question elle-même. Si vous souhaitez accéder à un autre site Web et que vous pensez qu'il n'est pas injuste de vous autoriser à le faire, vous pouvez laisser un commentaire et j'arbitrerai.

Notation

Il s'agit d'un défi de golf de code, donc le programme avec le moins d'octets utilisés dans son code source gagne. Les failles standard ne sont pas autorisées.

Cas de test

En supposant que votre machine dispose d'une connexion Internet appropriée et que les serveurs OEIS sont en place et exécutent les entrées et sorties suivantes doivent correspondre.

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

Pointe

  • Lorsque vous accédez aux fichiers B, vous http://oeis.org/b<A-number>.txtserez redirigé vers le fichier B approprié.

1
Je ne sais pas exactement quels indices nous devons soutenir. Les deux derniers cas de test suggèrent que nous devrions interroger, par exemple, oeis.org/A000796/b000796.txtplutôt que oeis.org/A000796/list. Est-ce que le fomer ce que vous entendez par fichiers B ? Dans ce cas, mentionner le décalage est plutôt superflu.
Dennis

@Dennis Désolé, je pense que c'était le résultat de plusieurs modifications au fil du temps. Je vais modifier pour plus de clarté,
Wheat Wizard

Je pense que cela aurait dû passer plus de temps dans le bac à sable, car je suis sûr que ce n'était pas votre intention que les séquences sans fichiers B ne soient pas prises en charge.
Peter Taylor

1
@PeterTaylor selon OeisWiki "Si aucun fichier b n'a été téléchargé pour une séquence particulière, le serveur génère un fichier b contenant exactement les termes affichés, pour plus de commodité avec des outils automatisés." il devrait donc y avoir un fichier B pour chaque séquence. Bien que vous ayez peut-être raison de déplacer prématurément ce défi du bac à sable.
Wheat Wizard

1
Eh bien, j'ai appris quelque chose d'utile aujourd'hui.
Peter Taylor

Réponses:


11

Bash + coreutils + w3m, 51 45 42 octets

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

Merci à @EamonOlive d'avoir joué au golf sur 3 octets!

Exemple d'exécution

$ bash oeis.sh A172141 7
980

Comment ça marche

w3m est un navigateur Web basé sur du texte, qui affiche à la fois du HTML et du texte brut dans un format lisible. Contrairement à curl , il suit les redirections par défaut (cela est obligatoire, car iloeis.org/bxxxxxx.txtredirige versoeis.org/Axxxxxx/bxxxxxx.txt), ne produit aucune sortie parasite vers STDERR et a un nom à trois octets.

La commande

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

l'URL souhaitée, où ${1:1}est le premier argument de ligne de commande sans son premier caractère.

La sortie est dirigée vers la commande

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

qui extrait la sortie souhaitée. s/^$2 //ptente de remplacer ^$2 (début de ligne, suivi du deuxième argument de ligne de commande, suivi d'un espace) par la chaîne vide. Si la substitution réussit, pimprime son résultat. Ensuite, dsupprime inconditionnellement le motif pour empêcher sed d'imprimer la totalité de l'entrée.


Vous pouvez économiser quelques octets en utilisant à la oeis.org/b${1:1}.txtplace deoeis.org/$1/b${1:1}.txt
Wheat Wizard

Heh, j'aurais normalement utilisé sed -n ..., mais ce serait un personnage de plus.
Vatine

1
@Vatine Avec -n, les guillemets doubles pourraient être remplacés par un espace échappé, pour le même nombre d'octets.
Dennis

3

Perl, 59 octets

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

Besoin -M5.010ou -Ecourir. Par exemple :

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

8 octets enregistrés grâce à la réponse de @Dennis , en supprimant http://, comme il l'a fait.


2

CJam, 36 octets

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

Exemple d'exécution

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

2

Python 2, 125 118 113 octets

7 12 octets enregistrés grâce à 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]

Eh bien, voici mon propre problème. C'est probablement sous-optimal mais je pense que j'ai fait un travail assez décent. Il crée une fonction anonyme qui prend une chaîne et un entier comme arguments et renvoie une chaîne comme résultat ou renvoie une erreur si l'index est hors limites.

Cela peut être transformé en un programme complet de 124 octets.

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

Cela invite l'utilisateur à entrer. D'abord demander l'index puis le numéro A de la séquence.


Quelques petits arrêts: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

Et lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]est encore plus court!
Lynn

2

Python 3, 153 146 135 octets

7 octets grâce à FryAmTheEggman.

6 octets grâce à Eamon Olive.

5 octets grâce à 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

Appelez ça comme ceci:

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

Exécutez sur une machine où la valeur par défaut est utf-8.


1
À mon avis, exiger une chaîne pour un argument et un tableau d'octets pour un autre est un format d'entrée trop indulgent, et vous devez simplement ajouter les octets nécessaires pour encoder vous-même en octets. Rien dans ce défi ne rend raisonnable d'exiger des octets bruts en entrée.
orlp

Vous ne pouvez pas passer A%sà %spuis le premier a[1:]à a?
Lynn

@orlp D'accord, c'est fait.
Leaky Nun

@Lynn Oui, car apparemment je suis stupide.
Leaky Nun

1
@FryAmTheEggman Oui et non. La valeur par défaut est l'environnement local de l'environnement.
Dennis

2

PHP 5.6, 93 92 octets

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

Celui-ci est assez simple. Tirez la page avec file(), obtenez la ligne à $line - 1(0-index), explosez sur l'espace et imprimez le deuxième élément du tableau à partir de cela.


2

Nim , 123 115 113 octets

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

Il s'agit d'une expression lambda; pour l'utiliser, il doit être passé en argument à une procédure de test. Un programme complet qui peut être utilisé pour les tests est donné ici:

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

Attend l'entrée comme deux chaînes. Exemple d'utilisation:

$ nim c oeis.nim
$ ./oeis
980

Nous utilisons httpclientde » getContentla proc pour obtenir le b fichier OEIS, utilisez une expression régulière à findla ligne avec l'indice. findrenvoie un Option[RegexMatch], nous utilisons donc getpour récupérer la valeur à partir du Option. echostringifie automatiquement, donc nous laissons de côté la stringification.


2

Mathematica + OEIS.m , 31

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

exemple d'utilisation: %[A172141,36]


Mathematica, 85

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

exemple d'utilisation: %["A002206",-1]


2

R, 94 89 octets

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

Utilisation sprintfau lieu de paste0résultats dans le même nombre d'octets:

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

Cinq octets économisés grâce à plannapus .


Dommage que vous puissiez bibliothèque (stringr) gratuitement et utiliser str_sub pour -2 octets ^^
AlexR

@AlexR Je ne pense pas pouvoir importer une bibliothèque gratuitement ;-)
pajonk

Oups, il y avait une faute de frappe dans mon commentaire - Dommage que vous ne puissiez pas . Ce n'était qu'une première pensée pour le golf, car stringr est l'un de mes packages par défaut chargés dans le .Rprofile de tous mes projets.
AlexR

1
Vous n'avez pas besoin d'utiliser url, l'argument filede read.tablepeut être l'URL sous forme de chaîne de caractères.
plannapus

@plannapus En effet, c'est vrai. Merci!
pajonk

1

Clojure, 103

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

re-findtrouve un vecteur des groupes d'expressions rationnelles du premier match, il est utilisé comme une fonction et 1obtient la chaîne en position 1. read-stringconvertit la chaîne en int. Je ne suis pas sûr à 100% si cette expression régulière trouve toujours la bonne ligne.


1

R, 87 octets

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

Créez la chaîne d'URL avec des expressions rationnelles au lieu de pasteou sprintf.


0

Node.js + request, 109 octets

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

Prend l'ID de séquence et un nombre.


0

Julia, 88 octets

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

Golfé avec l'aide de @Dennis!

Assurez-vous que vous avez Requests.jlinstallé avant d'exécuter.


0

ListSharp , 266 octets

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]

C'est triste quand un langage fait pour le web scraping a besoin de tant de lignes car l'imbrication des instructions dans ListSharp est tabou

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.