Это сфенический номер?


29

Сфеническое число - это число, которое является произведением ровно трех различных простых чисел. Первые несколько сфенических чисел 30, 42, 66, 70, 78, 102, 105, 110, 114. Это последовательность A007304 в OEIS.

Твое задание:

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

Входные данные:

Целое число от 0 до 10 ^ 9, которое может быть или не быть Sphenic Number.

Выход:

Истинное / ложное значение, указывающее, является ли ввод сфеническим числом.

Примеры:

30  -> true
121 -> false
231 -> true
154 -> true
4   -> false
402 -> true
79  -> false
0   -> false
60  -> false
64  -> false
8   -> false
210 -> false

Подсчет очков:

Это , выигрывает самый короткий код в байтах.


Является ли 60клиновидный номер? 2 × 2 × 3 × 5
Эрик Outgolfer

1
@EriktheOutgolfer - это не произведение трех отдельных простых чисел, а произведение трех отдельных и одного повторного простого числа.
Rɪᴋᴇʀ

1
@Riker Я не совсем уверен, означает ли «3 различных простых числа» «3 простых числа, которые все различны» или «когда не определено, должно остаться 3 простых числа». РЕДАКТИРОВАТЬ: О, я вижу, 60это не сфеническое число. (в ожидании разъяснения ОП)
Эрик Outgolfer

@EriktheOutgolfer Согласно определению сфенических чисел, 60 не является одним из них. Я не знаю, однако, если 60 подходит для этой задачи.
Пшеничный волшебник

@WheatWizard, 60 - это не сфеническое число (например, ложь вывода / возврата).
Грифон - Восстановить Монику

Ответы:


7

Брахилог , 6 3 байта

ḋ≠Ṫ

Попробуйте онлайн!

объяснение

ḋ        The prime factorization of the Input…
 ≠       …is a list of distinct elements…
  Ṫ      …and there are 3 elements

2
И затем есть один язык, который имеет встроенный, как .
Эрик Outgolfer

И встроенный также.
Захари

1
@ Zacharý на самом деле не является встроенным предикатом; это встроенная переменная: список из 3 переменных элементов. Это довольно полезная предварительно ограниченная переменная для множества различных задач.
Фатализировать

Поздравляю с кратчайшим ответом.
Грифон - Восстановить Монику

11

Баш, 43 байта

factor $1|awk '{print $2-$3&&$3-$4&&NF==4}'

Попробуйте онлайн!

Ввод через аргумент командной строки, вывод 0или 1в стандартный вывод.

Довольно очевидный; анализирует выходные данные, factorчтобы убедиться, что первый и второй факторы различны, второй и третий различны (они расположены в отсортированном порядке, поэтому этого достаточно), и есть четыре поля (входное число и три фактора).


11

MATL , 7 байт

_YF7BX=

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

_YF   % Implicit input. Nonzero exponents of prime-factor decomposition
7     % Push 7
B     % Convert to binary: gives [1 1 1] 
X=    % Is equal? Implicit display

@ Как бы то ни было, я думал об этом, но затем ложный вывод становится более уродливым (либо пустым с ошибкой, либо массивом с некоторыми нулями). Не уверен, стоит ли мне ...
Луис Мендо

4
X=это самая грустная постройка, которую я когда-либо видел.
Эрик Outgolfer

9

C 88 78 126 58 77 73 + 4 ( lm) = 77 байт

l,j;a(i){for(l=1,j=0;l++<i;fmod(1.*i/l,l)?i%l?:(i/=l,j++):(j=9));l=i==1&&j==3;}

Ungolfed прокомментировал объяснение:

look, div; //K&R style variable declaration. Useful. Mmm.

a ( num ) { // K&R style function and argument definitions.

  for (
    look = 1, div = 0; // initiate the loop variables.
    look++ < num;) // do this for every number less than the argument:

      if (fmod(1.0 * num / look, look))
      // if num/look can't be divided by look:

        if( !(num % look) ) // if num can divide look
          num /= look, div++; // divide num by look, increment dividers
      else div = 9;
      // if num/look can still divide look
      // then the number's dividers aren't unique.
      // increment dividers number by a lot to return false.

  // l=j==3;
  // if the function has no return statement, most CPUs return the value
  // in the register that holds the last assignment. This is equivalent to this:
  return (div == 3);
  // this function return true if the unique divider count is 3
}

