W tym wyzwaniu celem jest odtworzenie On-Line Encyclopedia of Integer Sequences po jednej sekwencji na raz. Podobnie jak w przypadku Evolution of Hello World , każda odpowiedź zależy od poprzedniej.
Z czasem to wyzwanie stworzy „drzewo genealogiczne” sekwencji OEIS. Łatwo jest dodać do tego drzewa.
- Znajdź poprzednią odpowiedź, która może znajdować się na dowolnej głębokości N drzewa.
- Określ pierwsze N liczb wygenerowanych przez sekwencję tej odpowiedzi.
- Znajdź sekwencję w OEIS, która zaczyna się od tych samych numerów i która nie była wcześniej używana.
- Napisz program do wygenerowania nowej sekwencji, którą właśnie znalazłeś.
- Prześlij swoją odpowiedź jako głębokość N + 1
Ponieważ poziom twojej odpowiedzi wpływa na punktację, zawsze powinieneś dodawać swoją odpowiedź do drzewa na możliwie najgłębszym poziomie. Jeśli nie możesz znaleźć odpowiedzi w dowolnym miejscu na drzewie, możesz założyć nową gałąź drzewa i ustawić swoją odpowiedź jako głębokość 1.
Wymagania dotyczące odpowiedzi
Istnieje kilka sposobów generowania sekwencji.
Pierwszą opcją jest napisanie programu lub funkcji, która wprowadza liczbę (z STDIN lub jako argument) i zwraca N-tą liczbę w wybranej sekwencji. Możesz założyć, że sekwencja zostanie zdefiniowana dla N i że N i S_N mają „rozsądną wielkość” (więc nie spowoduje to przepełnienia). Możesz także użyć dowolnego rozsądnego indeksowania, takiego jak indeksowanie 0, indeksowanie 1 lub indeksowanie wymienione w „przesunięciu” na stronie OEIS sekwencji, co nie ma znaczenia. Termin wytworzony przez pierwszy indeks musi być zgodny z pierwszym terminem wpisu OEIS.
Drugą opcją jest napisanie programu lub funkcji, która wprowadza liczbę i zwraca pierwsze N wyrazów sekwencji. Pierwsze warunki wyniku muszą być pierwszymi warunkami wpisu OEIS (nie można pominąć kilku pierwszych warunków). Kolejne terminy muszą być rozdzielane dowolnymi ciągami znaków innych niż cyfry, więc 0,1 1.2/3,5;8,11
działa, ale 011235811
się nie liczy.
Trzecią opcją jest stworzenie programu, który generuje ciągły strumień liczb. Podobnie jak w przypadku drugiej opcji, pomiędzy kolejnymi terminami muszą znajdować się separatory.
Twoja odpowiedź powinna zawierać taki nagłówek, aby ułatwić analizowanie fragmentu kodu:
# [language], [number] bytes, depth [number], A[new sequence] from A[old sequence]
Twoja odpowiedź powinna zawierać kod do wygenerowania sekwencji, wraz z pierwszymi kilkoma terminami, które muszą zawierać potomkowie. Te kilka terminów powinno być poprzedzonych dokładnym słowem,terms:
aby kontroler mógł użyć ich jako części diagramu drzewa. Zaleca się również napisanie opisu wybranej sekwencji.
Jeśli Twój post jest odpowiedzią na głębokość 1, a zatem nie ma przodka, po prostu pomiń wpis from A[number]
w nagłówku.
Oto przykładowa odpowiedź:
# Perl, 26 bytes, depth 3, A026305 from A084912
various code here
and here
The next answer should match the following terms:
1, 4, 20
This sequence is .... and does ....
Łączenie wymagań
Aby uczynić to wyzwanie bardziej sprawiedliwym, istnieją ograniczenia dotyczące odpowiedzi, do których możesz połączyć swoje odpowiedzi. Reguły te mają przede wszystkim na celu uniemożliwienie jednej osobie utworzenia całej gałęzi drzewa samodzielnie lub posiadania wielu węzłów „root”.
- Nie możesz przykuć do siebie.
- Nie możesz bezpośrednio połączyć dwóch swoich odpowiedzi z tym samym przodkiem.
- Nie możesz udzielić więcej niż jednej odpowiedzi „Poziomu 1”.
Ponadto, jeśli przodek miał głębokość N, twój post musi mieć głębokość N + 1, nawet jeśli zgadza się więcej niż wymagana liczba warunków.
Punktacja
Twój wynik jako użytkownika jest sumą wyników wszystkich twoich odpowiedzi. Wynik pojedynczej odpowiedzi zależy od następującego wzoru:
Answer Score = Sqrt(Depth) * 1024 / (Length + 256)
Ten system punktacji powinien zachęcać użytkowników do przesyłania dużej liczby głębszych odpowiedzi. Preferowane są krótsze odpowiedzi niż dłuższe, ale głębia ma znacznie większy wpływ.
Poniżej znajduje się fragment stosu, który generuje tabelę wyników, a także schemat drzewa wszystkich odpowiedzi. Chciałbym podziękować Martinowi Büttnerowi i d3noob jako źródłom dużej części tego kodu. Kliknij „Pełny ekran”, aby zobaczyć pełne wyniki.
function answersUrl(t){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+t+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(t){answers.push.apply(answers,t.items),t.has_more?getAnswers():process()}})}function shouldHaveHeading(t){var e=!1,r=t.body_markdown.split("\n");try{e|=/^#/.test(t.body_markdown),e|=["-","="].indexOf(r[1][0])>-1,e&=LANGUAGE_REG.test(t.body_markdown)}catch(a){}return e}function shouldHaveScore(t){var e=!1;try{e|=SIZE_REG.test(t.body_markdown.split("\n")[0])}catch(r){}return e}function getAuthorName(t){return t.owner.display_name}function decodeEntities(t){return $("<textarea>").html(t).text()}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.reverse();var t={},e=[],r=1,a=null,n=1,s=[];answers.forEach(function(t){var r=t.body_markdown.split("\n")[0],a=getAuthorName(t),n=r.match(SEQUENCE_REG)[0];n=n.trim();var o="from A000000";PARENT_REG.test(r)&&(o=r.match(PARENT_REG)[0]),o=o.substring(5).trim(),"A000000"==o&&(o="OEIS");var i="";SEQDATA_REG.test(t.body_markdown)&&(i=t.body_markdown.match(SEQDATA_REG)[1]);for(var u=!0,c=0;c<e.length;++c)u=u&&!(e[c]===n);for(var l=!0,c=0;c<e.length;++c)l=!(!l||e[c]===n||e[c]===n+a||e[c]===o+a);e.push(n),e.push(n+a),e.push(o+a),u&&data.push({name:n,parent:o,term:i+" : ",author:decodeEntities(a),URL:t.share_link}),l&&s.push(t)}),answers.sort(function(t,e){var r=t.body_markdown.split("\n")[0].match(SEQUENCE_REG),a=e.body_markdown.split("\n")[0].match(SEQUENCE_REG);return a>r?-1:r>a?1:void 0}),answers.forEach(function(e){var o=e.body_markdown.split("\n")[0],i=(o.match(NUMBER_REG)[0],(o.match(SIZE_REG)||[0])[0]),u=parseInt((o.match(DEPTH_REG)||[0])[0]).toString(),c=o.match(SEQUENCE_REG)[0],l="from A000000";PARENT_REG.test(o)&&(l=o.match(PARENT_REG)[0]),l=l.substring(5);var d=o.match(LANGUAGE_REG)[1];d.indexOf("]")>0&&(d=d.substring(1,d.indexOf("]")));for(var p=getAuthorName(e),E=!1,h=0;h<s.length;++h)E=E||s[h]===e;if(E){var f=jQuery("#answer-template").html();i!=a&&(n=r),a=i,++r;var m=1024*Math.pow(parseInt(u),.5)/(parseInt(i)+256);f=f.replace("{{SEQUENCE}}",c).replace("{{SEQUENCE}}",c).replace("{{NAME}}",p).replace("{{LANGUAGE}}",d).replace("{{SIZE}}",i).replace("{{DEPTH}}",u).replace("{{LINK}}",e.share_link),f=jQuery(f),jQuery("#answers").append(f),t[p]=t[p]||{lang:d,user:p,size:"0",numanswers:"0",link:e.share_link},t[p].size=(parseFloat(t[p].size)+m).toString(),t[p].numanswers=(parseInt(t[p].numanswers)+1).toString()}});var o=[];for(var i in t)t.hasOwnProperty(i)&&o.push(t[i]);o.sort(function(t,e){return parseFloat(t.size)>parseFloat(e.size)?-1:parseFloat(t.size)<parseFloat(e.size)?1:0});for(var u=0;u<o.length;++u){var c=jQuery("#language-template").html(),i=o[u];c=c.replace("{{RANK}}",u+1+".").replace("{{NAME}}",i.user).replace("{{NUMANSWERS}}",i.numanswers).replace("{{SIZE}}",i.size),c=jQuery(c),jQuery("#languages").append(c)}createTree()}function createTree(){function t(){var t=i.nodes(root).reverse(),e=i.links(t);t.forEach(function(t){t.y=180*t.depth});var r=c.selectAll("g.node").data(t,function(t){return t.id||(t.id=++o)}),a=r.enter().append("g").attr("class","node").attr("transform",function(t){return"translate("+t.y+","+t.x+")"});a.append("a").attr("xlink:href",function(t){return t.URL}).append("circle").attr("r",10).style("fill","#fff"),a.append("text").attr("x",function(){return 0}).attr("y",function(){return 20}).attr("dy",".35em").attr("text-anchor",function(){return"middle"}).text(function(t){return t.term+t.name}).style("fill-opacity",1),a.append("text").attr("x",function(){return 0}).attr("y",function(){return 35}).attr("dy",".35em").attr("text-anchor",function(){return"middle"}).text(function(t){return t.author}).style("fill-opacity",1);var n=c.selectAll("path.link").data(e,function(t){return t.target.id});n.enter().insert("path","g").attr("class","link").attr("d",u)}var e=data.reduce(function(t,e){return t[e.name]=e,t},{}),r=[];data.forEach(function(t){var a=e[t.parent];a?(a.children||(a.children=[])).push(t):r.push(t)});var a={top:20,right:120,bottom:20,left:120},n=3203-a.right-a.left,s=4003-a.top-a.bottom,o=0,i=d3.layout.tree().size([s,n]),u=d3.svg.diagonal().projection(function(t){return[t.y,t.x]}),c=d3.select("body").append("svg").attr("width",n+a.right+a.left).attr("height",s+a.top+a.bottom).append("g").attr("transform","translate("+a.left+","+a.top+")");root=r[0],t(root)}var QUESTION_ID=49223,ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",data=[{name:"OEIS",parent:"null",term:"",author:"",URL:"https://oeis.org/"}],answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*,)/,DEPTH_REG=/\d+, A/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/,SEQUENCE_REG=/A\d+/,PARENT_REG=/from\s*A\d+/,SEQDATA_REG=/terms:\s*(?:(?:-)?\d+,\s*)*((?:-)?\d+)/;
body{text-align: left !important}#answer-list{padding: 10px; width: 550px; float: left;}#language-list{padding: 10px; width: 290px; float: left;}table thead{font-weight: bold;}table td{padding: 5px;}.node circle{fill: #fff; stroke: steelblue; stroke-width: 3px;}.node text{font: 12px sans-serif;}.link{fill: none; stroke: #ccc; stroke-width: 2px;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script src="http://d3js.org/d3.v3.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Sequence List</h2> <table class="answer-list"> <thead> <tr> <td>Sequence</td><td>Author</td><td>Language</td><td>Size</td><td>Depth</td></tr></thead> <tbody id="answers"></tbody> </table></div><div id="language-list"> <h2>Leaderboard</h2> <table class="language-list"> <thead> <tr> <td>Rank</td><td>User</td><td>Answers</td><td>Score</td></tr></thead> <tbody id="languages"></tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr> <td><a href="https://oeis.org/{{SEQUENCE}}">{{SEQUENCE}}</a></td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td>{{DEPTH}}</td><td><a href="{{LINK}}">Link</a> </td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr> <td>{{RANK}}</td><td>{{NAME}}</td><td>{{NUMANSWERS}}</td><td>{{SIZE}}</td></tr></tbody></table>