Автоматизировать 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. Является ли Фомер тем, что вы подразумеваете под B-файлами ? В этом случае упоминание о смещении является излишним.
Деннис
@ Денис Извините, я думаю, что это было результатом нескольких изменений во времени. Я отредактирую для ясности,
Волшебник Пшеницы
Я думаю, что это должно было провести больше времени в песочнице, потому что я уверен, что вы не собирались поддерживать последовательности без 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безоговорочно удаляет шаблон, чтобы предотвратить печать всего ввода sed .

Деннис
источник
Вы можете сэкономить несколько байтов, используя oeis.org/b${1:1}.txtвместоoeis.org/$1/b${1:1}.txt
Wheat Wizard
Хех, я бы обычно использовал sed -n ..., но это был бы еще один персонаж.
Vatine
1
@Vatine С -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]

Это предлагает пользователю для ввода. Сначала запросите индекс, а затем номер А последовательности.

Мастер пшеницы
источник
Некоторые крошечные сейвы: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 байтов

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 Хорошо, готово.
Утренняя монахиня
@ Линн Да, потому что, видимо, я тупой.
Утренняя монахиня
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), взорвитесь в пространстве и распечатайте второй элемент массива из этого.

Samsquanch
источник
2

Nim , 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возвращает 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]

dbanet
источник
2

R 94 89 байт

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

Использование sprintfвместо paste0результатов в том же bytecount:

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

Пять байтов сохранены благодаря планнапу .

pajonk
источник
Жаль, что вы можете бесплатно загрузить библиотеку (stringr) и использовать str_sub для -2 байт ^^
AlexR
@AlexR Я не думаю, что могу бесплатно импортировать библиотеку ;-)
pajonk
К сожалению, в моем комментарии была опечатка - Жаль, что вы не можете . Это была только первая мысль для игры в гольф, потому что stringr - один из моих стандартных пакетов, загруженных в .Rprofile всех моих проектов.
AlexR
1
Вам не нужно использовать url, аргумент fileиз read.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получает строку в позиции 1. read-stringпреобразует строку в int. Я не уверен на 100%, всегда ли это регулярное выражение находит правильную строку.

NikoNyrh
источник
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.

plannapus
источник
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]))

Принимает идентификатор последовательности и номер.

Mama Fun Roll
источник
0

Юлия, 88 байт

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

Гольф с некоторой помощью @Dennis!

Убедитесь, что вы Requests.jlустановили перед запуском.

Mama Fun Roll
источник
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 запрещены

downrep_nation
источник