OEIS'i otomatikleştirin


26

Burada, OEIS'den bir sekans oluşturma işlevini isteyen birçok zorluk görüyoruz . Bu zorluklar eğlenceli olsa da, bir programcı olarak otomasyon için bir fırsat görüyorum.

Buradaki zorluk , bir dizinin indeksini alan bir program yapmaktır (örneğin A172141 ) ve bazı tamsayı n'yi (örneğin 7) alan ve uygun değeri ilgili web sayfasından .

I / O

Bahsedildiği gibi, programınız bir dizi indeksi ve girdi olarak bazı n değerlerini almalı ve bu dizideki n. Dizinin B dosyalarındaki herhangi bir dizini kabul ediyorsunuz . Dizin B-dosyalarında listelenen en büyük dizinden büyükse, seçtiğiniz herhangi bir istisna veya çıktı atabilirsiniz (bunlar test durumlarında değildir). Standart giriş ve çıkış yöntemlerine izin verilir.

Web kullanımındaki kısıtlamalar

Https://oeis.org ve http://oeis.org dışındaki hiçbir web sitesine erişmemelisiniz . Bu, URL kısaltıcıları, kendi kişisel web sitenizi ve bu sorunun kendisini içerir. Başka bir web sitesine erişmek istiyorsanız ve bunu yapmanıza izin vermenin haksızlık olmadığını düşünüyorsanız, yorum bırakabilirsiniz ve hakemlik edeceğim.

puanlama

Bu bir kod golf mücadelesidir, bu nedenle kaynak kodunda kullanılan en az bayt olan program kazanır. Standart boşluklara izin verilmez.

Test Kılıfları

Makinenizin uygun bir internet bağlantısına sahip olduğunu ve OEIS sunucularının çalıştığını ve aşağıdaki giriş ve çıkışların çalıştığını varsayalım.

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

Bahşiş

  • B dosyalarına erişirken http://oeis.org/b<A-number>.txtuygun B dosyasına yönlendirme yapılır.

1
Hangi endeksleri desteklememiz gerektiği bana göre belli değil. Son iki test durumları biz örneğin sorgulamak gerektiğini ima oeis.org/A000796/b000796.txtziyade oeis.org/A000796/list. Fomer B-dosyaları ile ne demek istiyorsun ? Bu durumda, dengelemeden bahsetmek oldukça gereksizdir.
Dennis,

@Dennis Üzgünüm, zaman içinde birden çok düzenlemenin sonucu olduğunu düşünüyorum. Netlik için düzenleyeceğim,
Buğday Sihirbazı

Bunun kum havuzunda daha fazla zaman geçirmesi gerektiğini düşünüyorum, çünkü b-dosyaları olmayan dizilerin desteklenmemesi niyetinde olmadığına eminim.
Peter Taylor

1
@PeeterWay, OeisWiki'ye göre "Belirli bir dizilim için herhangi bir b dosyası yüklenmemişse, sunucu otomatik olarak kullanılan araçlara kolaylık sağlamak için tam olarak görüntülenen terimleri içeren bir b dosyası oluşturur." bu yüzden her sıra için bir B dosyası olmalıdır. Her ne kadar bu meydan okumayı sanal alandan hareket ettirmekte haklı olabilirsin.
Buğday Sihirbazı

1
Bugün faydalı bir şey öğrendim.
Peter Taylor,

Yanıtlar:


11

Bash + coreutils + w3m, 51 45 42 bayt

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

3 baytlık golf oynamak için @EamonOlive'e teşekkürler!

Örnek çalışma

$ bash oeis.sh A172141 7
980

Nasıl çalışır

w3m , hem HTML hem de düz metni okunabilir biçimde görüntüleyen, metin tabanlı bir web tarayıcısıdır. Kıvrılmanın aksine, varsayılan olarak yönlendirmeleri izler (bunaoeis.org/bxxxxxx.txtyönlendirilir, çünküyönlendiriliroeis.org/Axxxxxx/bxxxxxx.txt), STDERR'ye herhangi bir başıboş çıktı vermez ve üç baytlık bir adı vardır.

Komuta

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

İstediğiniz URL, ${1:1}ilk karakteri olmayan ilk komut satırı argümanıdır.

Çıkış komuta aktarıldı

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

İstenilen çıktıyı ayıklar. boş dize ile s/^$2 //pdeğiştirmeye çalışır ^$2 (satırın başlangıcı, ardından ikinci komut satırı argümanı, ardından bir boşluk). Eğer ikame başarılı olursa, psonucunu yazdırır. Daha sonra, dkoşulsuz olarak model önlemek için siler sed tüm giriş basım.


Sen kullanarak birkaç byte kaydedebilirsiniz oeis.org/b${1:1}.txtyerineoeis.org/$1/b${1:1}.txt
Buğday Wizard

Heh, normalde kullanırdım sed -n ..., ama bu bir karakter daha olurdu.
Vatine

1
@Vatine İle -n, çift tırnak, aynı bayt sayısı için, çıkış alanıyla değiştirilebilir.
Dennis,

3

Perl, 59 bayt

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

