Apakah ini Nomor Sphenik?


29

Nomor Sphenic adalah angka yang merupakan produk tepat dari tiga bilangan prima yang berbeda. Beberapa angka Sphenic pertama adalah 30, 42, 66, 70, 78, 102, 105, 110, 114. Ini adalah urutan A007304 dalam OEIS.

Tugas Anda:

Tulis program atau fungsi untuk menentukan apakah bilangan bulat yang dimasukkan adalah angka Sphenic.

Memasukkan:

Integer antara 0 dan 10 ^ 9, yang mungkin atau mungkin bukan Nomor Sphenic.

Keluaran:

Nilai kebenaran / kepalsuan yang menunjukkan apakah input adalah Nomor Sphenic.

Contoh:

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

Mencetak:

Ini adalah , kode terpendek dalam byte yang menang.


Apakah 60bilangan bulat? 2 × 2 × 3 × 5
Erik the Outgolfer

1
@EriktheOutgolfer itu bukan produk dari 3 bilangan prima yang berbeda, itu adalah produk dari 3 bilangan yang berbeda dan 1 duplikat.
R

1
@Riker Saya tidak begitu yakin apakah "3 bilangan prima" berarti "3 bilangan prima yang semuanya berbeda" atau "ketika uniquified harus tetap ada 3 bilangan prima". EDIT: Oh saya mengerti, 60bukan angka sphenic. (menunggu klarifikasi OP)
Erik the Outgolfer

@EriktheOutgolfer Menurut definisi angka sphenik, 60 bukan salah satunya. Namun saya tidak tahu apakah 60 valid untuk tantangan ini.
Wheat Wizard

@WheatWizard, 60 bukan angka sphenic (misalnya output / return falsy).
Gryphon - Reinstate Monica

Jawaban:


7

Brachylog , 6 3 byte

ḋ≠Ṫ

Cobalah online!

Penjelasan

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

2
Dan kemudian ada satu bahasa yang memiliki builtin like .
Erik the Outgolfer,

Dan builtin juga.
Zacharý

1
@ Zacharý sebenarnya bukan predikat bawaan ; itu adalah variabel bawaan: daftar 3 elemen variabel. Ini adalah variabel pra-kendala yang cukup berguna dalam berbagai tantangan.
Fatalkan

Selamat atas jawaban tersingkat.
Gryphon - Reinstate Monica

11

bash, 43 byte

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

Cobalah online!

Input melalui argumen baris perintah, output 0atau 1ke stdout.

Cukup jelas; mem-parsing output factoruntuk memeriksa bahwa faktor pertama dan kedua berbeda, yang kedua dan ketiga berbeda (mereka dalam urutan, jadi ini cukup), dan ada empat bidang (jumlah input dan tiga faktor).


11

MATL , 7 byte

_YF7BX=

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

_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 Saya berpikir tentang itu, tetapi kemudian ouput yang salah menjadi lebih buruk (baik kosong dengan kesalahan atau array dengan beberapa nol). Tidak yakin apakah saya harus ...
Luis Mendo

4
X=adalah builtin paling menyedihkan yang pernah saya lihat.
Erik the Outgolfer

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

Penjelasan komentar yang tidak dikomentari:

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
}

Cobalah online!


1
Pertimbangkan i*1.0/lgips untuk mengapung. (Dan karena l, jbersifat global mereka diinisialisasi ke 0 secara gratis, Anda tidak perlu melakukan itu jika fungsi hanya dipanggil sekali. Tidak yakin apa aturannya untuk itu.)
Mat


5

CJam , 11 byte

rimFz1=7Yb=

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Berdasarkan jawaban MATL saya.

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

Sekam , 6 byte

≡ḋ3Ẋ≠p

Cobalah online!

Mengembalikan 1 untuk nomor sphenic dan 0 sebaliknya.

Penjelasan

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

Dalam perikop terakhir, kesesuaian antara dua daftar berarti memiliki panjang yang sama dan distribusi nilai kebenaran / kepalsuan yang sama. Dalam hal ini kami sedang memeriksa bahwa hasil kami disusun oleh dua nilai yang benar (yaitu tidak nol).


4

Mathematica, 31 byte

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

