OEIS 자동화


26

우리는 여기에서 OEIS 로부터 시퀀스를 생성하는 기능을 요구하는 많은 도전을 본다 . 이러한 도전은 재미 있지만 프로그래머로서 자동화의 기회를 봅니다.

문제는 시퀀스 (예 : A172141 ) 및 일부 정수 n (예 : 7) 의 색인을 가져와 적절한 웹 페이지에서 적절한 값을 가져 오는 프로그램을 만드는 것 입니다.

I / O

언급했듯이, 프로그램은 시퀀스 인덱스와 일부 값 n을 입력으로 받아서 해당 시퀀스의 n 번째 항을 출력해야합니다. 시퀀스의 B 파일 에있는 모든 색인을 승인 합니다 . 인덱스가 B 파일에 나열된 가장 큰 인덱스보다 큰 경우, 원하는 경우 예외를 발생 시키거나 출력 할 수 있습니다 (테스트 케이스에는 없음). 표준 입력 및 출력 방법이 허용됩니다.

웹 사용에 대한 제한

https://oeis.orghttp://oeis.org 이외의 웹 사이트에 액세스하면 안됩니다 . 여기에는 URL 단축기, 개인 웹 사이트 및이 질문 자체가 포함됩니다. 다른 웹 사이트에 액세스하고 싶지만 귀하가 그렇게하는 것이 불공평하다고 생각되면 의견을 남기면 중재하겠습니다.

채점

이것은 코드 골프 도전이므로 소스 코드에 사용 된 바이트 수가 가장 적은 프로그램이 승리합니다. 표준 허점은 허용되지 않습니다.

테스트 사례

컴퓨터가 인터넷에 올바르게 연결되어 있고 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-files에서 의미하는 바는 무엇 입니까? 이 경우 오프셋을 언급하는 것이 다소 불필요합니다.
Dennis

@Dennis 죄송합니다. 시간이 지남에 따라 여러 번 수정 한 결과라고 생각합니다. 명확성을 위해 편집하겠습니다.
Wheat Wizard

B 파일이없는 시퀀스가 ​​지원되지 않아야한다는 의도가 확실하지 않기 때문에 이것이 샌드 박스에서 더 많은 시간을 소비했을 것이라고 생각합니다.
피터 테일러

1
OeisWiki에 따르면 @PeterTaylor는 "특정 시퀀스에 대해 b-file이 업로드되지 않은 경우 서버는 자동화 된 도구를 사용하여 편의를 위해 표시된 용어를 정확하게 포함하는 b-file을 생성합니다." 모든 시퀀스마다 B 파일이 있어야합니다. 샌드 박스에서이 문제를 조기에 해결하는 것이 옳을 수도 있습니다.
위트 마법사

1
글쎄, 나는 오늘 유용한 것을 배웠다.
피터 테일러

답변:


11

배쉬 + 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 은 텍스트 기반 웹 브라우저로서 HTML과 일반 텍스트를 모두 읽을 수있는 형식으로 표시합니다. curl 과 달리기본적으로 리디렉션을 따르고 (이는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"

원하는 출력을 추출합니다. 빈 문자열 s/^$2 //p로 대체 ^$2 (행 시작, 두 번째 명령 행 인수, 공백)를 시도 합니다. 대체가 성공하면 p결과를 인쇄합니다. 그 후 sed 가 전체 입력을 인쇄 d하지 못하도록 패턴을 무조건 삭제합니다 .


oeis.org/b${1:1}.txt대신에 다음 을 사용하여 몇 바이트를 절약 할 수 있습니다.oeis.org/$1/b${1:1}.txt
Wheat Wizard

허, 나는 보통을 사용 sed -n ...했을 것이다. 그러나 그것은 또 하나의 성격 일 것이다.
Vatine

1
@Vatine을 사용 -n하면 동일한 바이트 수에 대해 큰 따옴표를 이스케이프 된 공백으로 바꿀 수 있습니다.
Dennis

3

펄, 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

저장된 8 @Dennis의 덕분 바이트 답변을 제거하여, http://그가 그랬던 것처럼.


2

CJam, 36 바이트

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

예제 실행

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

2

파이썬 2 125 118 113 바이트

Lynn 덕분에 7 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)
Lynn

그리고 lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]여전히 짧습니다!
Lynn

2

파이썬 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
내 의견으로는 한 인수에는 문자열이 필요하고 다른 인수에는 바이트 배열이 너무 관대 한 입력 형식이므로 바이트로 인코딩하는 데 필요한 바이트를 직접 추가해야합니다. 이 문제에 대해 아무것도 원시 바이트를 입력으로 요구하는 것이 합리적이지 않습니다.
orlp

당신은 변경할 수 없습니다 A%s%s다음 첫 번째 a[1:]a?
Lynn

@orlp 알았어.
Leaky Nun

@Lynn 네, 분명히 바보입니다.
Leaky Nun

1
@FryAmTheEggman 예, 아니오. 기본값은 환경의 로캘입니다.
Dennis

2

PHP 5.6, 93 92 바이트

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

이것은 매우 직설적입니다. 을 사용하여 페이지를 당기고 (0- 인덱스) file()에서 줄을 가져 와서 $line - 1공간을 폭발시키고 두 번째 배열 요소를 인쇄하십시오.


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

이것은 람다 식입니다. 사용하려면 테스트 절차에 대한 인수로 전달해야합니다. 테스트에 사용할 수있는 완전한 프로그램은 다음과 같습니다.

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에서 값을 검색하는 데 사용 합니다 Option. echo자동으로 문자열을 지정하므로 문자열을 생략합니다.


2

Mathematica + OEIS.m , 31

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

사용법 예 : %[A172141,36]


매스 매 티카, 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 덕분에 5 바이트가 절약 되었습니다 .


라이브러리 (stringr)를 무료로 사용할 수 있고 -2 바이트에 str_sub를 사용할 수 없습니다 ^^
AlexR

@AlexR 무료로 라이브러리를 가져올 수 있다고 생각하지 않습니다 ;-)
pajonk

아차, 내 댓글에 오타가 있었다 - 너무의 나쁜 당신이 할 수 없습니다 . stringer는 모든 프로젝트의 .Rprofile에로드 된 기본 패키지 중 하나이기 때문에 골프에 대한 첫 번째 생각이었습니다.
AlexR

1
당신은 사용할 필요가 없습니다 url, 인수 fileread.table문자열과 URL이 될 수 있습니다.
plannapus

@plannapus 사실, 맞습니다. 감사!
pajonk

1

클로저, 103

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

re-find첫 번째 matche의 정규 표현식 그룹으로 구성된 벡터를 찾고 함수로 사용되며 1위치에서 문자열을 가져옵니다 1. read-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]

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

ListSharp의 중첩 명령문이 금기 이기 때문에 웹 스크랩을 위해 작성된 언어에 너무 많은 행이 필요한 경우 슬픈 일입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.