İhtiyacı -M5.010veya -Ekoşması. Örneğin :

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

@Dennis cevabı sayesinde http://yaptığı gibi kaldırarak 8 bayt kurtardı .


2

CJam, 36 bayt

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

Örnek çalışma

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

2

Python 2, 125 118 113 bayt

Lynn sayesinde 7 12 bayt kaydedildi

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

Heres benim kendi problemimde. Muhtemelen yetersiz olabilir ama sanırım oldukça iyi bir iş yaptım. Bir dizgeyi ve tamsayı argüman olarak alan ve sonuç olarak bir dize döndüren veya dizin aralık dışındaysa bir hata atanan anonim bir işlev oluşturur.

Bu, 124 baytlık bir tam program haline getirilebilir.

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

Bu kullanıcıdan giriş yapmasını ister. İlk önce dizini ve ardından dizinin A numarasını sorar.


Bazı küçük tasarruflar: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,

Ve lambda x,y:re.split("%d (.*)"%y,u.urlopen("http://oeis.org/b%s.txt"%x[1:]).read())[1]hala daha kısa!
Lynn,

2

Python 3, 153 146 135 bayt

FryAmTheEggman sayesinde 7 bayt.

Eamon Olive sayesinde 6 bayt.

Rod sayesinde 5 bayt.

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

Buna şöyle diyoruz:

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

Varsayılan ayar olan utf-8 olan bir makinede çalıştırın.


1
Bence bir argüman için bir dize ve diğeri için bir bayt dizisi gerektiren bir girdi formatı çok hoş ve sadece baytları kodlamak için gereken baytları eklemelisiniz. Bu zorlukla ilgili hiçbir şey girdi olarak ham bayt gerektirmesini makul kılmaz.
orlp

Eğer değiştirilemiyor A%siçin %sve daha sonra ilk a[1:]için a?
Lynn

@ orlp Tamam, bitti.
Sızdıran Rahibe,

@ Lynn, çünkü görünüşe göre aptalım.
Sızdıran Rahibe,

1
@FryAmTheEggman Evet ve hayır. Varsayılan ayar, ortamın yerel ayarıdır.
Dennis,

2

PHP 5.6, 93 92 bayt

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

Bu oldukça yalındır. Sayfayı çekin, file()çizgiyi $line - 1(0-index) alın, uzayda patlayın ve ikinci dizi öğesini ondan yazdırın.


2

Nim , 123 115 113 bayt

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

Bu bir lambda ifadesidir; Bunu kullanmak için bir test prosedürüne argüman olarak geçilmelidir. Test için kullanılabilecek eksiksiz bir program burada verilmiştir:

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

Girdiyi iki karakter olarak bekler. Örnek kullanım:

$ nim c oeis.nim
$ ./oeis
980

Biz kullanmak httpclient'ın getContentardından, OEIS b- dosyasını almak için bir normal ifade kullanma proc findendeksi doğrultusunda. finddöndürür Option[RegexMatch], böylece getdeğeri almak için kullanırız Option. echootomatik olarak dize eder, bu yüzden dize bırakırız.


2

Mathematica + OEIS.m , 31

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

örnek kullanım: %[A172141,36]


Mathematica, 85

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

örnek kullanım: %["A002206",-1]


2

R, 94 89 bayt

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

Aynı bytecount'taki sonuçlar sprintfyerine kullanılması paste0:

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

Plannapus sayesinde beş bayt kurtarıldı .


Çok kötü ücretsiz kütüphane (stringr) ve -2 bayt için str_sub kullanabilirsiniz ^^
AlexR

@AlexR Bir kütüphaneyi ücretsiz olarak içe aktarabileceğimi sanmıyorum ;-)
pajonk

Hata benim yorum bir yazım hatası yoktu - Çok kötü olamaz . Golf için sadece bir düşünceydi, çünkü stringr tüm projelerimin .Rprofile'inde yüklenen varsayılan paketlerimden biriydi.
AlexR

1
Kullanılacak gerekmez url, argüman fileait read.tablebir karakter dizesi olarak URL olabilir.
plannapus

@ plannapus Gerçekten de doğru. Teşekkürler!
pajonk

1

Clojure, 103

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

re-findilk eşleşmenin regex gruplarının bir vektörünü bulur, bir fonksiyon olarak kullanılır ve 1dizeyi pozisyonuna getirir 1. read-stringstring'i int'ye dönüştürür. Bu regex her zaman doğru satırı bulursa% 100 emin değilim.


1

R, 87 bayt

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

URL dizesini pasteveya yerine regexes ile oluşturun sprintf.


0

Node.js + request, 109 bayt

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

Sıra kimliğini ve bir sayı alır.


0

Julia, 88 bayt

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

@Dennis'den yardım alarak golf oynadım!

Requests.jlÇalıştırmadan önce kurduğunuzdan emin olun .


0

ListSharp , 266 bayt

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]

Web hurdası için yapılan bir dil çok fazla satıra ihtiyaç duyduğunda üzücü çünkü ListSharp'ta iç içe geçmiş ifadeler tabu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.