Zautomatyzuj OEIS

26

Widzimy tutaj wiele wyzwań wymagających funkcji do utworzenia sekwencji z OEIS . Chociaż wyzwania te są zabawne, jako programista widzę szansę na automatyzację.

Wyzwanie polega na stworzeniu programu, który pobiera indeks sekwencji (np. A172141 ) i pewną liczbę całkowitą n (np. 7) i pobiera odpowiednią wartość z odpowiedniej strony internetowej.

I / O

Jak wspomniano, twój program powinien przyjmować indeks sekwencji i pewną wartość n jako dane wejściowe i wyjściowe n-tego terminu w tej sekwencji. Akceptujesz dowolny indeks w plikach B sekwencji . Jeśli indeks jest większy niż największy indeks wymieniony w plikach B, możesz zgłosić wyjątek lub wydrukować cokolwiek wybierzesz (nie ma ich w przypadkach testowych). Standardowe metody wejścia i wyjścia są dozwolone.

Ograniczenia w korzystaniu z Internetu

Nie należy uzyskiwać dostępu do witryn innych niż https://oeis.org i http://oeis.org . Obejmuje to skracacze adresów URL, twoją własną stronę internetową i to pytanie. Jeśli chcesz uzyskać dostęp do innej witryny i uważasz, że nie jest to niesprawiedliwe, możesz zostawić komentarz, a ja rozstrzygnę.

Punktacja

Jest to wyzwanie związane z golfem, więc wygrywa program z najmniejszą liczbą bajtów w kodzie źródłowym. Standardowe luki są niedozwolone.

Przypadki testowe

Zakładając, że twoje urządzenie ma właściwe połączenie z Internetem, a serwery OEIS są uruchomione i działają następujące dane wejściowe i wyjściowe powinny odpowiadać.

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

Wskazówka

  • Podczas uzyskiwania dostępu do plików B http://oeis.org/b<A-number>.txtnastąpi przekierowanie do odpowiedniego pliku B.
Kreator pszenicy
źródło
1
Nie jest dla mnie jasne, które wskaźniki musimy wspierać. Ostatnie dwa przypadki testowe sugerują, że powinniśmy zapytać np. oeis.org/A000796/b000796.txtZamiast oeis.org/A000796/list. Czy fomer ma na myśli pliki B ? W takim przypadku wzmianka o przesunięciu jest raczej zbędna.
Dennis,
@Dennis Przepraszam, myślę, że było to wynikiem wielu zmian w czasie. Zredaguję dla jasności,
Wheat Wizard
Myślę, że powinno to spędzić więcej czasu w piaskownicy, ponieważ jestem pewien, że nie było twoją intencją, aby sekwencje bez plików B nie były obsługiwane.
Peter Taylor,
1
@PeterTaylor według OeisWiki „Jeśli żaden plik b nie został przesłany dla określonej sekwencji, serwer generuje plik b zawierający dokładnie wyświetlane warunki, dla wygody za pomocą zautomatyzowanych narzędzi”. więc dla każdej sekwencji powinien znajdować się plik B. Chociaż możesz mieć rację, przedwcześnie przenosząc to wyzwanie z piaskownicy.
Wheat Wizard
1
Nauczyłem się dziś czegoś przydatnego.
Peter Taylor,

Odpowiedzi:

11

Bash + coreutils + w3m, 51 45 42 bajtów

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

Dzięki @EamonOlive za grę w golfa z 3 bajtów!

Przykładowy przebieg

$ bash oeis.sh A172141 7
980

Jak to działa

w3m to oparta na tekście przeglądarka internetowa, która wyświetla zarówno HTML, jak i zwykły tekst w czytelnym formacie. W przeciwieństwie do curl , domyślnie podąża za przekierowaniami (jest to wymagane, ponieważoeis.org/bxxxxxx.txtprzekierowuje dooeis.org/Axxxxxx/bxxxxxx.txt), nie generuje żadnych zbłąkanych danych wyjściowych do STDERR i ma trzy bajtową nazwę.

Komenda

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

żądany adres URL, gdzie ${1:1}jest pierwszym argumentem wiersza polecenia bez pierwszego znaku.

Dane wyjściowe są przesyłane potokowo do polecenia

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

który wyodrębnia pożądane wyjście. s/^$2 //ppróbuje zastąpić ^$2 (początek wiersza, następnie drugi argument wiersza polecenia, a następnie spację) pustym ciągiem. Jeśli podstawienie zakończy się powodzeniem, pdrukuje swój wynik. Następnie dbezwarunkowo usuwa wzór, aby uniemożliwić sedowi wydrukowanie całego wejścia.

Dennis
źródło
Możesz zaoszczędzić kilka bajtów, używając oeis.org/b${1:1}.txtzamiastoeis.org/$1/b${1:1}.txt
Wheat Wizard
Heh, normalnie bym użył sed -n ..., ale to byłaby jeszcze jedna postać.
Vatine
1
@Vatine With -n, podwójne cudzysłowy można zastąpić spacją, dla tej samej liczby bajtów.
Dennis,
3

Perl, 59 bajtów

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

Potrzebuje -M5.010lub -Euruchomić. Na przykład :

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

Zaoszczędzono 8 bajtów dzięki odpowiedzi @Dennis , usuwając http://tak jak on.