Karena Anda sudah menguji coba-coba-bebas, PrimeNuakan baik-baik saja PrimeOmega, dan lebih pendek.
Mark S.

4

Jelly , 6 byte

ÆE²S=3

Cobalah online!

Bagaimana itu bekerja

Æ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:)~*

Cobalah online!

Penjelasan

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

Penggunaan ~: dan # yang sangat bagus. Alternatifnya adalah (7 & (= #. @ ~: @Q:) ~ *) yang menurut saya sedikit lebih mudah dibaca, tetapi tidak lebih pendek.
bob


2

Ruby, 81 49 46 byte

Termasuk 6 byte untuk opsi baris perintah -rprime.

->n{n.prime_division.map(&:last)==[1]*3}

Cobalah online!


2

Python 3 , 54 53 byte

lambda n:sum(1>>n%k|7>>k*k%n*3for k in range(2,n))==6

Terima kasih kepada @xnor karena bermain golf 1 byte!

Cobalah online!


Anda dapat memeriksa squarefreeness dengan k*k%nbukann%k**2
xnor

Benar, saya hanya perlu satu kegagalan. Terima kasih!
Dennis

2

C, 91 102 byte, dikoreksi (lagi), golfed, dan diuji untuk real time ini:

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

/ * Ini juga berfungsi dalam 93 byte, tetapi karena saya lupa tentang aturan standar yang membatasi tipe int default pada variabel dinamis, dan tentang tidak memungkinkan nilai pengembalian implisit tanpa tugas, saya tidak akan mengambilnya:

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

(Siapa bilang aku tahu sesuatu tentang C? ;-)

Inilah kerangka uji dengan skrip shell di komentar:

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

Saya meminjam jawaban betseg sebelumnya untuk mendapatkan versi saya.

Ini adalah versi algoritma betseg saya, yang saya pilih untuk solusi:

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

Apakah itu menjawab pertanyaan, sekarang?
Joel Rees

Ya, benar. Masukkan ini untuk nge-link jawaban betseg ini: [betseg's answer](https://codegolf.stackexchange.com/a/135203/65836). Anda juga dapat mengklik sunting pada jawabannya untuk menyarankan sunting padanya, jika Anda mau, itu akan menyertakan penjelasan - tidak ada janji apakah itu akan disetujui atau tidak.
Stephen

Saya di sini sekarang, dan saya memperbaiki program saya, itu pada 87 byte sekarang; tetapi program Anda terlihat bagus juga.
betseg

@betseg Menarik bahwa Anda menggunakan floating point saat ini. Oh, dan terima kasih telah mengizinkan saya meminjam algoritme Anda. ;-)
Joel Rees

@ JoelRees saya menambahkan penjelasan pada jawaban saya, saya kira jawaban Anda juga punya masalah? tampaknya tidak berfungsi dengan benar: Try It Online
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])

Cuplikan kode contoh:

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

  • Sudah cukup lama karena ini mencakup semua prosedur: pengecekan prima, mendapatkan faktor prima dan memeriksa kondisi bilangan sphere.
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))])

Cobalah online!



1

J, 23 byte

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

Cobalah online!

Penanganan 8 dan 0 pada dasarnya merusak yang satu ini ...

q: memberi Anda semua faktor utama, tetapi tidak menangani 0. sisanya hanya mengatakan "faktor unik harus sama dengan faktor" dan "jumlah mereka harus 3"


Gagal menerima masukan60
Conor O'Brien

@ ConorO'Brien terima kasih. Lihat edit saya - memperbaiki 60 membantu , tetapi saya menyadari saya juga tidak menangani 0 dengan benar, dan menangani yang lebih dari dua kali lipat byte
Jonah

Yang terakhir adalah ide awal saya, dan itu gagal 8.
Conor O'Brien

Saya memiliki (6=]#@,~.)@q:solusi yang mungkin
Conor O'Brien

@ ConorO'Brien ah poin bagus tentang 8. milikmu akan gagal untuk 0.
Jonah

1

Japt , 14 byte

k
k@è¥X ÉÃl ¥3

Cobalah online!