Попробуйте онлайн!


1
Рассмотрим i*1.0/lвместо броска, чтобы плавать. (А поскольку l, jявляются глобальными , они инициализируются 0 бесплатно, вам не нужно делать, если функция вызывается только один раз не уверен , что это правило для этого..)
Mat


5

CJam , 11 байт

rimFz1=7Yb=

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

На основании моего ответа MATL.

ri    e# Read integer
mF    e# Factorization with exponents. Gives a list of [factor exponent] lists
z     e# Zip into a list of factors and a list of exponents
1=    e# Get second element: list of exponents
7     e# Push 7
Yb    e# Convert to binary: gives list [1 1 1]
=     e# Are the two lists equal? Implicitly display


4

Шелуха , 6 байт

≡ḋ3Ẋ≠p

Попробуйте онлайн!

Возвращает 1 для сфенических чисел и 0 в противном случае.

объяснение

≡ḋ3Ẋ≠p    Example input: 30
     p    Prime factors: [2,3,5]
   Ẋ≠     List of absolute differences: [1,2]
≡         Is it congruent to...       ?
 ḋ3           the binary digits of 3: [1,1]

В последнем отрывке конгруэнтность между двумя списками означает одинаковую длину и одинаковое распределение истинных / ложных значений. В этом случае мы проверяем, что наш результат состоит из двух истинных (то есть ненулевых) значений.


4

Mathematica, 31 байт

SquareFreeQ@#&&PrimeOmega@#==3&

Так как вы уже тестируете на квадратность, PrimeNuсделаете так же, как PrimeOmegaи короче.
Марк С.





2

J 15 байт

7&(=2#.~:@q:)~*

Попробуйте онлайн!

объяснение

7&(=2#.~:@q:)~*  Input: integer n
              *  Sign(n)
7&(         )~   Execute this Sign(n) times on n
                 If Sign(n) = 0, this returns 0
          q:       Prime factors of n
       ~:@         Nub sieve of prime factors
    2#.            Convert from base 2
   =               Test if equal to 7

Очень хорошее использование ~: и #. Альтернативой может быть (7 & (= #. @ ~: @Q:) ~ *), которую я считаю немного легче читать, но она не короче.
Боб




2

C, 91 102 байта, исправлено (снова), проверено и проверено на настоящее время:

<strike>s(c){p,f,d;for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}c==p&&f==2&&!d;}</strike>
s(c){int p,f,d;for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}return c==p&&f==2&&!d;}

/ * Это также работает в 93 байтах, но так как я забыл о стандартных правилах, запрещающих тип int по умолчанию для динамических переменных, и о запрете неявных возвращаемых значений без присваиваний, я не собираюсь его принимать:

p,f,d;s(c){for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}p=c==p&&f==2&&!d;}

(Кто сказал, что я что-то знал о C? ;-)

Вот тестовый фрейм со сценарием оболочки в комментариях:

/* betseg's program for sphenic numbers from 
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h> /* compile with -lm */

/* l,j;a(i){for(l=1,j=0;l<i;i%++l?:(i/=l,j++));l=i==1&&j==3;} */
#if defined GOLFED
l,j;a(i){for(l=1,j=0;l++<i;fmod((float)i/l,l)?i%l?:(i/=l,j++):(j=9));l=i==1&&j==3;}
#else 
int looker, jcount;
int a( intval ) {
  for( looker = 1, jcount = 0; 
    looker++ < intval; 
    /* Watch odd intvals and even lookers, as well. */
    fmod( (float)intval/looker, looker )  
      ? intval % looker /* remainder? */
        ? 0 /* dummy value */
        : ( inval /= looker, jcount++ /* reduce the parameter, count factors */ ) 
      : ( jcount = 9 /* kill the count */ ) 
  )
    /* empty loop */;
  looker = intval == 1 && jcount == 3; /* reusue looker for implicit return value */
}
#endif

/* for (( i=0; $i < 100; i = $i + 1 )) ; do echo -n at $i; ./sphenic $i ; done */

Я позаимствовал предыдущий ответ Betseg, чтобы добраться до моей версии.

Это моя версия алгоритма Betseg, которую я решил найти в своем решении:

