Sphenic Sayı mı?


29

Sphenic Number, tam olarak üç ayrı astarın çarpımıdır. İlk birkaç Sphenic sayılardır 30, 42, 66, 70, 78, 102, 105, 110, 114. Bu, OEIS'deki A007304 dizisidir .

Senin görevin:

Girilen bir tamsayının Sphenic sayı olup olmadığını belirlemek için bir program veya işlev yazın.

Giriş:

Sphenic Number olabilen veya olamayabilen 0 ile 10 ^ 9 arasında bir tam sayı.

Çıktı:

Girişin Sphenic Number olup olmadığını gösteren bir truthy / falsy değeri.

Örnekler:

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

puanlama:

Bu , bayt cinsinden kazanılan en kısa koddur.


60bir sphenic numara? 2 × 2 × 3 × 5
Outgolfer Erik

1
@EriktheOutgolfer, 3 farklı astarın ürünü değil, 3 farklı ve 1 yinelenen asal maddenin ürünü.
15'te

1
@Riker "3 farklı asal", "tamamen farklı 3 asal" veya "benzersiz olduğunda 3 asal kalmalıdır" anlamına geldiğinden emin değilim. EDIT: Ah, görüyorum 60ki sfenik sayı değil. (OP açıklama bekliyor)
Outgolfer Erik,

@EriktheOutgolfer Sfenik sayıların tanımına göre, 60 tanesi bunlardan biri değildir. Ancak bu meydan okuma için 60 geçerli olup olmadığını bilmiyorum.
Buğday Sihirbazı

@WheatWizard, 60 sfenik bir sayı değildir (örneğin çıktı / geri dönüş sahte).
Gryphon - Reinstate Monica

Yanıtlar:


7

Brachylog , 6 3 bayt

ḋ≠Ṫ

Çevrimiçi deneyin!

açıklama

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

2
Ve sonra gibi bir yerleşik bir dil var .
Outgolfer Erik,

Ve yerleşik olarak da.
Zacharý

1
@ Zacharý aslında yerleşik bir iddia değil; yerleşik bir değişkendir: 3 değişkenli öğelerin listesi. Birçok farklı zorlukta oldukça kullanışlı, önceden kısıtlanmış bir değişkendir.
17'de

En kısa cevap için tebrikler.
Gryphon - Reinstate Monica,

11

bash, 43 bayt

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

Çevrimiçi deneyin!

Komut satırı argümanı üzerinden girdi, çıktı 0veya 1stdout.

Oldukça kendini açıklayıcı; factorBirinci ve ikinci faktörlerin farklı olduğunu, ikinci ve üçüncülüğün farklı olduğunu kontrol etmek için çıktıyı ayrıştırır (sıralı düzendedirler, bu yüzden bu yeterlidir) ve dört alan vardır (giriş numarası ve üç faktör).



9

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

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 yorum yaptı:

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
}

Çevrimiçi deneyin!


