Tự động hóa OEIS


26

Chúng tôi thấy rất nhiều thách thức ở đây yêu cầu một chức năng để tạo ra một chuỗi từ OEIS . Trong khi những thách thức này là thú vị, là một lập trình viên, tôi thấy một cơ hội cho tự động hóa.

Thử thách của bạn là tạo ra một chương trình lấy chỉ mục của một chuỗi (ví dụ A172141 ) và một số nguyên n (ví dụ 7) và lấy giá trị phù hợp từ trang web thích hợp.

Tôi / O

Như đã đề cập, chương trình của bạn nên lấy một chỉ mục chuỗi và một số giá trị n làm đầu vào và đầu ra thuật ngữ thứ n trong chuỗi đó. Bạn chấp nhận bất kỳ chỉ mục nào trong các tệp B của chuỗi . Nếu chỉ mục lớn hơn chỉ mục lớn nhất được liệt kê trong tệp B, bạn có thể ném ngoại lệ hoặc xuất bất cứ thứ gì bạn chọn (những thứ này không có trong các trường hợp thử nghiệm). Phương pháp tiêu chuẩn của đầu vào và đầu ra được cho phép.

Hạn chế sử dụng web

Bạn không nên truy cập bất kỳ trang web nào khác ngoài https://oeis.orghttp://oeis.org . Điều này bao gồm rút ngắn url, trang web cá nhân của riêng bạn và chính câu hỏi này. Nếu bạn muốn truy cập một số trang web khác và bạn tin rằng không cho phép bạn làm như vậy, bạn có thể để lại nhận xét và tôi sẽ phân xử.

Chấm điểm

Đây là một thử thách golf mã, vì vậy chương trình có ít byte được sử dụng trong mã nguồn của nó sẽ thắng. Sơ hở tiêu chuẩn là không được phép.

Các trường hợp thử nghiệm

Giả sử rằng máy của bạn có kết nối internet phù hợp và các máy chủ OEIS sẽ hoạt động và chạy các đầu vào và đầu ra sau đây sẽ tương ứng.

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

tiền boa

  • Khi truy cập các tệp B http://oeis.org/b<A-number>.txtsẽ chuyển hướng đến tệp B thích hợp.

1
Tôi không rõ là chúng tôi phải hỗ trợ những chỉ số nào. Hai trường hợp thử nghiệm cuối cùng gợi ý rằng chúng ta nên truy vấn, ví dụ, oeis.org/A000796/b000796.txtchứ không phải oeis.org/A000796/list. Là fom những gì bạn có nghĩa là bởi các tập tin B ? Trong trường hợp đó, đề cập đến phần bù là khá thừa.
Dennis

@Dennis Xin lỗi tôi nghĩ rằng đó là kết quả của nhiều lần chỉnh sửa theo thời gian. Tôi sẽ chỉnh sửa cho rõ ràng,
Wheat Wizard

Tôi nghĩ rằng điều này nên dành nhiều thời gian hơn trong hộp cát, bởi vì tôi chắc chắn rằng ý định của bạn là các chuỗi không có tệp B sẽ không được hỗ trợ.
Peter Taylor

1
@PeterTaylor theo OeisWiki "Nếu không có tệp b nào được tải lên cho một chuỗi cụ thể, máy chủ sẽ tạo một tệp b chứa chính xác các thuật ngữ được hiển thị, để thuận tiện với các công cụ tự động." vì vậy cần có một tệp B cho mỗi chuỗi. Mặc dù bạn có thể đúng về việc di chuyển sớm thử thách này từ hộp cát.
Thuật sĩ lúa mì

1
Chà, hôm nay tôi đã học được điều gì đó hữu ích.
Peter Taylor

Câu trả lời:


11

Bash + coreutils + w3m, 51 45 42 byte

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

Cảm ơn @EamonOlive vì đã chơi golf 3 byte!

Chạy ví dụ

$ bash oeis.sh A172141 7
980

Làm thế nào nó hoạt động

w3m là một trình duyệt web dựa trên văn bản, hiển thị cả HTML và văn bản thuần ở định dạng có thể đọc được. Không giống như curl , nó theo các chuyển hướng theo mặc định (điều này là bắt buộc, vìoeis.org/bxxxxxx.txtchuyển hướng đếnoeis.org/Axxxxxx/bxxxxxx.txt), không tạo ra bất kỳ đầu ra đi lạc nào đến STDERR và có tên ba byte.

Lệnh

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

URL mong muốn, trong đó ${1:1}là đối số dòng lệnh đầu tiên không có ký tự đầu tiên.

Đầu ra được dẫn đến lệnh

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

trong đó trích xuất đầu ra mong muốn. s/^$2 //pcố gắng thay thế ^$2 (bắt đầu dòng, theo sau là đối số dòng lệnh thứ hai, theo sau là khoảng trắng) bằng chuỗi trống. Nếu thay thế thành công, pin kết quả của nó. Sau đó, dxóa vô điều kiện mẫu để ngăn sed in toàn bộ đầu vào.


Bạn có thể lưu một vài byte bằng cách sử dụng oeis.org/b${1:1}.txtthay vìoeis.org/$1/b${1:1}.txt
Wheat Wizard

Heh, tôi thường sẽ sử dụng sed -n ..., nhưng đó sẽ là một nhân vật nữa.
Vatine

