OEISを自動化する


26

ここでは、OEISからシーケンスを作成する機能を求める多くの課題があります。これらの課題は楽しいものですが、プログラマーとして私は自動化の機会を見ています。

課題は、シーケンスのインデックス(例:A172141)と整数n(例:7)を取得し、適切なWebページから適切な値を取得するプログラムを作成することです。

I / O

前述のように、プログラムは入力としてシーケンスインデックスと値nを受け取り、そのシーケンスのn番目の項を出力する必要があります。シーケンスのBファイル内のインデックスを受け入れます。インデックスがBファイルにリストされている最大のインデックスよりも大きい場合、例外をスローしたり、選択したものを出力したりできます(これらはテストケースにはありません)。入力および出力の標準的な方法が許可されています。

Webの使用に関する制限

https://oeis.orgおよびhttp://oeis.org以外のWebサイトにはアクセスしないでください。これには、URL短縮サービス、個人のWebサイト、およびこの質問自体が含まれます。他のウェブサイトにアクセスしたいが、それを許可するのが不公平ではないと思われる場合は、コメントを残して仲裁します。

得点

これはコードゴルフチャレンジであるため、ソースコードで使用されるバイト数が最も少ないプログラムが勝ちます。標準の抜け穴は許可されていません。

テストケース

マシンに適切なインターネット接続があり、OEISサーバーが稼働中であり、次の入力と出力が対応していると仮定します。

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

先端

  • Bファイルにアクセスするhttp://oeis.org/b<A-number>.txtと、適切なB ファイルにリダイレクトされます。

1
どのインデックスをサポートする必要があるのか​​、はっきりしていません。最後の2つのテストケースは、たとえばでoeis.org/A000796/b000796.txtはなく、クエリする必要があることを示唆していますoeis.org/A000796/list。フォマーとは、Bファイルの意味ですか?その場合、オフセットに言及するのはかなり不要です。
デニス

@Dennis申し訳ありませんが、これは時間をかけて何度も編集した結果だと思います。わかりやすくするために編集します
小麦ウィザード

これはサンドボックスでより多くの時間を費やすべきだったと思います。なぜなら、Bファイルのないシーケンスをサポートしないというのはあなたの意図ではなかったと確信しているからです。
ピーターテイラー

1
OeisWikiによると、@ PeterTaylorは、「特定のシーケンスに対してbファイルがアップロードされていない場合、サーバーは、自動ツールの利便性のために、表示された用語を正確に含むbファイルを生成します。」そのため、すべてのシーケンスにBファイルが必要です。ただし、この課題をサンドボックスから時期尚早に移行することについては正しいかもしれません。
小麦ウィザード

1
さて、今日は何か役に立つことを学びました。
ピーターテイラー

回答:


11

Bash + coreutils + w3m、51 45 42バイト

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

3バイトのゴルフをしてくれた@EamonOliveに感謝します!

実行例

$ bash oeis.sh A172141 7
980

使い方

w3mはテキストベースのWebブラウザーで、HTMLとプレーンテキストの両方を読み取り可能な形式で表示します。とは異なり、カール、それは(これがあるため、必要とされ、デフォルトでリダイレクトを次のoeis.org/bxxxxxx.txtリダイレクトがするoeis.org/Axxxxxx/bxxxxxx.txt)、STDERRに任意の浮遊出力を生成し、3バイトの名前を持っていません。

コマンド

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

目的のURL。ここ${1:1}で、最初の文字のない最初のコマンドライン引数です。

出力はコマンドにパイプされます

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

目的の出力を抽出します。(行の先頭、2番目のコマンドライン引数、スペースの順に)空の文字列でs/^$2 //p置き換えようとし^$2 ます。置換が成功すると、pその結果を出力します。その後、sedが入力全体を印刷dしないように、パターンを無条件に削除します。


oeis.org/b${1:1}.txt代わりにoeis.org/$1/b${1:1}.txt
ウィートウィザード

へー、私は通常を使用sed -n ...していましたが、それはもう1つのキャラクターになります。
バティーン

1
@Vatine With -nを使用すると、同じバイト数の二重引用符をエスケープされたスペースに置き換えることができます。
デニス