1
Yüzmek i*1.0/liçin alçı yerine düşünün . (Beri l, jgeneldir parasız 0'a başlatılır, işlevin yalnızca bir kez denir eğer bunu yapmak gerekmez emin değil kural olduğu için ne olduğunu..)
Mat


5

CJam , 11 bayt

rimFz1=7Yb=

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

MATL cevabıma dayanarak.

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

Kabuğu , 6 bayt

≡ḋ3Ẋ≠p

Çevrimiçi deneyin!

Sfenik sayılar için 1, aksi takdirde 0 döndürür.

açıklama

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

Son bölümde, iki liste arasındaki uyum, aynı uzunluk ve aynı truthy / falsy değerlerinin dağılımına sahip olduğu anlamına gelir. Bu durumda, sonucumuzun iki hakikat (yani sıfır olmayan) değerlerden oluştuğunu kontrol ediyoruz.


4

Mathematica, 31 bayt

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

Zaten kare serbestlik için test yaptığınız için, PrimeNuhem olduğu gibi hem de PrimeOmegadaha kısa sürecektir .
Mark S.

4

Jöle , 6 bayt

ÆE²S=3

Çevrimiçi deneyin!

Nasıl çalışır

Æ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 bayt

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

Çevrimiçi deneyin!

açıklama

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

~: Ve # öğelerinin çok iyi kullanımı. Alternatif, okumasını biraz daha kolay bulduğum (7 & (= #. @ ~: @Q:) ~ *) olabilir ama daha kısa değil.
bob



2

Python 3 , 54 53 bayt

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

1 byte kapalı golf için @xnor için teşekkürler!

Çevrimiçi deneyin!


Kare perdesini şunun k*k%nyerine kontrol edebilirsinizn%k**2
xnor

Doğru, sadece bir başarısızlığa ihtiyacım var. Teşekkürler!
Dennis,

2

C, 91 102 bayt, düzeltildi (tekrar), golf ve gerçek zamanlı olarak test edildi:

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

/ * Bu aynı zamanda 93 baytta da çalışır, ancak dinamik değişkenlerde varsayılan int türünü engelleyen standart kuralları ve atama olmadan örtük dönüş değerlerine izin vermemeyi unuttuğum için almayacağım:

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 hakkında bir şey bildiğimi kim söyledi? ;-)

İşte yorumlarda kabuk betiği ile test çerçevesi:

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

Sürümüme ulaşmak için Betseg'in önceki cevabını ödünç aldım.

Bu benim çözümüme ulaşmak için golf oynadığım betseg'in algoritması versiyonum:

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

Şimdi soruyu cevaplıyor mu?
Joel Rees,

Evet öyle. Betseg cevabı bağlantıya Bu ekleyin: [betseg's answer](https://codegolf.stackexchange.com/a/135203/65836). İsterseniz, açıklamayı da içerecek bir düzenleme önermek için cevabını düzenle seçeneğini tıklayabilirsiniz. İsterseniz, onaylanıp onaylanmayacağına dair hiçbir söz verilmez.
Stephen,

Ben şimdi buradayım ve programımı düzelttim, şimdi 87 byte'da; ancak programınız da iyi görünüyor.
17'de

@betseg Bu sefer kayan nokta kullanmanız ilginç. Oh, ve algoritmasını ödünç almama izin verdiğin için teşekkürler. ;-)
Joel Rees

@JoelRees cevabımı açıklama ekledim, ayrıca cevabın bence bir sorun mu var? düzgün çalışmıyor gibi görünüyor: Çevrimiçi Deneyin
betseg


1

Javascript (ES6), 87 bayt

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

Örnek kod pasajı:

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 bayt

  • Çok uzun zamandır bu işlem tüm prosedürleri içeriyor: asal kontrol, asal alma faktörleri ve küre numarası durumunu kontrol etme
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))])

Çevrimiçi deneyin!



1

J, 23 bayt

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

Çevrimiçi deneyin!

8 ve 0 numaralarını kullanmak bunu temelde mahvetti ...

q: tüm asal faktörleri size verir, ancak 0'ı ele almaz


Bu, giriş başarısız olur60
Conor O'Brien,

@ ConorO'Brien teşekkürler. Düzenlememe bakın - düzeltme 60 yardımcı oldu , ancak aynı zamanda 0'ı doğru şekilde işleme koyamadığımı ve baytları iki katına
Jonah

Sonuncusu benim orijinal fikrimdi ve bu başarısız oldu 8.
Conor O'Brien,

(6=]#@,~.)@q:Olası bir çözüm olarak sahibim
Conor O'Brien,

@ ConorO'Brien ah 8 hakkında iyi bir nokta. Sizinki olsa, 0 için başarısız olur.
Jonah

1

Japt , 14 bayt

k
k@è¥X ÉÃl ¥3

Çevrimiçi deneyin!


@Oliver Bu Number.k(), herhangi bir etkisinin olmayacağı bir fonksiyonun geçmesine neden olur ve girişin 3 farklı ana faktör değil 3 ana faktör olup olmadığını kontrol eder . Bu, 8(üç ana faktör 2, 2, 2ile :) A007304'te
Justin Mariner

