Автоматизація OEIS


26

Ми бачимо тут багато проблем, які вимагають функції створити послідовність із OEIS . Хоча ці виклики цікаві, але як програміст я бачу можливість для автоматизації.

Ваша задача полягає в тому, щоб скласти програму, яка бере індекс послідовності (наприклад, A172141 ) і деяке ціле число n (наприклад, 7), і витягує відповідне значення з відповідної веб-сторінки.

I / O

Як вже було сказано, ваша програма повинна приймати індекс послідовності та деяке значення n як введення та виведення n-го члена в цій послідовності. Ви приймаєте будь-який індекс у B-файлах послідовності . Якщо індекс більший, ніж найбільший індекс, перелічений у B-файлах, ви можете викинути виняток або вивести все, що завгодно (це не в тестових випадках). Дозволені стандартні методи введення та виводу.

Обмеження щодо використання веб-сторінок

Ви не маєте доступу до будь-яких веб-сайтів, окрім https://oeis.org та http://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. Це fomer, що ви маєте на увазі під B-файлами ? У цьому випадку згадування про компенсацію є досить зайвим.
Денніс

@Dennis Вибачте, я вважаю, що це стало результатом декількох змін протягом часу. Я відредагую для наочності,
Пшеничний майстер

Я думаю, що це повинно було провести більше часу в пісочниці, тому що я впевнений, що це не було вашим наміром, щоб послідовності без B-файлів не підтримувались.
Пітер Тейлор

1
@PeterTaylor відповідно до OeisWiki "Якщо для певної послідовності не завантажено жодного b-файлу, сервер створює b-файл, що містить точно вказані терміни, для зручності за допомогою автоматизованих інструментів." тому для кожної послідовності повинен бути B-файл. Хоча ви можете мати рацію щодо передчасного перенесення цього завдання з пісочниці.
Пшеничний майстер

1
Що ж, я сьогодні дізнався щось корисне.
Пітер Тейлор

Відповіді:


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 - це текстовий веб-браузер, який відображає і 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безумовно , видаляє шаблон , щоб запобігти СЕД від друку всього входу.


Ви можете зберегти кілька байт, скориставшись oeis.org/b${1:1}.txtзамістьoeis.org/$1/b${1:1}.txt
Wheat Wizard

Хе, я б звичайно використовував sed -n ..., але це був би ще один персонаж.
Ватін

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

Збережено 8 байт завдяки відповіді @Dennis , видаливши 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 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

Пітон 3, 153 146 135 байт

7 байт завдяки FryAmTheEggman.

6 байт завдяки Eamon Olive.

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?
Лінн

@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-індекс), вибухніть на пробілі та виведіть з нього другий елемент масиву.


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

Ми використовуємо httpclient«s getContentпрок , щоб отримати б-файл OEIS, а потім використовувати регулярний вираз для findрядка з індексом. findповертає an 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]

П’ять байтів збереглися завдяки планапусу .


Шкода, що ви можете безкоштовно бібліотекувати (stringr) і використовувати str_sub для -2 байтів ^^
AlexR

@AlexR Я не думаю, що я можу безкоштовно імпортувати бібліотеку ;-)
pajonk

На жаль, в моєму коментарі була помилкова помилка - шкода, що ти не можеш . Це була лише перша думка про гольф, тому що стрингер - це один із моїх пакетів за замовчуванням, завантажених у .Rprofile всіх моїх проектів.
AlexR

1
Вам не потрібно використовувати url, аргумент fileз read.tableможе бути URL у вигляді рядка символів.
планнапус

@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отримує рядок у положенні 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]

Побудуйте рядок URL із регулярними виразами замість pasteабо 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]))

Бере ідентифікатор послідовності та число.


0

Джулія, 88 байт

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

Гольф за допомогою допомоги @Dennis!

Переконайтеся, що Requests.jlвстановлено перед запуском.


0

СписокSharp , 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 є табу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.