Равенство кутових відстаней чисел


15

Натхненний цим записом Numberphile

Фон

У числі куби відстані від цілого числа п визначається тут як безліч цілих чисел, які відстань для даного х . Для простого прикладу, з n=100і x=2, що номер куб відстані є {92,108}.

Це можна розширити на більший набір, просто змінивши х . З x ∈ {1,2,3,4}тим самим n=100ми маємо отриманий набір {36,73,92,99,101,108,127,164}.

Давайте визначимо CD (п, х) як безліч всіх цілих чисел n ± z³з z ∈ {1,2,3,...,x}.

Тепер ми можемо зосередитись на деяких особливих властивостях цих куб відстаней чисел . З багатьох особливих властивостей, які можуть мати числа, дві властивості, які нас цікавлять, - це первинність і прості дільники .

Для наведеного вище прикладу компакт-диска (100,4) зауважте, що 73, 101, 127всі основні. Якщо ми видалимо їх із набору, ми залишимося {36,92,99,108,164}. Усі прості дільники цих чисел є (по порядку) {2,2,3,3,2,2,23,3,3,11,2,2,3,3,3,2,2,41}, це означає, що у нас є 5 чітких простих дільників {2,3,23,11,41}. Таким чином, ми можемо визначити, що CD (100,4) має ravenity 1 of 5.

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

Вхідні дані

  • Два натуральних числа nі xв будь-якому зручному форматі.

Вихідні дані

  • Єдине ціле число, що описує нерівномірність двох вхідних чисел, обчислених CD (n, x) .

Правила

  • Введення / виведення можна будь-яким підходящим методом .
  • Застосовуються стандартні обмеження лазівки .
  • Для зручності обчислення можна припустити, що вхідні дані будуть такими, що CD (n, x) матиме лише позитивні числа у наборі (тобто жоден CD (n, x) ніколи не матиме від’ємних чи нульових чисел).
  • Функція або програма повинні мати можливість обробляти вхідні числа таким чином, щоб вони n + x³відповідали цілому цілому типу даних вашої мови. Наприклад, для 32-бітного підписаного цілого типу n + x³ < 2147483648можливі всі вхідні числа з .

Приклади

n,x   - output
2,1   - 0   (since CD(2,1)={1,3}, distinct prime divisors={}, ravenity=0)
5,1   - 2
100,4 - 5
720,6 - 11

Виноски

1 - Називається так, бо нас цікавить не кардинальний набір, а інший тип птахів. Оскільки ми маємо справу з "загальними" дільниками, я вирішив використовувати звичайного ворона .


Як виходить 100,45? Число відстаней куба цього набору є 36,164, а основними множниками цього множини є 2,3,41(оскільки коефіцієнти цього набору є {2, 3, 4, 6, 9, 12, 18, 36}і {2, 4, 41, 82, 164}, відповідно). Тому вихід повинен бути 3, а не 5.
Р. Кап

2
@ R.Kap 100,4- це приклад, який пояснює ОП у розділі «Фон». Ваша помилка, здається, полягає в тому, що ви повинні врахувати всіх 1..x, тому [1,2,3,4]в цьому випадку.
FryAmTheEggman

@FryAmTheEggman О. добре. Я зараз це розумію.
Р. Кап

Чи буде це вимовлено [ruh-VEE-nuh-tee] (або / rəˈviːnəti / для тих, хто читає IPA)?
Лина монашка

1
@KennyLau У голові я проголосив це як "rah-VIN-eh-ty"
AdmBorkBork

Відповіді:


4

Желе, 16 байт

ŒRḟ0*3+µÆfFœ-µQL

Приймає x і n як аргументи командного рядка в такому порядку. Спробуйте в Інтернеті!

Як це працює

ŒRḟ0*3+µÆfFœ-µQL  Main link. Arguments, x, n

ŒR                Range; yield [-x, ..., x].
  ḟ0              Filter out 0.
    *3            Cube each remaining integer.
      +           Add n to all cubes.
       µ          Begin a new, monadic link. Argument: A (list of sums)
        Æf        Factorize each k in A.
          F       Flatten the resulting, nested list.
           œ-     Perform multiset difference with A.
                  If k in A is prime, Æf returns [k], adding on k too many to the
                  flat list. Multiset difference with A removes exactly one k from
                  the results, thus getting rid of primes.
                  If k is composite (or 1), it cannot appear in the primes in the
                  flat list, so subtracting it does nothing.
             µ    Begin a new, monadic link. Argument: D (list of prime divisors)
              Q   Unique; deduplicate D.
               L  Compute the length of the result.

