Liczby Hilberta są zdefiniowane jako dodatnie liczby całkowite formularza 4n + 1
dla n >= 0
. Pierwsze kilka liczb Hilberta to:
1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97
Sekwencja liczb Hilberta jest podana przez sekwencję OEIS A016813 .
Pokrewną sekwencję liczb, liczby pierwsze Hilberta, definiuje się jako liczby Hilberta H > 1
, które nie są podzielne przez żadną liczbę Hilberta, k
taką jak 1 < k < H
. Pierwsze kilka liczb pierwszych Hilberta to:
5, 9, 13, 17, 21, 29, 33, 37, 41, 49, 53, 57, 61, 69, 73, 77, 89, 93, 97, 101, 109, 113, 121, 129, 133, 137, 141, 149, 157, 161, 173, 177, 181, 193, 197
Oczywiście OEIS ma również tę sekwencję .
Biorąc pod uwagę liczbę całkowitą n
taką, 0 <= n <= 2^16
jak na wejściu, n
wyślij pierwszą liczbę pierwszą Hilberta.
Jest to gra w golfa , więc obowiązują standardowe zasady, a wygrywa najkrótszy kod w bajtach.
Tabela liderów
Fragment kodu na dole tego postu generuje tabelę wyników na podstawie odpowiedzi a) jako lista najkrótszych rozwiązań dla każdego języka oraz b) jako ogólna tabela wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 65895; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Odpowiedzi:
Pyth, 21 bajtów
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
źródło
Haskell, 46 bajtów
Anonimowa funkcja.
Rdzeń polega na
foldr(\a b->a:[x|x<-b,mod x a>0])[][5,9..]
iteracji poprzez postęp arytmetyczny5,9,13,...
, usuwając wielokrotności każdego z listy po prawej stronie. To tworzy nieskończoną listę liczb pierwszych Hilberta. Następnie!!
bierzen
element th.Próbowałem zrobić
(\a b->a:[x|x<-b,mod x a>0])
bezcelowe, ale nie znalazłem krótszej drogi.źródło
foldr
w inną listę pozwala zaoszczędzić dwa znaki:([x|x<-[5,9..],all((>0).mod x)[5,9..x-1]]!!)
CJam,
36333223 bajtówWypróbuj online
Najnowsza wersja jest w rzeczywistości o wiele bardziej @ MartinBüttnera niż moja. Kluczową ideą w jego sugerowanym rozwiązaniu jest użycie dwóch zagnieżdżonych pętli w celu znalezienia n-tej wartości spełniającej warunek. Myślałem, że jestem sprytny, używając tylko jednej pętli w moim oryginalnym rozwiązaniu, ale okazuje się, że dodatkowa logika kosztuje więcej niż zaoszczędziłem, nie używając drugiej pętli.
Wyjaśnienie
źródło
Minkolang 0,14 ,
463732 bajtówNie zdawałem sobie sprawy, że gosub był całkowicie niepotrzebny ...> _>
Wypróbuj tutaj i sprawdź tutaj wszystkie przypadki testowe .
Wyjaśnienie
Rejestr służy do przechowywania indeksu docelowego. Zewnętrzna pętla while oblicza każdą liczbę Hilberta i wykonuje księgowość. Wewnętrzna pętla while sprawdza pierwszeństwo każdej liczby Hilberta. Jeśli liczba Hilberta nie jest liczbą pierwszą Hilberta, cel jest zwiększany, tak że zewnętrzna pętla while musi się powtarzać (przynajmniej) jeszcze raz, skutecznie pomijając kompozyty Hilberta.
źródło
Mathematica, 65 bajtów
Generuje całą listę i wybiera z niej element.
źródło
Rubinowy, 60 bajtów
Sprawdza tylko czynniki pierwsze Hilberta.
źródło
JavaScript (ES6), 73 bajty
Po prostu sprawdzaj liczby Hilberta jeden po drugim, aż dotrzemy do n-tej liczby pierwszej Hilberta. Podzielność według liczby Hilberta jest obsługiwana przez regex.
źródło
Matlab, 74
83bajtówDzięki Tom Carpenter za usunięcie 9 bajtów!
Przykładowe zastosowanie:
źródło
Julia, 73 bajty
Dzięki Alex A. za uratowanie 11 bajtów! Używa tego samego algorytmu, co odpowiedzi Matlab i Ruby. Ponieważ tablice Julii mają jeden indeks, zaczyna się od
f(1) == 5
.Moja pierwsza próba, używając pakietu Lazy, to 106 bajtów . Jeśli planujesz uruchomić to w REPL, pamiętaj o dodaniu średników na końcach linii, aby stłumić nieskończone wyjście. I zadzwoń,
Pkg.Add("Lazy")
jeśli jeszcze go nie masz.źródło
n->(a=[x=5];while length(a)<n x+=4;all(k->mod(x,k)>0,a)&&push!(a,x)end;x)
endof
zamiastlength
ix%k
zamiastmod(x,k)
.