Роздрукуйте відсутні проліски


18

Завдання

Напишіть програму або функцію, яка при передачі числового вводу xдрукує або повертає праймери під квадратний корінь x1 , які не є чинниками x.

Приклади

Нехай f(x)функція називається:

>>> f(4)
[]

>>> f(5)
[2]

>>> f(20)
[3]

>>> f(60)
[7]

>>> f(100)
[3, 7]

>>> f(10000)
[3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Правила бонусу

  • Ви можете використовувати будь-які вбудовані файли, які надає ваша мова.
  • Ваша програма повинна підтримувати xвведення на висоті, як верхня межа, визначена вашою мовою.

1 Використання квадратного кореня як лише простих розмірів нижче квадратного кореня може бути фактично задіяно в межах факторів x. Без цього обмеження великі номери матимуть велику кількість надрукованих номерів.


3
"Тільки праймери нижче квадратного кореня дійсно можуть бути задіяні в межах факторів x", неправда: число може мати один простий коефіцієнт, більший за його квадратний корінь. Дійсно, у ваших перших двох прикладах (5 і 20) є ця властивість, як і у всіх прайменів, удвічі більше непарних праймерів, ....
Грег Мартін

1
@GregMartin Так, вони можуть, але їх не можна знайти в першій половині факторів. Має сенс не включати 7 до пропущених праймерів 48, оскільки 7 ^ 2 перевищує 48. (мої міркування лежать там)
Аддісон Крам

Відповіді:


8

Желе, 6 байт у кодовій сторінці Jelly

½ÆRḟÆf

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

Пояснення:

½ÆRḟÆf
 ÆR    All primes less than or equal to
½      the square root of the input
   ḟ   but with the following removed:
    Æf All prime factors of {the input, by default}

5
Відповіді на желе часто просто дослівно описують виклик: P
ETHproductions



5

MATLAB, 57 54 байти

function h(p);a=primes(p^.5);a(~ismember(a,factor(p)))

Досить просто, отримує масив праймерів до sqrt (p), а потім видаляє будь-які, які також є чинниками p. Друкує вихід останнього рядка за замовчуванням, тому що крапка з комою залишилася.


1
Я ніколи не пробував MATLAB, але згідно з тим, що я читав про нього, sqrt (p) може бути записаний як p ^ 0,5 або, можливо, p ^ .5, хоча я не впевнений у другій пропозиції
t-clausen.dk

Приємно! :) Я опублікував подання Octave, використовуючи той самий підхід.
Стюі Гріффін

4

Pyth, 10 байт

fP_T-S@Q2P

Програма, яка приймає введення числа та друкує список.

Тестовий набір

Як це працює

fP_T-S@Q2P   Program. Input: Q
fP_T-S@Q2PQ  Implicit input fill
f            Filter
     S@Q2    the 1-indexed range up to floor(sqrt(Q))
    -    PQ  with the prime factors of Q removed
 P_T         by primality
             Implicitly print


3

PHP, 76 байт

for($n=1;++$n*$n<$x=$argv[1];){for($i=$n;$n%--$i;);if($i<2&&$x%$n)echo$n,_;}

використовує моє рішення is_prime для гольфу за $ n> 1

приймає дані з аргументу командного рядка. Бігайте з -r.


2

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