/* betseg's repaired program for sphenic numbers
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int sphenic( int candidate )
{
  int probe, found, dups;
  for( probe = 2, found = dups = 0; probe < candidate && !dups; /* empty update */ ) 
  { 
    int remainder = candidate % probe;
    if ( remainder == 0 ) 
    {
      candidate /= probe;
      ++found;
      if ( ( candidate % probe ) == 0 )
        dups = 1;
    }
    ++probe;
  } 
  return ( candidate == probe ) && ( found == 2 ) && !dups;
}

int main( int argc, char * argv[] ) { /* Make it command-line callable: */
  int parameter;
  if ( ( argc > 1 ) 
       && ( ( parameter = (int) strtoul( argv[ 1 ], NULL, 0 ) ) < ULONG_MAX ) ) {
    puts( sphenic( parameter ) ? "true" : "false" );
  }
  return EXIT_SUCCESS; 
}

/* for (( i=0; $i < 100; i = $i + 1 )) ; do echo -n at $i; ./sphenic $i ; done */

Это отвечает на вопрос, сейчас?
Джоэл Рис

Да, это так. Вставьте это ссылку на ответ betseg в: [betseg's answer](https://codegolf.stackexchange.com/a/135203/65836). Вы также можете нажать кнопку «Изменить» на его ответе, чтобы предложить изменить его, если хотите, который будет включать объяснение - без каких-либо обещаний относительно того, будет ли оно одобрено или нет.
Стивен

Я сейчас здесь, и я исправил свою программу, теперь она занимает 87 байт; но ваша программа тоже выглядит хорошо.
Betseg

@betseg Интересно, что вы использовали плавающую точку на этот раз. О, и спасибо, что позволили мне позаимствовать ваш алгоритм. ;-)
Джоэл Рис

@JoelRees я добавил объяснение к моему ответу, также у твоего ответа есть проблема, я думаю? похоже, что он работает неправильно: попробуйте онлайн
betseg


1

Javascript (ES6), 87 байт

n=>(a=(p=i=>i>n?[]:n%i?p(i+1):[i,...p(i,n/=i)])(2)).length==3&&a.every((n,i)=>n^a[i+1])

Пример кода:

f=
n=>(a=(p=i=>i>n?[]:n%i?p(i+1):[i,...p(i,n/=i)])(2)).length==3&&a.every((n,i)=>n^a[i+1])

for(k=0;k<10;k++){
  v=[30,121,231,154,4,402,79,0,60,64][k]
  console.log(`f(${v}) = ${f(v)}`)
}


1

Python 2 , 135 121 байт

  • Довольно давно это включает в себя все процедуры: простые проверки, факторы получения и вычисления и проверку состояния номера сферы.
lambda x:(lambda t:len(t)>2and t[0]*t[1]*t[2]==x)([i for i in range(2,x)if x%i<1and i>1and all(i%j for j in range(2,i))])

Попробуйте онлайн!



1

J, 23 байта

