Гольф Hilbert Primes


18

Числа Гільберта визначаються як натуральні числа форми 4n + 1для n >= 0. Перші кілька номерів Гільберта:

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

Послідовність номерів Гільберта задається послідовністю OEIS A016813 .

Пов'язана числова послідовність, праймерів Гільберта, визначається як числа Гільберта H > 1, які не поділяються на жодне число Гільберта, kтаке, що 1 < k < H. Перші кілька праймерів Гільберта:

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

Природно, у OEIS є і така послідовність .

З огляду на ціле число, nтаке 0 <= n <= 2^16як введення, виведіть nпросте гільбертове просте.

Це , тому застосовуються стандартні правила, і найкоротший код у байтах виграє.

Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує таблицю лідерів з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальну таблицю лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний результат - це останнє число у заголовку:

## Perl, 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке з’явиться у фрагменті:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Я думаю, ви маєте на увазі "не ділиться на" замість "відносно простого з". 21 і 9 поділяють загальний коефіцієнт 3.
xnor

Відповіді:


3

Pyth, 21 байт

Lh*4bye.fqZf!%yZyT1hQ

Спробуйте в Інтернеті: Демонстрація або Тестовий набір

Пояснення:

Lh*4bye.fqZf!%yZyT1Q    implicit: Q = input number
L                       define a function y(b), which returns
 h*4b                      4*b + 1
                        this converts a index to its Hilbert number
       .f          hQ   find the first (Q+1) numbers Z >= 1, which satisfy:
           f      1        find the first number T >= 1, which satisfies:
            !%yZyT            y(Z) mod y(T) == 0
         qZ                test if the result is equal to Z 

                        this gives a list of indices of the first Q Hilbert Primes
      e                 take the last index
     y                  apply y and print

11

Haskell, 46 байт

(foldr(\a b->a:[x|x<-b,mod x a>0])[][5,9..]!!)

Анонімна функція.

Ядро полягає в тому foldr(\a b->a:[x|x<-b,mod x a>0])[][5,9..], що воно повторюється за допомогою арифметичної прогресії 5,9,13,..., видаляючи кратні з кожного зі списку праворуч. Це створює нескінченний список праймерів Гільберта. Потім, !!приймає nго елемент.

Я спробував зробити (\a b->a:[x|x<-b,mod x a>0])pointfree, але не знайшов коротшого шляху.


3
Звернення foldrдо іншого списку розуміння заощаджує два баї:([x|x<-[5,9..],all((>0).mod x)[5,9..x-1]]!!)
nimi

@nimi Приємне рішення. Ви повинні це розмістити, це інший метод. Мені сумно, що вона коротша, хоча тому, що вона більше спрямована на визначення, і повторення списку менш симпатичне.
xnor

4

CJam, 36 33 32 23 байт

5ri{_L+:L;{4+_Lf%0&}g}*

Спробуйте в Інтернеті

Остання версія насправді набагато більше @ MartinBüttner, ніж моя. Основна ідея його запропонованого рішення полягає у використанні двох вкладених циклів для пошуку n-го значення, яке відповідає умові. Я думав, що я розумний, використовуючи лише один цикл у своєму оригінальному рішенні, але виявляється, що додана логіка коштувала дорожче, ніж я заощадив, не використовуючи другий цикл.

Пояснення

5       Push first Hilbert prime.
ri      Get input n and convert to integer.
{       Loop n times.
  _       Push a copy of current Hilbert prime.
  L       Push list of Hilbert primes found so far (L defaults to empty list).
  +       Prepend current Hilbert prime to list.
  :L      Store new list of Hilbert primes in variable L.
  ;       Pop list off stack.
  {       Start while loop for finding next Hilbert prime.
    4+      Add 4 to get next Hilbert number.
    _       Copy candidate Hilbert number.
    L       Push list of Hilbert primes found so far.
    f%      Element wise modulo of Hilbert number with smaller Hilbert primes.
    0&      Check for 0 in list of modulo values.
  }g      End while loop.
}*      End loop n times.