Select[Prime@Range@PrimePi@Sqrt[a=#],!#∣a&]&

Анонімна функція. Приймає число як вхід і повертає список номерів як вихід. Символ Unicode - U + 2223 DIVIDES для \[Divides].


2

Рубін, 55 байт

require'prime'
->x{Prime.to_a(x**0.5).select{|n|x%n>0}}

Досить ледача відповідь, використовуючи вбудований основний перелік.


2

Диво , 14 байт

@(_> > ^#0.5)P

Використання:

(@(_> > ^#0.5)P)10

Бере елементи з нескінченного списку простих ліній, тоді як елемент менше квадратного кореня аргументу.



2

PowerShell v2 +, 71 байт

param($n)1..[math]::Sqrt($n)|?{$n%$_-and'1'*$_-match'^(?!(..+)\1+$)..'}

Ітеративне рішення. Здійснює введення $nта створює діапазон від 1до Sqrt($n)(зауважте, що оператор діапазону неявно відкидає верхній край до того, [int]що за замовчуванням зробить Округлення Банкіра). Потім використовує |?{...}(далі Where-Objectоператор, який діє як фільтр) , щоб витягнути ці цифри , де $n%$_не дорівнює нулю (тобто будь-який залишок на кошти по модулю це не є визначальним фактором, і будь-який ненульовий є truthy) просте випробування зазвичай регулярний вираз є-and$true . Вони залишилися на конвеєрі, а вихід неявний.

Приклади

(з деяким додатковим форматуванням, щоб значно збільшити результат)

PS C:\Tools\Scripts\golfing> 5,20,60,100,10000|%{"f($_)";(.\print-the-missing-primes.ps1 $_)-join', ';""}
f(5)
2

f(20)
3

f(60)
7

f(100)
3, 7

f(10000)
3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97

Примітка. У попередніх версіях це не вдасться, якщо вхід більше, ніж приблизно 2500000000, оскільки ..оператор діапазону може підтримувати лише до 50 000 елементів. Але, оскільки це більше, ніж [int]максимальне значення типу даних за замовчуванням 2147483647, я вважаю, що це нормально. На моїй машині PSv4 Win8.1, проте, я можу піти вище, але я не в змозі знайти документацію, яка б пояснила різницю.


2

JavaScript (ES6), 79 76 байт

f=(q,n=2,x=n)=>n*n<q?[...--x<2&&q%n?[n]:[],...x>1&&n%x?f(q,n,x):f(q,n+1)]:[]

На основі моєї функції рекурсивної перевірки первинності . Я відчуваю, що має бути кілька способів спростити це, але я не можу зрозуміти, як ...

Фрагмент тесту

f=(q,n=2,x=n)=>n*n<q?[...--x<2&&q%n?[n]:[],...x>1&&n%x?f(q,n,x):f(q,n+1)]:[]
<input type="number" step=1 min=4 value=4 oninput="O.innerHTML='['+f(this.value)+']'"><br>
<pre id=O>[]</pre>


2

Октава, 44 байти

Ця відповідь натхненна відповіддю MATLAB MattWH , але я гольфував її, використовуючи деякі особливості Октави.

@(x)(y=primes(x^.5))(~ismember(y,factor(x)))

Це анонімна функція, яка приймає вхід x. Octave має вбудоване присвоєння змінної та індексацію, що дозволяє yспочатку створюватись у функції (неможливо в MATLAB), потім використовуватись як частина логічної маски, створеної ismember(знову ж, це неможливо зробити так у MATLAB).


Дуже приємно, доведеться заглянути в Octave. Ці функції були б корисні для гольфу!
MattWH

1

Perl 6 , 37 байт

{grep {$^a.is-prime&$_%$a},2.. .sqrt}

Розширено:

{   # bare block lambda with implicit parameter 「$_」

  grep
  {
    $^a.is-prime  # check if it is prime
    &             # and junction
    $_ % $a       # check if the input is not evenly divisible by it
  },
  2.. .sqrt          # Range of values up-to and including squareroot
}

1

TSQL, 130 байт

DECLARE @v int=10000

,@ INT=2SELECT 2p INTO #
g:INSERT # SELECT @ FROM # HAVING isnull(min(@%p),1)>0SET @+=1IF @*@<@v GOTO g
SELECT*FROM # WHERE @v%p>0

Це буде виконано лише один раз, тоді вам потрібно скинути таблицю темп, щоб знову виконати в тому ж редакторі

DROP TABLE #

Я зробив версію, щоб перевірити її, вона трохи довша, тому що онлайнові дозволи для створення таблиць недоступні. З тієї ж причини йому не потрібен стіл для випадіння.

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


1

R, 58 63 байти

for(i in 2:sqrt(x<-scan()))if(x%%i&numbers::isPrime(i))print(i)

Петлі над усіма значеннями від 2 до sqrt(x)і перевіряє, чи вони є простими з numbersпакетом. x%%iобчислює, x mod iщо є, 0 -> Falseякщо iє дільникомx а >0 -> Trueякщо iні.

+5 байтів, оскільки numbers::Primes(n)функція не дозволяє децималів, а 2:sqrt(x)працює, додав простим чеком до ifоператора.


1

Haskell, 55 54 байти

f x=[y|y<-[2..x],y*y<x,[z|z<-[1..y],gcd(z*x)y>1]==[y]]

Здебільшого прямо вкладені розуміння списку. GCD виконує дві ролі, перевіряючи, чи є числа нижче y чинниками y, а також перевіряє, чи y є коефіцієнтом x.

Відстаньте трохи:

f x = [ y|y<-[2..x],     y*y<x,     [z|z<-[1..y], gcd (z*x) y > 1] == [y] ]

Збережіть байт за допомогою gcd(z*x)y>1.
Згарб

Я також поставив спочатку y * y <x, щоб зробити це трохи швидше.
Джеймс Холліс

0

Сітківка , 69 66 байт

.+
$*
(11\1|^1)+
$#1$*1:$&
M!&`(?!(11+)\1+:)(1+):(?!\2+$)
M%`1
^0

Друкує праймери на окремих лініях - від найбільших до найменших.

Спробуйте в Інтернеті!(За останні два тестових випадки займає близько 10 секунд. Заголовок та нижній колонтитул дають змогу розділити тест-розділ для виведення рядка і перетворити висновок у розділення комами для зручності читання.)

Пояснення

.+
$*

Перетворити вхід в одинаковий.

(11\1|^1)+
$#1$*1:$&

Це створює квадратний корінь вводу, розділений на :. Квадратний корінь обчислюється виходячи з того, що квадрат nє також сумою перших nнепарних цілих чисел. Ми можемо зіставити послідовні непарні числа з прямим посиланням (11\1|^1). У процесі група буде використовуватися рівно nразів, де nнайбільша кількість, квадрат яких входить до вхідних даних.

Вставляємо одинарне представлення цього числа з $#1$*1, за ним сліду двокрапку та відповідник.

M!&`(?!(11+)\1+:)(1+):(?!\2+$)

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

M%`1

Це перетворює кожен рядок (тобто кожне відсутнє просте) назад у десятковий, порівнюючи число 1s. Єдине питання полягає в тому, що він вставляє нуль, якщо відсутні відсутні праймери.

^0

Тож цей етап знімає нуль, якщо він був доданий.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.