自动化OEIS


26

我们在这里看到了很多挑战,要求从OEIS创建函数来创建序列。尽管这些挑战很有趣,但作为一名程序员,我看到了自动化的机会。

您的挑战是制作一个程序,该程序采用序列的索引(例如A172141)和某个整数n(例如7),并从适当的网页中提取适当的值。

输入输出

如前所述,您的程序应采用序列索引和某个值n作为输入,并输出该序列中的第n个项。您接受序列B文件中的任何索引。如果索引大于B文件中列出的最大索引,则您可能会引发异常或输出您选择的内容(测试用例中没有)。允许使用标准的输入和输出方法。

网络使用限制

https://oeis.orghttp://oeis.org之外,您不应访问任何其他网站。这包括网址缩短器,您自己的个人网站以及此问题本身。如果您想访问其他网站,并且认为允许这样做并非不公平,则可以发表评论,我将进行仲裁。

计分

这是一个代码挑战,因此在其源代码中使用最少字节的程序将获胜。不允许出现标准漏洞。

测试用例

假设您的计算机具有正确的Internet连接并且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
我不清楚我们必须支持哪些索引。最后两个测试用例暗示我们应该进行查询,例如oeis.org/A000796/b000796.txt而不是oeis.org/A000796/list。您所说的B档案是fomer 吗?在那种情况下,提及偏移量是多余的。
丹尼斯

@Dennis抱歉,我认为这是随着时间的推移进行多次编辑的结果。为了清晰起见,我将进行编辑,
Wheat Wizard

我认为这应该在沙箱中花费更多的时间,因为我确定不支持不包含B文件的序列不是您的意图。
彼得·泰勒

1
OeisWiki的@PeterTaylor说:“如果没有为特定序列上传b文件,则服务器会生成一个b文件,其中包含精确显示的术语,以方便自动化工具使用。” 因此,每个序列都应该有一个B文件。尽管您可能过早从沙盒中​​解决了这一挑战,这是正确的。
小麦巫师

1
好吧,我今天学到了一些有用的东西。
彼得·泰勒

Answers:


11

Bash + coreutils + w3m,51 45 42字节

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

感谢@EamonOlive打高尔夫球3个字节!

运行示例

$ bash oeis.sh A172141 7
980

怎么运行的

w3m是基于文本的Web浏览器,它以可读格式显示HTML和纯文本。与 curl不同,它默认情况下遵循重定向(这是必需的,因为oeis.org/bxxxxxx.txt重定向到oeis.org/Axxxxxx/bxxxxxx.txt),不会对STDERR产生任何杂散输出,并且具有三字节名称。

命令

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

所需的URL,其中${1:1}第一个命令行参数不含第一个字符。

输出通过管道传递给命令

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

提取所需的输出。s/^$2 //p尝试^$2 用空字符串替换(行首,后跟第二个命令行参数,后跟一个空格)。如果替换成功,则p打印其结果。之后,d无条件删除该图案以防止sed打印整个输入。


您可以使用oeis.org/b${1:1}.txt而不是来节省一些字节oeis.org/$1/b${1:1}.txt
Wheat Wizard

嘿,我通常会用sed -n ...,但这又是一个字符。
Vatine

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,通过删除节省了8个字节http://,就像他一样。


2

CJam,36个字节

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

运行示例

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

2

Python 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个字节。

6字节感谢Eamon Olive。

5字节感谢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

这样称呼它:

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

在默认值为utf-8的计算机上运行。


1
我认为一个参数需要一个字符串,而另一个参数需要一个字节数组,这种输入格式太宽松了,您应该自己添加编码所需的字节。关于这一挑战,没有任何理由要求原始字节作为输入是合理的。
orlp

您不能先更改A%s%s,然后再更改a[1:]a吗?
林恩

@orlp好吧,完成。
Leaky Nun

@Lynn是的,因为显然我很傻。
Leaky Nun

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];}

这很简单。用拉动页面file(),使行在$line - 1(0-index)处爆炸,并从中打印出第二个数组元素。


2

123个 115 113字节

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

这是一个lambda表达式;要使用它,必须将它作为参数传递给测试过程。此处提供了可用于测试的完整程序:

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

期望输入为两个字符串。用法示例:

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

在相同的字节数中使用sprintf而不是paste0结果:

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

由于Plannapus节省了五个字节。


太糟糕了,您可以免费使用library(stringr)并使用str_sub以获得-2个字节^^
AlexR

@AlexR我认为我不能免费导入图书馆;-)
pajonk

糟糕,我的评论中有错字-太糟糕了,你不能。这只是打高尔夫球的第一个想法,因为stringr是我所有项目的.Rprofile中加载的默认软件包之一。
AlexR

1
你并不需要使用url,参数fileread.table可URL作为一个字符串。
plannapus

@plannapus确实,是的。谢谢!
pajonk

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在position处获取字符串1read-string将字符串转换为int。我不确定这个正则表达式是否总是找到正确的行。


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]

在@Dennis的帮助下打高尔夫球!

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]

当用于Web抓取的语言需要这么多行时,这很可悲,因为ListSharp中的嵌套语句是禁忌

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.