2

Мінколанг 0,14 , 46 37 32 байт

Я не усвідомлював, що гусак зовсім непотрібний ...> _>

n$z(xxi4*5+d(4-$d%)1=,z+$ziz-)N.

Спробуйте тут і перевірте всі тестові справи тут .

Пояснення

n$z                                 Take number from input and store it in the register
   (                                Open while loop
    xx                              Dump the stack
      i4*5+                         Loop counter times 4 plus 5 (Hilbert number)
           d                        Duplicate
            (                       Open while loop
             4-                     Subtract 4
               $d                   Duplicate stack
                 %                  Modulo
                  )                 Exit while loop when top of stack is 0
                   1=,              0 if 1, 1 otherwise
                      z             Push register value
                       +            Add
                        $z          Pop and store in register
                          iz-       Subtract z from loop counter
                             )      Exit while loop when top of stack is 0
                              N.    Output as number and stop.

Реєстр використовується для зберігання цільового індексу. Зовнішній цикл while обчислює кожне число Гільберта і здійснює деяку бухгалтерію. Внутрішній цикл while перевіряє кожен номер Гільберта на первинність. Якщо число Гільберта не є простим Гільбертом, то ціль збільшується так, що зовнішня петля повинна повторюватися (принаймні) ще один раз, ефективно пропускаючи гільбертові композити.


2

Математика, 65 байт

Select[4Range[4^9]+1,Divisors[#][[2;;-2]]~Mod~4~FreeQ~1&][[#+1]]&

Генерує весь список і вибирає з нього елемент.


1

Рубін, 60 байт

h=->i{n=[];x=5;n.any?{|r|x%r<1}?x+=4: n<<x until e=n[i-1];e}

Тільки перевіряє Гільберт прості фактори.


0

JavaScript (ES6), 73 байти

n=>{for(i=0,t=2;i<=n;)i+=!/^(.(....)+)\1+$/.test(Array(t+=4));return t-1}

Просто перевіряйте цифри Гільберта по одному, поки ми не досягнемо п’ятого простого Гільберта. Поділ за номером Гільберта обробляється за допомогою регулярного вираження.


0

Матлаб, 74 83 байт

function t=H(n)
x=5;t=x;while nnz(x)<n
t=t+4;x=[x t(1:+all(mod(t,x)))];end

Дякуємо Тому Карпентеру за видалення 9 байт!

Приклад використання:

>> H(20)
ans =
   101

@TomCarpenter Дякую! Тепер ця відповідь більше, ніж моя :-)
Луїс Мендо

Ласкаво просимо :). Це все-таки ваша логіка, просто застосувавши кілька трюків, яких я навчився на цьому шляху.
Том Карпентер

0

Джулія, 73 байти

n->(a=[x=5];while length(a)<n;x+=4;all(k->mod(x,k)>0,a)&&push!(a,x)end;x)

Дякую Алексу А. за збереження 11 байт! Для цього використовується той же алгоритм, що і відповіді Matlab і Ruby. Оскільки масиви Джулії є одноіндексованими, це починається з f(1) == 5.

Моя перша спроба, використовуючи пакет Lazy, - це 106 байт . Якщо ви плануєте запустити це в REPL, не забудьте додати крапки з комою до кінців рядків, щоб придушити нескінченний вихід. І зателефонуйте, Pkg.Add("Lazy")якщо у вас його ще не встановлено.

using Lazy
r=range
h=r(1,Inf,4)
p=@>>r() filter(n->n!=1&&all(map(x->mod(h[n],h[x])<1,2:n-1)))
f=n->h[p[n]]

1
73 байти:n->(a=[x=5];while length(a)<n x+=4;all(k->mod(x,k)>0,a)&&push!(a,x)end;x)
Алекс А.

1
Ви можете зберегти ще кілька, використовуючи endofзамість lengthі x%kзамість mod(x,k).
Олексій А.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.