Đây có phải là một số Sphenic?


29

Số Sphenic là một số là sản phẩm của chính xác ba số nguyên tố riêng biệt. Một vài số Sphenic đầu tiên là 30, 42, 66, 70, 78, 102, 105, 110, 114. Đây là trình tự A007304 trong OEIS.

Nhiệm vụ của bạn:

Viết chương trình hoặc hàm để xác định xem một số nguyên được nhập có phải là số Sphenic hay không.

Đầu vào:

Một số nguyên nằm trong khoảng từ 0 đến 10 ^ 9, có thể có hoặc không phải là Số Sphenic.

Đầu ra:

Giá trị trung thực / giả mạo cho biết liệu đầu vào có phải là Số Sphenic hay không.

Ví dụ:

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

Ghi điểm:

Đây là , mã ngắn nhất tính bằng byte thắng.


60một số sphenic? 2 × 2 × 3 × 5
Erik the Outgolfer

1
@EriktheOutgolfer không phải là sản phẩm của 3 số nguyên tố riêng biệt, đó là sản phẩm của 3 số nguyên tố riêng biệt và 1 số nguyên tố trùng lặp.
Rɪᴋᴇʀ

1
@Riker Tôi không thực sự chắc chắn liệu "3 số nguyên tố riêng biệt" có nghĩa là "3 số nguyên tố hoàn toàn khác biệt" hay "khi duy nhất sẽ tồn tại 3 số nguyên tố". EDIT: Ồ tôi hiểu rồi, 60không phải là một con số tuyệt vời. (đang chờ OP làm rõ)
Erik the Outgolfer 23/07/17

@EriktheOutgolfer Theo định nghĩa về số lượng sphenic, 60 không phải là một trong số đó. Tôi không biết tuy nhiên nếu 60 là hợp lệ cho thử thách này.
Phù thủy lúa mì

@WheatWizard, 60 không phải là số sphenic (ví dụ: đầu ra / trả về giả).
Gryphon - Phục hồi lại

Câu trả lời:


7

Brachylog , 6 3 byte

ḋ≠Ṫ

Hãy thử trực tuyến!

Giải trình

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

2
Và sau đó, có một ngôn ngữ được tích hợp sẵn .
Erik the Outgolfer 24/07/17

Và các nội dung cũng vậy.
Zacharý

1
@ Zacharý không thực sự là một vị ngữ tích hợp; nó là một biến tích hợp: một danh sách gồm 3 phần tử biến. Đây là một biến bị ràng buộc trước khá hữu ích trong nhiều thử thách khác nhau.
Gây tử vong vào

Xin chúc mừng câu trả lời ngắn nhất.
Gryphon - Phục hồi Monica

11

bash, 43 byte

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

Hãy thử trực tuyến!

Nhập thông qua đối số dòng lệnh, đầu ra 0hoặc 1đến thiết bị xuất chuẩn.

Khá tự giải thích; phân tích đầu ra của factorđể kiểm tra xem các yếu tố thứ nhất và thứ hai có khác nhau không, yếu tố thứ hai và thứ ba khác nhau (chúng được sắp xếp theo thứ tự, vì vậy điều này là đủ) và có bốn trường (số đầu vào và ba yếu tố).


11

MATL , 7 byte

_YF7BX=

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

_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

@Suever Tôi đã suy nghĩ về điều đó, nhưng sau đó, thông tin sai lệch trở nên xấu hơn (trống rỗng có lỗi hoặc một mảng có một số không). Không chắc tôi có nên ...
Luis Mendo

4
X=là bản dựng buồn nhất mà tôi từng thấy.
Erik the Outgolfer 23/07/17

9

C, 88 78 126 58 77 73 + 4 ( lm) = 77 byte

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 nhận xét giải thích:

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
}

Hãy thử trực tuyến!


1
Hãy xem xét i*1.0/lthay vì các diễn viên để nổi. (Và vì l, jlà quốc tế thì được khởi tạo 0 miễn phí, bạn không cần phải làm điều đó nếu hàm được chỉ gọi một lần Không chắc chắn về nguyên tắc là cho điều đó..)
Mat


5

CJam , 11 byte

rimFz1=7Yb=

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Dựa trên câu trả lời MATL của tôi.

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

Husk , 6 byte

≡ḋ3Ẋ≠p

Hãy thử trực tuyến!

Trả về 1 cho các số sphenic và 0 nếu không.

Giải trình

≡ḋ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]