3

Perl、59バイト

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

-M5.010または-E実行する必要があります。例えば ​​:

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

@Dennis answerのおかげhttp://で、彼がしたようにを削除することで8バイトを節約しました。


2

CJam、36バイト

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

実行例

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

2

パイソン2、125の 118 113バイト

7 Lynnのおかげで12バイト節約

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

さて、私自身の問題への取り組みです。それはおそらく最適ではないでしょうが、私はかなりまともな仕事をしたと思います。引数として文字列と整数を受け取り、結果として文字列を返す匿名関数を作成します。インデックスが範囲外の場合はエラーをスローします。

これは、124バイトの完全なプログラムにすることができます。

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

これにより、ユーザーに入力を求められます。まずインデックスを要求し、次にシーケンスのA番号を要求します。


いくつかの小さなセーブ: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)
リン

そして、lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]まだ短いです!
リン

2

Python 3、153 146 135バイト

FryAmTheEggmanのおかげで7バイト。

Eamon Oliveのおかげで6バイト。

Rodのおかげで5バイト。

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

次のように呼び出します。

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

デフォルトがutf-8のマシンで実行します。


1
私の意見では、1つの引数に文字列を必要とし、別の引数にバイト配列を使用するのは入力形式が寛大すぎるため、自分でバイトにエンコードするために必要なバイトを追加する必要があります。このチャレンジについては、入力として生のバイトを要求することを合理的にしません。
-orlp

に変更してA%sから%s最初a[1:]に変更できませんaか?
リン

@orlp了解しました。
リーキー修道女

@Lynnはい、明らかに私は愚かだからです。
リーキー修道女

1
@FryAmTheEggmanはい、いいえ。デフォルトは環境のロケールです。
デニス

2

PHP 5.6、 93の 92バイト

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

これは非常に簡単です。でページを引き出し、(0-index)のfile()行を取得$line - 1し、スペースで爆発し、そこから2番目の配列要素を出力します。


2

Nim123 115 113バイト

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

これはラムダ式です。使用するには、引数としてテスト手順に渡す必要があります。テストに使用できる完全なプログラムは次のとおりです。

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

入力を2つの文字列として期待します。使用例:

$ nim c oeis.nim
$ ./oeis
980

httpclientgetContentproc を使用してOEIS bファイルを取得findし、インデックスのある行に正規表現を使用します。findはを返すためOption[RegexMatch]getから値を取得するために使用しますOptionecho自動的に文字列化されるため、文字列化は省略します。


2

Mathematica + OEIS.m、31

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

使用例: %[A172141,36]


Mathematica、85

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

使用例: %["A002206",-1]


2

R、94 89バイト

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

同じバイト数sprintfpaste0結果の代わりに使用する:

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

plannapusのおかげで5バイト節約されました。


ライブラリ(stringr)を無料で使用でき、str_subを-2バイトで使用できます^^
AlexR

@AlexRライブラリを無料でインポートできるとは思わない;-)
pajonk

おっと、私のコメントにタイプミスがありました- できません。ストリンガーは、私のすべてのプロジェクトの.Rprofileにロードされた私のデフォルトパッケージの1つであるため、ゴルフの最初の考えに過ぎませんでした。
AlexR

1
を使用する必要はありませんurl。引数fileread.table文字列としてURLを指定できます。
plannapus

@plannapus確かにそうです。ありがとう!
パジョン

1

Clojure、103

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

re-find 最初の一致の正規表現グループのベクトルを見つけ、関数として使用され、 1位置で文字列を取得します1read-string文字列をintに変換します。この正規表現が常に正しい行を見つけるかどうか、100%確信はありません。


1

R、87バイト

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

pasteまたはの代わりに正規表現を使用してURL文字列を作成しますsprintf


0

Node.js + request、109バイト

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

シーケンスIDと番号を取得します。


0

ジュリア、88バイト

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

@デニスの助けを借りてゴルフをしました!

Requests.jl実行する前にインストール済みであることを確認してください。


0

ListSharp、266バイト

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]

ListSharpのネストステートメントはタブーであるため、Webスクレイピング用に作成された言語が非常に多くの行を必要とするとき、それは悲しい

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.