1
@Vatine Với -n, dấu ngoặc kép có thể được thay thế bằng một khoảng trắng được thoát, cho cùng một số byte.
Dennis

3

Perl, 59 byte

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

Cần -M5.010hoặc -Eđể chạy. Ví dụ :

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

Đã lưu 8 byte nhờ câu trả lời @Dennis , bằng cách xóa http://, như anh đã làm.


2

CJam, 36 byte

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

Chạy ví dụ

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

2

Python 2, 125 118 113 byte

7 12 byte được lưu nhờ 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]

Vâng đây là vấn đề của riêng tôi. Nó có khả năng dưới mức tối ưu nhưng tôi nghĩ rằng tôi đã làm một công việc khá tốt. Nó tạo ra một hàm ẩn danh lấy một chuỗi và số nguyên làm đối số và trả về một chuỗi làm kết quả hoặc đưa ra lỗi nếu chỉ mục nằm ngoài phạm vi.

Điều này có thể được thực hiện thành một chương trình đầy đủ 124 byte.

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

Điều này nhắc nhở người dùng cho đầu vào. Đầu tiên yêu cầu chỉ số và sau đó là số A của chuỗi.


Một số tiết kiệm nhỏ: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

lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]vẫn ngắn hơn!
Lynn

2

Python 3, 153 146 135 byte

7 byte nhờ FryAmTheEggman.

6 byte nhờ Eamon Olive.

5 byte nhờ 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

Gọi nó như thế này:

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

Chạy trên máy có mặc định là utf-8.


1
Theo tôi, yêu cầu một chuỗi cho một đối số và một mảng byte cho một đối số khác là quá dễ định dạng đầu vào và bạn chỉ nên thêm các byte cần thiết để tự mã hóa thành byte. Không có gì về thách thức này làm cho nó hợp lý khi yêu cầu byte thô làm đầu vào.
orlp

Bạn không thể thay đổi A%sđể %srồi người đầu tiên a[1:]đến a?
Lynn

@orlp Được rồi, xong rồi.
Leaky Nun

@Lynn Vâng, vì hình như tôi ngu ngốc.
Leaky Nun

1
@FryAmTheEggman Có và không. Mặc định là ngôn ngữ của môi trường.
Dennis

2

PHP 5.6, 93 92 byte

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

Điều này là khá thẳng về phía trước. Kéo trang với file(), lấy dòng tại $line - 1(0-index), phát nổ trên khoảng trắng và in ra phần tử mảng thứ hai từ đó.


2

Nim , 123 115 113 byte

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

Đây là một biểu thức lambda; để sử dụng nó, nó phải được chuyển làm đối số cho một quy trình thử nghiệm. Một chương trình hoàn chỉnh có thể được sử dụng để thử nghiệm được đưa ra ở đây:

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

Dự kiến ​​đầu vào là hai chuỗi. Ví dụ sử dụng:

$ nim c oeis.nim
$ ./oeis
980

Chúng tôi sử dụng httpclient's getContentproc để có được những OEIS b-file, sau đó sử dụng một regex để finddòng với chỉ số. findtrả về một Option[RegexMatch], vì vậy chúng tôi sử dụng getđể lấy giá trị từ Option. echotự động xâu chuỗi, vì vậy chúng tôi bỏ chuỗi.


2

Toán học + OEIS.m , 31

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

sử dụng ví dụ: %[A172141,36]


Toán học, 85

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

sử dụng ví dụ: %["A002206",-1]


2

R, 94 89 byte

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

Sử dụng sprintfthay vì paste0kết quả trong cùng một bytecount:

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

Năm byte được lưu nhờ vào plannapus .


Quá tệ, bạn có thể thư viện (stringr) miễn phí và sử dụng str_sub cho -2 byte ^^
AlexR

@AlexR Tôi không nghĩ mình có thể nhập thư viện miễn phí ;-)
pyjama

Rất tiếc, có một lỗi đánh máy trong nhận xét của tôi - Thật tệ là bạn không thể . Đó chỉ là suy nghĩ đầu tiên cho việc chơi golf, bởi vì Stringr là một trong những gói mặc định của tôi được tải trong .Rprofile trong tất cả các dự án của tôi.
AlexR

1
Bạn không cần phải sử dụng url, lập luận filecủa read.tablecó thể là URL như một chuỗi ký tự.
plannapus

@plannapus Thật vậy, điều đó đúng. Cảm ơn!
pyjama

1

Clojure, 103

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

re-findtìm thấy một vectơ của các nhóm regex của matche đầu tiên, nó được sử dụng như một hàm và 1lấy chuỗi ở vị trí 1. read-stringchuyển đổi chuỗi thành int. Tôi không chắc chắn 100% nếu regex này luôn tìm đúng hàng.


1

R, 87 byte

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

Xây dựng chuỗi URL bằng biểu thức chính thay vì pastehoặc sprintf.


0

Node.js + request , 109 byte

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

Lấy ID chuỗi và một số.


0

Julia, 88 byte

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

Chơi gôn với sự giúp đỡ của @Dennis!

Hãy chắc chắn rằng bạn đã Requests.jlcài đặt trước khi chạy.


0

ListSharp , 266 byte

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]

Thật đáng buồn khi một ngôn ngữ được tạo ra để quét web cần rất nhiều dòng vì các câu lệnh lồng nhau trong ListSharp là điều cấm kỵ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.