Trong đoạn cuối, sự đồng dạng giữa hai danh sách có nghĩa là có cùng độ dài và cùng phân phối các giá trị trung thực / giả. Trong trường hợp này, chúng tôi đang kiểm tra xem kết quả của chúng tôi được bao gồm bởi hai giá trị trung thực (tức là khác không).


4

Toán học, 31 byte

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

Vì bạn đã thử nghiệm tính năng vuông góc, PrimeNusẽ làm tốt như PrimeOmegavậy và ngắn hơn.
Đánh dấu S.

4

Thạch , 6 byte

ÆE²S=3

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ÆE²S=3  Main link. Argument: n

ÆE      Compute the exponents of n's prime factorization.
  ²     Take their squares.
   S    Take the sum.
    =3  Test the result for equality with 3.




2

J , 15 byte

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

Hãy thử trực tuyến!

Giải trình

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

Cách sử dụng rất hay của ~: và #. Một thay thế có thể là (7 & (= #. @ ~: @Q :) ~ *) mà tôi thấy dễ đọc hơn một chút, nhưng không ngắn hơn.
bob




2

C, 91 102 byte, đã sửa (một lần nữa), đánh gôn và thử nghiệm lần này:

<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;}

/ * Điều này cũng hoạt động trong 93 byte, nhưng vì tôi quên quy tắc chuẩn chặn loại int mặc định trên các biến động và về việc không cho phép các giá trị trả về ngầm mà không có bài tập, tôi sẽ không lấy nó:

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;}

(Ai nói tôi biết gì về C? ;-)

Đây là khung thử nghiệm với kịch bản shell trong các bình luận:

/* 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 */

Tôi đã mượn câu trả lời trước của betseg để đến phiên bản của tôi.

Đây là phiên bản thuật toán của betseg, mà tôi đã đánh gôn để tìm ra giải pháp của mình:

/* 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 */

Nó trả lời câu hỏi, bây giờ?
Joel Rees

Vâng, nó làm. Chèn phần này để liên kết đến câu trả lời của betseg : [betseg's answer](https://codegolf.stackexchange.com/a/135203/65836). Bạn cũng có thể nhấp vào chỉnh sửa câu trả lời của anh ấy để đề xuất chỉnh sửa cho nó, nếu bạn muốn, điều đó sẽ bao gồm lời giải thích - không có lời hứa nào về việc nó sẽ được chấp thuận hay không.
Stephen

Bây giờ tôi đang ở đây và tôi đã sửa chương trình của mình, bây giờ là 87 byte; nhưng chương trình của bạn trông cũng tốt
betseg

@betseg Thú vị là bạn đã sử dụng dấu phẩy động lần này. Oh, và cảm ơn vì đã cho tôi mượn thuật toán của bạn. ;-)
Joel Rees

@JoelRees tôi đã thêm lời giải thích cho câu trả lời của tôi, còn câu trả lời của bạn có vấn đề gì không? nó dường như không hoạt động chính xác: Dùng thử trực tuyến
betseg


1

Javascript (ES6), 87 byte

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])

Đoạn mã ví dụ:

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 byte

  • Khá lâu vì điều này bao gồm tất cả các thủ tục: kiểm tra nguyên tố, các yếu tố thu được và kiểm tra điều kiện số hình cầu.
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))])

Hãy thử trực tuyến!



1

J, 23 byte

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

Hãy thử trực tuyến!

Xử lý 8 và 0 về cơ bản đã phá hỏng cái này ...

q: cung cấp cho bạn tất cả các yếu tố chính, nhưng không xử lý 0. phần còn lại của nó chỉ nói "các yếu tố duy nhất nên bằng các yếu tố" và "số lượng của chúng nên là 3"


Điều này không thành công cho đầu vào60
Conor O'Brien

@ ConorO'Brien cảm ơn. Xem phần chỉnh sửa của tôi - sửa 60 giúp , nhưng tôi nhận ra tôi cũng không xử lý 0 chính xác và xử lý nhiều hơn gấp đôi số byte
Jonah

Ý tưởng cuối cùng là ý tưởng ban đầu của tôi và điều đó đã thất bại 8.
Conor O'Brien

Tôi có (6=]#@,~.)@q:một giải pháp khả thi
Conor O'Brien

@ ConorO'Brien ah điểm tốt về 8. mặc dù vậy, bạn sẽ thất bại trong 0.
Giô-na

1

Japt , 14 byte

k
k@è¥X ÉÃl ¥3

Hãy thử trực tuyến!