0:`((~.-:]*.3=#)@q:)@.*

Попробуйте онлайн!

Обработка 8 и 0 в основном разрушила этот ...

q: дает вам все основные факторы, но не обрабатывает 0. остальное просто говорит, что «уникальные факторы должны равняться факторам» и «их число должно быть 3»


Это не для ввода60
Конор О'Брайен

@ ConorO'Brien спасибо. Посмотрите мое редактирование - исправление 60 помогло , но я понял, что я также неправильно обрабатывал 0 и обрабатывал это более чем в два раза
Иона

Последняя была моей оригинальной идеей, и она не удалась 8.
Конор О'Брайен

У меня есть (6=]#@,~.)@q:как возможное решение
Конор О'Брайен

@ ConorO'Brien ах хороший момент о 8. ваш потерпит неудачу на 0, хотя.
Иона

1

Japt , 14 байт

k
k@è¥X ÉÃl ¥3

Попробуйте онлайн!


@Oliver Это приведет к передаче функции Number.k(), которая не будет иметь никакого эффекта, и просто проверит, имеет ли вход 3 простых фактора, а не 3 различных простых фактора. Это означало бы 8(с тремя основными факторами :),2, 2, 2 несмотря на отсутствие A007304
Джастин Маринер

Ах, ты прав. Я просто проходил тестовые случаи.
Оливер

@ Оливер Да, это действительно заставило меня задуматься, работая над этим решением. Я просто добавил 8к тестам по этой причине.
Джастин Маринер


1

VB.NET (.NET 4.5), 104 байта

Function A(n)
For i=2To n
If n Mod i=0Then
A+=1
n\=i
End If
If n Mod i=0Then A=4
Next
A=A=3
End Function

Я использую функцию VB, где имя функции также является переменной. В конце выполнения, поскольку нет оператора return, вместо этого он передаст значение функции.

Последнее A=A=3можно представить return (A == 3)на языках Си.

Начинается с 2 и итеративно выводит простые числа. Поскольку я начинаю с наименьших простых чисел, его нельзя разделить на составное число.

Попробую во второй раз разделить на одно и то же простое число. Если это так (например, как 60 делится дважды на 2), будет установлено количество простых чисел равным 4 (выше максимально допустимого для целого числа).

Попробуйте онлайн!


1

Dyalog APL, 51 49 48 46 45 43 байта

1∊((w=×/)∧⊢≡∪)¨(⊢∘.,∘.,⍨){⍵/⍨2=≢∪⍵∨⍳⍵}¨⍳w←⎕

Попробуйте онлайн! (изменено, чтобы он мог работать на TryAPL)

Я хотел представить тот, который не зависит от пространства имен dfns, даже если он длинный .


1

J, 15 14 19 байт

Предыдущая попытка: 3&(=#@~.@q:)~*

Текущая версия: (*/*3=#)@~:@q: ::0:

Как это работает:

(*/*3=#)@~:@q: ::0:  Input: integer n
               ::0:  n=0 creates domain error in q:, error catch returns 0
            q:       Prime factors of n
         ~:@         Nub sieve of prime factors 1 for first occurrence 0 for second
(*/*3=#)@            Number of prime factors is equal to 3, times the product across the nub sieve (product is 0 if there is a repeated factor or number of factors is not 3)

Это относится к случаям 0, 8 и 60, которых не было в предыдущей версии.


1
почему не 3 = # ~ .q: для 7 символов? Из J сессии 3 = # ~ .q: 30 ==> 1 и 3 = # ~ .q: 20 ==> 0
Ричард Донован

Ричард, ваше предложение дает ложное срабатывание для n = 60 и создает ошибку домена для n = 0, но моя предыдущая версия также не удалась для n = 60. Ваш комментарий побудил меня стремиться к правильному решению!
Боб

0

Mathematica, 66 57 байт

Length@#1==3&&And@@EqualTo[1]/@#2&@@(FactorInteger@#)&

Определяет анонимную функцию.

является транспонирование .

объяснение

FactorIntegerдает список пар факторов и их показателей. Например FactorInteger[2250]=={{2,1},{3,2},{5,3}}. Это транспонировано для простоты использования и подается в функцию Length@#1==3&&And@@EqualTo[1]/@#2&. Первая часть Length@#1==3проверяет наличие 3 уникальных факторов, а вторая And@@EqualTo[1]/@#2проверяет, что все показатели равны 1.


0

PHP, 66 байт:

for($p=($n=$a=$argn)**3;--$n;)$a%$n?:$p/=$n+!++$c;echo$c==7&$p==1;

Беги как труба с -nR или попробуйте онлайн .

Бесконечный цикл для 0 ; вставить $n&&перед--$n исправить.

сломать

for($p=($n=$a=$argn)**3;    # $p = argument**3
    --$n;)                  # loop $n from argument-1
    $a%$n?:                     # if $n divides argument
        $p/=$n                      # then divide $p by $n
        +!++$c;                     # and increment divisor count
echo$c==7&$p==1;            # if divisor count is 7 and $p is 1, argument is sphenic

пример
аргумента = 30:
простые факторы 2, 3а 5
другие делители: 12 * 3 = 6, 2 * 5 = 10и 3 * 5 = 15
их произведение: 1*2*3*5*6*10*15is 27000==30**3


0

Python 99 байт

def s(n):a,k=2,0;exec('k+=1-bool(n%a)\nwhile not n%a:n/=a;k+=10**9\na+=1\n'*n);return k==3*10**9+3

Первая подача. Прости меня, если я сделал что-то не так. В некотором роде глупо, считает количество факторов n, а затем количество разn делится на каждого (добавляя 10 ** 9).

Я уверен, что есть несколько простых способов обрезать ~ 10-20 символов, но я этого не сделал.

Также это невероятно медленно на 10 ** 9. Можно сделать все'...a+=1\n'*n правильно '...a+=1\n'*n**.5, изменив на , так как нам нужно только перейти к квадратному корню из n.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.