4

Pyth - 21 19 18 байт

Цікаво, чи є хитрість.

l{st#mP+Q^d3s_BMSE

Тестовий сюїт .

l                   Length
 {                  Uniquify
  s                 Combine divisor lists
   t#               Filter by if more than one element
     PM             Take prime factorization of each number
       +RQ          Add each num in list to input
          s_BM      Each num in list and its negative (with bifurcate)
              ^R3   Cube each num in list
                 SE Inclusive unary range - [1, 2, 3,... n] to input

3

Джулія, 107 байт

f(n,x)=endof(∪(foldl(vcat,map(k->[keys(factor(k))...],filter(i->!isprime(i),[n+z^3for z=[-x:-1;1:x]])))))

Це функція, яка приймає два цілих числа і повертає ціле число.

Безголівки:

function f(n, x)
    # Get all cube distance numbers
    cubedist = [n + z^3 for z = [-x:-1; 1:x]]

    # Filter out the primes and zeros
    noprimes = filter(i -> !isprime(i) && i > 0, cubedist)

    # Factor each remaining number
    factors = map(k -> [keys(factor(k))...], noprimes)

    # Flatten the list of factors
    flat = foldl(vcat, factors)

    # Return the number of unique elements
    return endof(∪(flat))
end

Специфікація оновлена; вам більше не доведеться турбуватися про 0 '.
Денніс

@Dennis Nice, дякую за голову вгору.
Олексій А.


2

MATL , 21 байт

:3^t_h+tZp~)"@Yf!]vun

Вхід x, nрозділений символом нового рядка.

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

Пояснення

:       % take n implicitly. Generate [1,2,...,n]
3^      % raise to 3, element-wise
t_h     % duplicate, negate, concatenate horizontally: [1,2,...,n,-1,2,...-n]
+       % take x implicitly. Add to that array
t       % duplicate
Zp      % array that contains true for primes
~       % logical negate
)       % apply index to keep only non-primes
"       % for each number in that array
  @     %   push that number
  Yf!   %   prime factors, as a column array
]       % end for each
v       % concatenate vertically all factors
u       % remove repeated factors
n       % number of elements of that array. Implicitly display

2

J, 30 байт

#@~.@(,@:q:-.0&,)@:+(|#^&3)@i:

Це дієслово з діадією, яке вживається так:

   f =: #@~.@(,@:q:-.0&,)@:+(|#^&3)@i:
   100 f 4
5

Спробуйте тут.

Пояснення

#@~.@(,@:q:-.0&,)@:+(|#^&3)@i:
                            i:  Range from -x to x
                    (     )@    Apply this verb to the range:
                       ^&3        a) every item cubed
                     |            b) absolute value of every item
                      #           c) every item in a) repeated b) times; this removes 0
                                     and produces some harmless duplication
                   +            Add n to every element of the resulting list
     (          )@:             Apply this verb to the resulting vector:
             0&,                  a) the vector with 0 appended
      ,@:q:                       b) flat list of prime divisors in the vector
                                     (and some extra 0s since we flatten an un-even matrix)
           -.                     c) list b) with elements of a) removed; this gets rid of
                                     the extra 0s and all primes that were in the list
#@~.@                           Remove duplicates and take length

2
@:+(чому такий сумний, чудовий хлопець?
AdmBorkBork

Посилання на TIO у відповідь, будь ласка?
Rɪᴋᴇʀ

@EasterlyIrk TIO не має J. Я додам посилання на tryj.tk.
Згарб

@Zgarb okai .___
Rɪᴋᴇʀ

2

Python 3.5, 218 198 байт:

( Дякую @Blue, що врятував мені 20 байт.)

lambda r,n:len({z for z in{v for f in{t for u in[[r-q**3,r+q**3]for q in range(1,n+1)]for t in u if any(t%g<1 for g in range(2,t))}for v in range(2,f)if f%v<1}if all(z%g>0 for g in range(2,z))})

Приємна однолінійна лямбда-функція, хоча може бути трохи довгою. Оскільки я використовував Python, мені довелося придумати власний спосіб пошуку композитів для першого кроку, а потім головних дільників для останнього кроку, тож це було не дуже просто, і це був найкоротший я, сам . міг би отримати це. Тим не менш, він робить все, що потрібно, і я пишаюся цим. :) Однак будь-які поради щодо гри в гольф трохи більше вітаються.