@Oliver Điều đó sẽ dẫn đến việc truyền một hàm tới Number.k(), điều này sẽ không có hiệu lực và chỉ cần kiểm tra xem đầu vào có 3 thừa số nguyên tố chứ không phải 3 yếu tố chính khác biệt . Điều đó có nghĩa là 8(với ba yếu tố chính 2, 2, 2:) sẽ vượt qua mặc dù không có trong A007304
Justin Mariner

À, bạn nói đúng. Tôi chỉ đi bằng các trường hợp thử nghiệm.
Oliver

@Oliver Vâng, điều đó thực sự đã ném tôi cho một vòng lặp khi làm việc với giải pháp này. Tôi chỉ thêm 8vào các trường hợp thử nghiệm vì lý do đó.
Justin Mariner


1

VB.NET (.NET 4.5), 104 byte

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

Tôi đang sử dụng tính năng của VB trong đó tên hàm cũng là một biến. Khi kết thúc thực thi, vì không có câu lệnh return, thay vào đó, nó sẽ chuyển giá trị của 'hàm'.

Điều cuối cùng A=A=3có thể nghĩ đếnreturn (A == 3) trong các ngôn ngữ dựa trên C.

Bắt đầu lúc 2 và lặp đi lặp lại các số nguyên tố. Vì tôi bắt đầu với các số nguyên tố nhỏ nhất, nó không thể chia cho một số tổng hợp.

Sẽ thử lần thứ hai để chia cho cùng một số nguyên tố. Nếu là (chẳng hạn như cách 60 được chia hai lần cho 2), nó sẽ đặt số lượng các số nguyên tố là 4 (trên mức tối đa được phép cho một số sphenic).

Dùng thử trực tuyến!


1

Thuốc nhuộm APL, 51 49 48 46 45 43 byte

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

Hãy thử trực tuyến!(đã sửa đổi để nó có thể chạy trên TryAPL)

Tôi muốn gửi một cái không dựa vào không gian tên dfns nào, ngay cả khi nó dài .


1

J, 15 14 19 byte

Lần thử trước: 3&(=#@~.@q:)~*

Phiên bản hiện tại: (*/*3=#)@~:@q: ::0:

Làm thế nào nó hoạt động:

(*/*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)

Điều này vượt qua cho các trường hợp 0, 8 và 60 mà phiên bản trước không có.


1
tại sao không 3 = # ~ .q: cho 7 ký tự? Từ phiên J 3 = # ~ .q: 30 ==> 1 và 3 = # ~ .q: 20 ==> 0
Richard Donovan

Richard, đề xuất của bạn cho kết quả dương tính giả với n = 60 và tạo ra lỗi tên miền cho n = 0, nhưng phiên bản trước của tôi cũng thất bại với n = 60. Nhận xét của bạn nhắc tôi phấn đấu cho một giải pháp chính xác!
bob

0

Toán học, 66 57 byte

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

Xác định một hàm ẩn danh.

Transpose .

Giải trình

FactorIntegerđưa ra một danh sách các cặp nhân tố và số mũ của chúng. Ví dụ FactorInteger[2250]=={{2,1},{3,2},{5,3}}. Điều này được hoán chuyển để dễ sử dụng và cung cấp cho chức năng Length@#1==3&&And@@EqualTo[1]/@#2&. Phần thứ nhất Length@#1==3, kiểm tra xem có 3 yếu tố duy nhất, trong khi phần thứ hai, And@@EqualTo[1]/@#2kiểm tra xem tất cả các số mũ là 1.


0

PHP, 66 byte:

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

Chạy như ống với -nRhoặc thử trực tuyến .

Vòng lặp vô hạn cho 0; chèn $n&&trước --$nđể sửa.

phá vỡ

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

Ví dụ
tranh luận = 30:
thừa số nguyên tố là 2, 35
ước khác 1, 2 * 3 = 62 * 5 = 103 * 5 = 15
sản phẩm của họ: 1*2*3*5*6*10*15được 27000==30**3


0

Python 99 byte

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

Trình đầu tiên. Hãy tha thứ cho tôi nếu tôi làm điều gì sai. Kinda ngớ ngẩn, đếm số lượng các yếu tố củan , và sau đó số lần nchia hết cho mỗi lần (bằng cách thêm 10 ** 9).

Tôi khá chắc chắn rằng có một vài cách dễ dàng để cắt bỏ ~ 10-20 ký tự, nhưng tôi đã không làm thế.

Ngoài ra đây là intractably chậm lúc 10 ** 9. Có thể được thực hiện ổn bằng cách thay đổi '...a+=1\n'*nđể '...a+=1\n'*n**.5, như chúng ta chỉ cần phải đi đến căn bậc hai của n.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.