Dada
źródło
2

CJam, 36 bajtów

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

Przykładowy przebieg

$ cjam oeis.cjam <<< 'A172141 7'
980
Dennis
źródło
2

Python 2, 125 118 113 bajtów

7 12 bajtów zapisanych dzięki 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]

Oto mój problem. Prawdopodobnie jest to nieoptymalne, ale myślę, że wykonałem całkiem przyzwoitą robotę. Tworzy anonimową funkcję, która jako argument przyjmuje ciąg i liczbę całkowitą i zwraca ciąg jako wynik lub generuje błąd, jeśli indeks jest poza zakresem.

Można to zrobić w program o pełnej długości 124 bajtów.

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

To monituje użytkownika o podanie danych wejściowych. Najpierw pytając o indeks, a następnie numer A sekwencji.

Kreator pszenicy
źródło
Kilka drobnych zapisów: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,
I lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]jest jeszcze krótszy!
Lynn,
2

Python 3, 153 146 135 bajtów

7 bajtów dzięki FryAmTheEggman.

6 bajtów dzięki Eamonowi Olive.

5 bajtów dzięki 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

Nazwij to tak:

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

Uruchom na komputerze, którego domyślnym ustawieniem jest utf-8.

Leaky Nun
źródło
1
Moim zdaniem wymaganie łańcucha dla jednego argumentu, a tablicy bajtów dla innego jest zbyt pobłażliwym formatem wejściowym i powinieneś po prostu dodać bajty wymagane do samodzielnego zakodowania w bajtach. Nic w tym wyzwaniu nie uzasadnia żądania surowych bajtów jako danych wejściowych.
orlp
Nie możesz się zmienić A%sna, %sa potem pierwszy a[1:]na a?
Lynn,
@orlp W porządku, gotowe.
Leaky Nun
@ Lynn Tak, bo najwyraźniej jestem głupia.
Leaky Nun
1
@FryAmTheEggman Tak i nie. Domyślnie są to ustawienia regionalne środowiska.
Dennis
2

PHP 5.6, 93 92 bajty

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

Ten jest całkiem prosty. Pociągnij stronę za file(), uzyskaj linię o $line - 1(indeks 0), eksploduj w przestrzeni i wydrukuj z niej drugi element tablicy.

Samsquanch
źródło
2

Nim , 123 115 113 bajtów

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

To jest wyrażenie lambda; aby go użyć, musi zostać przekazany jako argument do procedury testowej. Pełny program, który można wykorzystać do testowania, znajduje się tutaj:

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

Oczekuje danych wejściowych jako dwóch ciągów. Przykładowe użycie:

$ nim c oeis.nim
$ ./oeis
980

Używamy httpclient„s getContentproc dostać B-plik OEIS, a następnie użyć wyrażenia regularnego do findwiersza z indeksu. findzwraca an Option[RegexMatch], więc używamy getdo pobierania wartości z Option. echoautomatycznie strunizuje, więc wykluczamy strunizację.

Miedź
źródło
2

Mathematica + OEIS.m , 31

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

przykładowe użycie: %[A172141,36]


Mathematica, 85

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

przykładowe użycie: %["A002206",-1]

dbanet
źródło
2

R, 94 89 bajtów

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

Używanie sprintfzamiast paste0wyników w tym samym bajcie:

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

Pięć bajtów zaoszczędzonych dzięki plannapusowi .

pajonk
źródło
Szkoda, że ​​możesz bibliotekę (stringr) za darmo i używać str_sub dla -2 bajtów ^^
AlexR
@AlexR Nie sądzę, że mogę zaimportować bibliotekę za darmo ;-)
pajonk 12.08.16
Ups, w moim komentarzu była literówka - Szkoda, że nie możesz . To była tylko pierwsza myśl do gry w golfa, ponieważ stringr jest jednym z moich domyślnych pakietów załadowanych do .Rprofile wszystkich moich projektów.
AlexR
1
Nie trzeba używać urlargumentu fileo read.tablemoże być URL jako ciąg znaków.
plannapus
@plannapus Rzeczywiście, właśnie tak. Dzięki!
pajonk
1

Clojure, 103

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

re-findznajduje wektor grup wyrażeń regularnych pierwszego Matchera, jest używany jako funkcja i 1pobiera ciąg znaków w pozycji 1. read-stringkonwertuje ciąg na int. Nie jestem w 100% pewien, czy wyrażenie regularne zawsze znajdzie poprawny wiersz.

NikoNyrh
źródło
1

R, 87 bajtów

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

Zbuduj ciąg adresu URL za pomocą wyrażeń regularnych zamiast pastelub sprintf.

plannapus
źródło
0

Node.js + request, 109 bajtów

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

Pobiera identyfikator sekwencji i liczbę.

Mama Fun Roll
źródło
0

Julia, 88 bajtów

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

Grał w golfa z pomocą @Dennis!

Upewnij się, że Requests.jlzainstalowałeś przed uruchomieniem.

Mama Fun Roll
źródło
0

ListSharp , 266 bajtów

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]

To smutne, gdy język stworzony do skrobania stron internetowych potrzebuje tak wielu wierszy, ponieważ zagnieżdżanie instrukcji w ListSharp jest tabu

downrep_nation
źródło