Пару: не використовуйте == 0, використовуйте <1, і для! = 0,> 0. Крім того, чому z% 1 і z% z в кінці? Здається, що вони завжди будуть правдою.
Блакитний

@Blue Так, ти маєш рацію. Вони завжди будуть правдиві, тому ця частина навіть не потрібна. Отже, я зніму це. А також, дякую за інші поради! :)
Р. Кап

1

PARI / GP , 79 байт

(n,x)->omega(factorback(select(k->!isprime(k),vector(2*x,i,n+(i-(i<=x)-x)^3))))

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

(n,x)->omega(factorback(select(k->!isprime(k),concat(vector(x,i,n-i^3),vector(x,i,n+i^3)))))

Це справді цікаво. Я бачу, що існує посилання в браузері, щоб спробувати код, але я не впевнений, як насправді подати дані. Чи можете ви надати пояснення?
AdmBorkBork

@TimmyD: Якщо ви призначите будь-яке з перерахованих вище f(подобається f=(n,x)->...), тоді ви можете його протестувати f(100,4). Ви також можете викликати його в одному рядку ((n,x)->...)(100,4).
Чарльз

1

Рубін, 138 байт

->(n,x){require'prime'
v=((-x..x).to_a-[0]).map{|i|n+i**3}.reject{|e|Prime.prime?(e)}
Prime.each(v[-1]).select{|i|v.any?{|e|e%i==0}}.size}

Це було викликом на кару . :-)


Вони серйозно створили спосіб знайти праймери в Рубі? Нічого не можу повірити, що у Python цього немає.
Р. Кап

Так. Див. Ruby-doc.org/stdlib-2.3.0/libdoc/prime/rdoc/Prime.html - Має працювати навіть у версії 1.9.3.
jose_castro_arnaud

1

Рубі, 132 120 114 байт

Я добре знаю, що для цього рішення все ще потрібно багато гольфу. Будь-які поради щодо гольфу вітаються.

require'prime'
->n,x{(-x..x).map{|i|j=n+i**3;j.prime?||(j==n)?[]:j.prime_division.map{|z|z[0]}}.flatten.uniq.size}

Ungolfing:

require 'prime'

def ravenity(n, x)
  z = []
  (-x..x).each do |i|
    j = n + i**3
    m = j.prime_division
    if j.prime? || j == n
      z << []
    else
      z << m.map{|q| q[0]}
    end
  return z.flatten.uniq.size
end

1

Python 3,5 - 177 175 159 байт

Будь-які поради щодо гольфу вітаються :)

a=range
p=lambda n:any(n%x<1for x in a(2,n))
r=lambda n,x:len(set(sum([[x for x in a(2,z+1)if z%x<1&1>p(x)]for z in filter(p,[n+z**3for z in a(-x,x+1)])],[])))

Безголівки:

def is_composite(n):
    return any(n % x == 0 for x in range(2, n))

def prime_factors(n):
    return {x for x in range(2, n+1) if n % x == 0 and not is_composite(x)}

def ravenity(n, x):
    nums = [n + z**3 for z in range(-x, x+1)]
    nums = filter(is_composite, nums)
    factors = map(prime_factors, nums)
    factors = sum(factors, [])
    #remove duplicates
    factors = set(factors)
    return len(factors)

0

Мова Вольфрама (Mathematica) , 90 байт

Tr[1^Union[First/@Join@@FactorInteger/@Select[z=Range@#2^3;Join@@{#-z,#+z},Not@*PrimeQ]]]&

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

без гольфу: код читається в основному справа наліво,

F[n_, x_] := 
  Length[Union[                                        (* number of unique elements   *)
    First /@                                           (* drop multiplicities         *)
      Join @@                                          (* join all prime factor lists *)
        FactorInteger /@                               (* compute prime factors       *)
          Select[                                      (* select those...             *)
            Join @@ {n - Range[x]^3, n + Range[x]^3},  (* ...candidates...            *)
            Not@*PrimeQ]]]                             (* ...that are not prime       *)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.