Ah haklısın. Sadece test davalarına gidiyordum.
Oliver,

@Oliver Evet, bu çözüm üzerinde çalışırken gerçekten beni bir döngü için attı. 8Bu nedenle test davalarına yeni ekledim .
Justin Mariner


1

VB.NET (.NET 4.5), 104 bayt

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

Fonksiyon isminin de değişken olduğu VB özelliğini kullanıyorum. Yürütme sonunda, return ifadesi olmadığından, bunun yerine 'işlev' değerini geçecektir.

Sonuncusu C tabanlı dillerde A=A=3düşünülebilir return (A == 3).

2'de başlar ve yinelemeli asalları çeker. En küçük harflerle başladığımdan beri, bileşik sayıya bölünemez.

Aynı prime göre bölmek için ikinci kez deneyeceğim. Eğer (60'ın nasıl 2'ye 2'ye bölündüğü gibi) ise, prim sayısını 4'e (sphenic sayı için izin verilen maksimum değerin üstünde) ayarlayacaktır.

Çevrimiçi Deneyin!


1

Dyalog APL, 51 49 48 46 45 43 bayt

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

Çevrimiçi deneyin! (TryAPL'de çalışabilmesi için değiştirildi)

Uzun olsa bile dfns ad alanına dayanmayan bir tane göndermek istedim .


1

J, 15 14 19 bayt

Önceki deneme: 3&(=#@~.@q:)~*

Şimdiki versiyonu: (*/*3=#)@~:@q: ::0:

Nasıl çalışır:

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

Bu önceki versiyonun yapmadığı 0, 8 ve 60 numaralı durumlar için geçerlidir.


1
neden 3 = # ~ .q değil: 7 karakter için? Bir J oturumundan 3 = # ~ .q: 30 ==> 1 ve 3 = # ~ .q: 20 ==> 0
Richard Donovan

Richard, önerin n = 60 için yanlış bir pozitif veriyor ve n = 0 için bir etki alanı hatası yaratıyor, ancak önceki sürümüm n = 60 için de başarısız oldu. Yorumunuz doğru bir çözüm için çaba göstermemi istedi!
bob

0

Mathematica, 66 57 bayt

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

Anonim bir işlev tanımlar.

olduğunu Transpoze .

açıklama

FactorIntegerfaktör çiftlerinin ve üslerinin bir listesini verir. Örn FactorInteger[2250]=={{2,1},{3,2},{5,3}}. Bu kullanım kolaylığı için transpoze edilir ve fonksiyona beslenir Length@#1==3&&And@@EqualTo[1]/@#2&. İlk bölüm Length@#1==33 benzersiz faktör And@@EqualTo[1]/@#2olup olmadığını , ikincisi ise tüm üslerin 1 olduğunu kontrol eder.


0

PHP, 66 bayt:

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

Pipe ile çalıştırın -nRveya çevrimiçi deneyin .

Sonsuz döngü 0; düzeltmek için $n&&önce takın --$n.

Yıkmak

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

Örnek
bağımsız değişken = 30:
temel faktör 2, 3ve 5
diğer bölenler olan 1, 2 * 3 = 62 * 5 = 10ve 3 x 5 = 15
, ürün: 1*2*3*5*6*10*15olup 27000==30**3


0

Python 99 bayt

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

İlk başvuru. Yanlış bir şey yaptıysam beni affet. Biraz aptalca, faktörlerin sayısını sayar nve daha sonra kaç kişi ntarafından bölünebilir (10 ** 9 ekleyerek).

~ 10-20 karakterleri kesmenin birkaç kolay yolu olduğuna eminim, ama yapmadım.

Ayrıca bu, 10 ** 9'da intraktabl olarak yavaş. Yapılmış olabilir tamam değiştirerek '...a+=1\n'*niçin '...a+=1\n'*n**.5biz sadece kare köküne gitmeye gerek olarak, n.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.