Otomatiskan OEIS

26

Kami melihat banyak tantangan di sini meminta fungsi untuk membuat urutan dari OEIS . Walaupun tantangan ini menyenangkan, sebagai seorang programmer saya melihat peluang untuk otomatisasi.

Tantangan Anda adalah membuat program yang mengambil indeks urutan (mis. A172141 ) dan beberapa bilangan bulat n (misalnya 7), dan menarik nilai yang sesuai dari halaman web yang sesuai.

I / O

Seperti disebutkan, program Anda harus mengambil indeks urutan dan beberapa nilai n sebagai input dan output istilah ke-n dalam urutan itu. Anda menerima indeks apa pun dalam file-B urutan . Jika indeks lebih besar dari indeks terbesar yang tercantum dalam file-B Anda dapat membuang pengecualian atau output apa pun yang Anda pilih (ini tidak dalam kasus uji). Metode input dan output standar diizinkan.

Pembatasan penggunaan web

Anda tidak boleh mengakses situs web apa pun selain https://oeis.org dan http://oeis.org . Ini termasuk penyingkat url, situs web pribadi Anda, dan pertanyaan ini sendiri. Jika Anda ingin mengakses beberapa situs web lain dan Anda yakin tidak adil untuk mengizinkannya, Anda dapat meninggalkan komentar dan saya akan menengahi.

Mencetak gol

Ini adalah tantangan kode golf sehingga program dengan byte terkecil yang digunakan dalam kode sumbernya akan menang. Celah standar tidak diijinkan.

Uji Kasus

Dengan asumsi bahwa mesin Anda memiliki koneksi internet yang tepat dan server OEIS aktif dan menjalankan input dan output berikut harus sesuai.

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

Tip

  • Saat mengakses file-B http://oeis.org/b<A-number>.txtakan mengarahkan ke file-B yang tepat.
Wisaya Gandum
sumber
1
Bagi saya tidak jelas indeks mana yang harus kita dukung. Dua kasus uji terakhir mengisyaratkan bahwa kita harus meminta, misalnya, oeis.org/A000796/b000796.txtdaripada oeis.org/A000796/list. Apakah fomer yang Anda maksud dengan file-B ? Dalam hal itu, menyebutkan offset agak berlebihan.
Dennis
@ Dennis Maaf saya pikir itu adalah hasil dari beberapa suntingan dari waktu ke waktu. Saya akan mengedit untuk kejelasan,
Wheat Wizard
Saya pikir ini seharusnya menghabiskan lebih banyak waktu di kotak pasir, karena saya yakin itu bukan maksud Anda bahwa urutan tanpa file-B seharusnya tidak didukung.
Peter Taylor
1
@PeterTaylor menurut OeisWiki "Jika tidak ada file-b yang telah diunggah untuk urutan tertentu, server membuat file-b yang memuat istilah yang ditampilkan, untuk kenyamanan dengan alat otomatis." jadi harus ada file-B untuk setiap urutan. Meskipun Anda mungkin benar tentang memindahkan tantangan ini dari kotak pasir sebelum waktunya.
Wheat Wizard
1
Yah, saya sudah belajar sesuatu yang bermanfaat hari ini.
Peter Taylor

Jawaban:

11

Bash + coreutils + w3m, 51 45 42 byte

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

Terima kasih kepada @EamonOlive untuk bermain golf 3 byte!

Contoh dijalankan

$ bash oeis.sh A172141 7
980

Bagaimana itu bekerja

w3m adalah browser web berbasis teks, yang menampilkan HTML dan teks biasa dalam format yang dapat dibaca. Tidak seperti itu curl , ini mengikuti pengalihan secara default (ini diperlukan, sejak oeis.org/bxxxxxx.txtpengalihan keoeis.org/Axxxxxx/bxxxxxx.txt ), tidak menghasilkan output yang menyimpang ke STDERR, dan memiliki nama tiga byte.

Perintah

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

URL yang diinginkan, di mana ${1:1} argumen baris perintah pertama tanpa karakter pertamanya.

Output disalurkan ke perintah

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

yang mengekstrak output yang diinginkan. s/^$2 //pupaya untuk mengganti ^$2 (mulai dari baris, diikuti oleh argumen baris perintah kedua, diikuti oleh spasi) dengan string kosong. Jika substitusi berhasil, pcetak hasilnya. Setelah itu, dtanpa syarat menghapus pola untuk mencegah sed dari mencetak seluruh input.

Dennis
sumber
Anda dapat menyimpan beberapa byte dengan menggunakan oeis.org/b${1:1}.txtalih-alihoeis.org/$1/b${1:1}.txt
Wheat Wizard
Heh, saya biasanya akan menggunakan sed -n ..., tapi itu akan menjadi satu karakter lagi.
Vatine
1
@Vatine With -n, tanda kutip ganda dapat diganti dengan ruang yang diloloskan, untuk jumlah byte yang sama.
Dennis
3

Perl, 59 byte

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

