Automatisieren Sie den OEIS

26

Wir sehen hier viele Herausforderungen, die nach einer Funktion zum Erstellen einer Sequenz aus dem OEIS verlangen . Während diese Herausforderungen Spaß machen, sehe ich als Programmierer eine Chance für die Automatisierung.

Ihre Herausforderung besteht darin, ein Programm zu erstellen , das den Index einer Sequenz (z. B. A172141 ) und eine Ganzzahl n (z. B. 7) verwendet und den entsprechenden Wert von der entsprechenden Webseite abruft.

I / O

Wie bereits erwähnt, sollte Ihr Programm einen Sequenzindex und einen Wert n als Eingabe und Ausgabe des n-ten Terms in dieser Sequenz verwenden. Sie akzeptieren jeden Index in den B-Dateien der Sequenz . Wenn der Index größer ist als der größte in den B-Dateien aufgeführte Index, können Sie eine Ausnahme auslösen oder eine beliebige Ausgabe erstellen (dies ist nicht in den Testfällen der Fall). Standardmethoden für Ein- und Ausgabe sind zulässig.

Einschränkungen bei der Webnutzung

Sie sollten nicht auf andere Websites als https://oeis.org und http://oeis.org zugreifen . Dazu gehören URL-Kürzungen, Ihre eigene persönliche Website und diese Frage selbst. Wenn Sie auf eine andere Website zugreifen möchten und der Meinung sind, dass dies nicht unfair ist, können Sie einen Kommentar hinterlassen, und ich werde entscheiden.

Wertung

Dies ist eine Code-Golf-Herausforderung, sodass das Programm mit den wenigsten in seinem Quellcode verwendeten Bytes gewinnt. Standardlücken sind nicht zulässig.

Testfälle

Angenommen, Ihr Computer verfügt über eine ordnungsgemäße Internetverbindung und die OEIS-Server sind in Betrieb. Die folgenden Ein- und Ausgänge sollten übereinstimmen.

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

Spitze

  • Beim Zugriff auf die B-Dateien http://oeis.org/b<A-number>.txtwird auf die richtige B-Datei umgeleitet.
Weizen-Assistent
quelle
1
Mir ist nicht klar, welche Indizes wir unterstützen müssen. Die letzten beiden Testfälle deuten darauf hin, dass wir zB oeis.org/A000796/b000796.txteher abfragen sollten als oeis.org/A000796/list. Ist der Ehemann das, was Sie mit B-Dateien meinen ? In diesem Fall ist die Angabe des Offsets eher überflüssig.
Dennis
@ Tennis Sorry, ich denke, das war das Ergebnis mehrerer Bearbeitungen im Laufe der Zeit. Ich werde aus Gründen der Klarheit bearbeiten,
Weizen-Assistent
Ich denke, das hätte mehr Zeit in der Sandbox verbringen sollen, denn ich bin sicher, dass es nicht deine Absicht war, Sequenzen ohne B-Dateien nicht zu unterstützen.
Peter Taylor
1
@PeterTaylor laut OeisWiki "Wenn für eine bestimmte Sequenz keine B-Datei hochgeladen wurde, generiert der Server eine B-Datei mit genau den angezeigten Begriffen, um die Arbeit mit automatisierten Tools zu vereinfachen." es sollte also für jede Sequenz eine B-Datei geben. Obwohl Sie vielleicht Recht haben, wenn Sie diese Herausforderung vorzeitig aus dem Sandkasten entfernen.
Weizen-Zauberer
1
Nun, ich habe heute etwas Nützliches gelernt.
Peter Taylor

Antworten:

11

Bash + Coreutils + W3M, 51 45 42 Byte

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

Vielen Dank an @EamonOlive für das Golfen mit 3 Bytes!

Beispiellauf

$ bash oeis.sh A172141 7
980

Wie es funktioniert

w3m ist ein textbasierter Webbrowser, der sowohl HTML als auch Nur-Text in lesbarem Format anzeigt. nicht wie Curl folgt es standardmäßig Redirects (dies ist erforderlich, da oeis.org/bxxxxxx.txtRedirects to oeis.org/Axxxxxx/bxxxxxx.txt), erzeugt keine Streuausgabe an STDERR und hat einen Drei-Byte-Namen.

Der Befehl

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

Die gewünschte URL, wobei ${1:1}das erste Befehlszeilenargument ohne das erste Zeichen ist.

Die Ausgabe wird an den Befehl weitergeleitet

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

das extrahiert die gewünschte Ausgabe. s/^$2 //pversucht, ^$2 die leere Zeichenfolge (Zeilenanfang, gefolgt vom zweiten Befehlszeilenargument, gefolgt von einem Leerzeichen) zu ersetzen . Wenn die Ersetzung erfolgreich ist, wird pdas Ergebnis gedruckt. Anschließend wird ddas Muster unbedingt gelöscht, um zu verhindern, dass sed die gesamte Eingabe druckt.

Dennis
quelle
Sie können ein paar Bytes einsparen, indem Sie oeis.org/b${1:1}.txtanstelle vonoeis.org/$1/b${1:1}.txt
Wheat Wizard
Heh, ich hätte normalerweise verwendet sed -n ..., aber das wäre noch ein Charakter.
Vatine
1
@Vatine Mit -nkönnen die doppelten Anführungszeichen durch ein Leerzeichen ersetzt werden, bei gleicher Bytezahl.
Dennis
3