@Liver Itu akan menghasilkan melewatkan fungsi Number.k(), yang tidak akan berpengaruh dan hanya memeriksa apakah input memiliki 3 faktor prima, bukan 3 faktor prima yang berbeda . Itu berarti 8(dengan tiga faktor utama :)2, 2, 2 akan berlalu meskipun tidak berada di A007304
Justin Mariner

Ah kamu benar Saya hanya pergi dengan kasus uji.
Oliver

@ Oliver Ya, itu benar-benar membuat saya kesal ketika mengerjakan solusi ini. Saya baru saja menambahkan 8ke dalam test case untuk alasan itu.
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

Saya menggunakan fitur VB di mana nama fungsinya juga variabel. Pada akhir eksekusi, karena tidak ada pernyataan kembali, ia akan meneruskan nilai 'fungsi'.

Yang terakhir A=A=3bisa dipikirkanreturn (A == 3) dalam bahasa berbasis C.

Mulai dari 2, dan menarik bilangan prima dari iteratif. Karena saya mulai dengan bilangan prima terkecil, itu tidak dapat dibagi dengan angka komposit.

Akan mencoba untuk kedua kalinya untuk membagi dengan perdana yang sama. Jika ya (seperti bagaimana 60 dibagi dua kali dengan 2), itu akan menetapkan jumlah bilangan prima menjadi 4 (di atas maks yang diizinkan untuk nomor sphenik).

Cobalah secara Online!


1

Dyalog APL, 51 49 48 46 45 43 byte

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

Cobalah online!(dimodifikasi sehingga dapat berjalan di TryAPL)

Saya ingin mengirimkan satu yang tidak bergantung pada namespace dfns apa pun, bahkan jika itu panjang .


1

J, 15 14 19 byte

Upaya sebelumnya: 3&(=#@~.@q:)~*

Versi sekarang: (*/*3=#)@~:@q: ::0:

Bagaimana itu bekerja:

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

Ini berlaku untuk case 0, 8 dan 60 yang versi sebelumnya tidak.


1
mengapa tidak 3 = # ~ .q: untuk 7 karakter? Dari sesi J 3 = # ~ .q: 30 ==> 1 dan 3 = # ~ .q: 20 ==> 0
Richard Donovan

Richard, saran Anda memberikan false positive untuk n = 60 dan membuat kesalahan domain untuk n = 0, tetapi versi saya sebelumnya gagal untuk n = 60 juga. Komentar Anda mendorong saya untuk mencari solusi yang tepat!
bob

0

Mathematica, 66 57 byte

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

Menentukan fungsi anonim.

aku s Transpose .

Penjelasan

FactorIntegermemberikan daftar pasangan faktor dan eksponennya. Misalnya FactorInteger[2250]=={{2,1},{3,2},{5,3}}. Ini dialihkan untuk kemudahan penggunaan dan dimasukkan ke fungsi Length@#1==3&&And@@EqualTo[1]/@#2&. Bagian pertama Length@#1==3,, memeriksa bahwa ada 3 faktor unik, sedangkan yang kedua, And@@EqualTo[1]/@#2memeriksa bahwa semua eksponen adalah 1.


0

PHP, 66 byte:

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

Jalankan sebagai pipa dengan -nRatau coba online .

Loop tak terbatas untuk 0; masukkan $n&&sebelum --$nuntuk memperbaikinya.

kerusakan

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

contoh
argumen = 30:
faktor prima adalah 2, 3dan 5
pembagi lainnya adalah 1, 2 * 3 = 6, 2 * 5 = 10dan 3 * 5 = 15
produk mereka: 1*2*3*5*6*10*15adalah 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

Pengiriman pertama. Maafkan saya jika saya melakukan sesuatu yang salah. Agak konyol, menghitung jumlah faktor n, dan kemudian berapa kalin dibagi oleh masing-masing (dengan menambahkan 10 ** 9).

Saya cukup yakin ada beberapa cara mudah untuk memotong ~ 10-20 karakter, tetapi saya tidak melakukannya.

Juga ini adalah intractably lambat pada 10 ** 9. Bisa dibuat oke dengan mengubah '...a+=1\n'*nke '...a+=1\n'*n**.5, karena kita hanya perlu pergi ke akar kuadrat dari n.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.