Perlu -M5.010atau -Edijalankan. Contohnya :

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

Disimpan 8 byte berkat jawaban @Dennis , dengan menghapus http://, seperti yang dilakukannya.

Dada
sumber
2

CJam, 36 byte

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

Contoh dijalankan

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

Python 2, 125 118 113 byte

7 12 byte disimpan berkat 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]

Nah inilah saya pergi di masalah saya sendiri. Ini mungkin suboptimal tetapi saya pikir saya melakukan pekerjaan yang cukup baik. Ini menciptakan fungsi anonim yang mengambil string dan integer sebagai argumen dan mengembalikan string sebagai hasilnya atau melempar kesalahan jika indeks berada di luar jangkauan.

Ini dapat dibuat menjadi program penuh 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]

Ini meminta pengguna untuk input. Pertama meminta indeks dan kemudian A-number dari urutan.

Wisaya Gandum
sumber
Beberapa menghemat kecil: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
Dan lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]masih lebih pendek!
Lynn
2

Python 3, 153 146 135 byte

7 byte berkat FryAmTheEggman.

6 byte berkat Eamon Olive.

5 byte berkat 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

Sebut saja seperti ini:

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

Jalankan pada mesin di mana defaultnya adalah utf-8.

Biarawati Bocor
sumber
1
Menurut pendapat saya membutuhkan string untuk satu argumen, dan array byte untuk yang lain adalah format input yang terlalu lunak, dan Anda harus menambahkan byte yang diperlukan untuk mengkodekan ke dalam byte sendiri. Tidak ada tentang tantangan ini yang membuatnya masuk akal untuk memerlukan byte mentah sebagai input.
orlp
Tidak dapat Anda ubah A%suntuk %skemudian pertama a[1:]ke a?
Lynn
@ Atlp Baiklah, sudah selesai.
Leaky Nun
@ Lynn Ya, karena ternyata saya bodoh.
Leaky Nun
1
@FryAmTheEggman Ya dan tidak. Standarnya adalah lokal lingkungan.
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];}

Yang ini cukup lurus ke depan. Tarik halaman dengan file(), dapatkan garis di $line - 1(0-indeks), meledak pada ruang dan cetak elemen array kedua dari itu.

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

Ini adalah ungkapan lambda; untuk menggunakannya, itu harus diteruskan sebagai argumen ke prosedur pengujian. Program lengkap yang dapat digunakan untuk pengujian diberikan di sini:

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

Mengharapkan input sebagai dua string. Contoh penggunaan:

$ nim c oeis.nim
$ ./oeis
980

Kami menggunakan httpclient's getContentproc untuk mendapatkan Oei b-file, kemudian menggunakan regex untuk findbaris dengan indeks. findmengembalikan sebuah Option[RegexMatch], jadi kami gunakan getuntuk mengambil nilai dari Option. echosecara otomatis dirangkai, jadi kami meninggalkan pengetatan.

Tembaga
sumber
2

Mathematica + OEIS.m , 31

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

contoh penggunaan: %[A172141,36]


Mathematica, 85

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

contoh penggunaan: %["A002206",-1]

dbanet
sumber
2

R, 94 89 byte

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

Menggunakan sprintfalih-alih paste0hasil dalam bytecount yang sama:

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

Lima byte disimpan berkat plannapus .

pajonk
sumber
Sayang sekali Anda dapat perpustakaan (stringr) secara gratis dan menggunakan str_sub untuk -2 byte ^^
AlexR
@AlexR Saya tidak berpikir saya dapat mengimpor perpustakaan gratis ;-)
pajonk
Ups, ada kesalahan ketik dalam komentar saya - Sayang sekali Anda tidak bisa . Itu hanya pemikiran pertama untuk bermain golf, karena stringr adalah salah satu paket default saya dimuat di. Profil semua proyek saya.
AlexR
1
Anda tidak perlu menggunakan url, argumen filedari read.tabledapat menjadi URL sebagai string karakter.
plannapus
@plannapus Memang, itu benar. Terima kasih!
pajonk
1

Clojure, 103

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

re-findmenemukan vektor kelompok regex pertandingan pertama, itu digunakan sebagai fungsi dan 1mendapatkan string pada posisi 1. read-stringmengkonversi string ke int. Saya tidak 100% yakin apakah regex ini selalu menemukan baris yang benar.

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

Bangun string URL dengan regex alih-alih pasteatau sprintf.

plannapus
sumber
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]))

Mengambil ID urutan dan nomor.

Mama Fun Roll
sumber
0

Julia, 88 byte

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

Bermain golf dengan bantuan dari @Dennis!

Pastikan Anda telah Requests.jlmenginstal sebelum menjalankan.

Mama Fun Roll
sumber
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]

Menyedihkan ketika bahasa yang dibuat untuk pengikisan web membutuhkan begitu banyak baris karena pernyataan bersarang di ListSharp adalah hal yang tabu

downrep_nation
sumber