Ravenity кубических дистанционных чисел

15

Вдохновленный этой записью Numberphile

Фон

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

Это может быть расширено до большего набора, просто меняя x . При x ∈ {1,2,3,4}том же n=100и у нас получился результирующий набор {36,73,92,99,101,108,127,164}.

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

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

Для приведенного выше примера CD (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 из 5.

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

вход

  • Два натуральных числа nи xв любом удобном формате.

Выход

  • Одно целое число, описывающее ravenity двух входных чисел, при расчете с 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 - Так назван потому, что нас интересует не кардинальность сета, а другой тип птицы. Поскольку мы имеем дело с «общими» делителями, я решил использовать общий ворон .

AdmBorkBork
источник
Как получается 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
Maltysen
источник
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]])))))

Это функция, которая принимает два целых числа и возвращает целое число.

Ungolfed:

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 .
Деннис
@ Денис: Хорошо, спасибо за внимание.
Алекс А.
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
Zgarb
источник
2
@:+(почему такой грустный, крутой парень?
AdmBorkBork
Ссылка на TIO в ответе пожалуйста?
Rɪᴋᴇʀ
У @EasterlyIrk TIO нет J. Я добавлю ссылку на tryj.tk.
Згарб
@Zgarb хорошо .___
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 в конце? Те, кажется, они всегда будут правдой.
Синий,
@ Синий Да, ты прав. Они всегда будут правдой, так что эта часть даже не нужна. Итак, я уберу это. И еще, спасибо за эти другие советы! :)
Р. Кап
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}

Это был маленький вызов. :-)

jose_castro_arnaud
источник
У них серьезно есть встроенный способ найти простые числа в Ruby? Ух ты ... Я не могу поверить, что у Питона этого нет.
Р. Кап
Ага. См. 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
Sherlock9
источник
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)])],[])))

Ungolfed:

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

Wolfram Language (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       *)
Роман
источник