Perl, 59 Bytes

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

Muss -M5.010oder -Elaufen. Zum Beispiel :

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

8 Bytes dank @Dennis Antwort gespart , indem entfernt wurde http://, wie er es tat.

Dada
quelle
2

CJam, 36 Bytes

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

Beispiellauf

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

Python 2, 125 118 113 Bytes

7 12 Bytes gespart dank 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]

Nun, hier ist mein Problem. Es ist wahrscheinlich suboptimal, aber ich denke, ich habe einen ziemlich anständigen Job gemacht. Es erstellt eine anonyme Funktion, die eine Zeichenfolge und eine Ganzzahl als Argumente verwendet und als Ergebnis eine Zeichenfolge zurückgibt oder einen Fehler ausgibt, wenn der Index außerhalb des Bereichs liegt.

Dies kann zu einem 124-Byte-Vollprogramm gemacht werden.

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

Dies fordert den Benutzer zur Eingabe auf. Fragen Sie zuerst nach dem Index und dann nach der A-Nummer der Sequenz.

Weizen-Assistent
quelle
Einige winzige Paraden: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
Und lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]ist noch kürzer!
Lynn
2

Python 3, 153 146 135 Bytes

7 Bytes dank FryAmTheEggman.

6 Bytes dank Eamon Olive.

5 Bytes dank 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

Nenne es so:

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

Führen Sie das Programm auf einem Computer aus, dessen Standardwert utf-8 ist.

Undichte Nonne
quelle
1
Meiner Meinung nach ist das Erfordernis eines Strings für ein Argument und eines Bytearrays für ein anderes Eingabeformat zu mild, und Sie sollten nur die erforderlichen Bytes hinzufügen, um selbst in Bytes zu codieren. Nichts an dieser Herausforderung macht es vernünftig, Rohbytes als Eingabe zu fordern.
Orlp
Können Sie sich nicht ändern A%szu %sund dann die erste a[1:]zu a?
Lynn
@orlp Okay, fertig.
Undichte Nonne
@Lynn Ja, weil ich anscheinend dumm bin.
Undichte Nonne
1
@FryAmTheEggman Ja und nein. Die Standardeinstellung ist das Gebietsschema der Umgebung.
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];}

Dieser ist ziemlich direkt. Ziehen Sie die Seite mit file(), erhalten Sie die Linie bei $line - 1(0-Index), explodieren Sie im Leerzeichen und drucken Sie das zweite Array-Element aus.

Samsquanch
quelle
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+"

Dies ist ein Lambda-Ausdruck; Um es zu verwenden, muss es als Argument an eine Testprozedur übergeben werden. Ein vollständiges Programm, das zum Testen verwendet werden kann, finden Sie hier:

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

Erwartet die Eingabe als zwei Zeichenfolgen. Anwendungsbeispiel:

$ nim c oeis.nim
$ ./oeis
980

Wir verwenden httpclient's getContentproc, um die OEIS-B-Datei abzurufen, und verwenden dann einen regulären Ausdruck für finddie Zeile mit dem Index. findgibt ein zurück Option[RegexMatch], also verwenden wir get, um den Wert von der abzurufen Option. echoautomatisch stringifiziert, so dass wir Stringifizierung weglassen.

Kupfer
quelle
2

Mathematica + OEIS.m , 31

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

Beispielverwendung: %[A172141,36]


Mathematica, 85

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

Beispielverwendung: %["A002206",-1]

dbanet
quelle
2

R, 94 89 Bytes

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

Verwenden sprintfanstelle von paste0Ergebnissen in demselben bytecount:

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

Fünf Bytes gespart dank Plannapus .

pajonk
quelle
Schade, Sie können Bibliothek (stringr) kostenlos und verwenden Sie str_sub für -2 Bytes ^^
AlexR
@AlexR Ich glaube nicht, dass ich eine Bibliothek kostenlos importieren kann
;-)
Hoppla, in meinem Kommentar war ein Tippfehler - Schade, dass du das nicht kannst . Es war nur ein erster Gedanke für das Golfen, denn stringr ist eines meiner Standardpakete, die in das .R-Profil aller meiner Projekte geladen wurden.
AlexR
1
Sie müssen nicht verwenden url, Argument filevon read.tablekann die URL als Zeichenkette sein.
Plannapus
@plannapus Ja, das stimmt. Vielen Dank!
Pajonk
1

Clojure, 103

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

re-findFindet einen Vektor der Regex-Gruppen der ersten Matche, wird als Funktion verwendet und 1die Zeichenfolge an der Position abgerufen 1. read-stringwandelt string in int um Ich bin nicht 100% sicher, ob dieser Regex immer die richtige Zeile findet.

NikoNyrh
quelle
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]

Erstellen Sie die URL-Zeichenfolge mit regulären Ausdrücken anstelle von paste odersprintf .

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

Nimmt die Sequenz ID und eine Nummer.

Mama Fun Roll
quelle
0

Julia, 88 Bytes

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

Golfen mit Hilfe von @Dennis!

Stellen Sie sicher, dass Sie Requests.jlvor dem Ausführen installiert haben.

Mama Fun Roll
quelle
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 ist traurig, wenn eine Sprache für das Scrapen im Web so viele Zeilen benötigt, weil das Verschachteln von Anweisungen in ListSharp tabu ist

downrep_nation
quelle