Ist es eine sphenische Zahl?

29

Eine Sphenic Number ist eine Zahl, die aus genau drei verschiedenen Primzahlen besteht. Die ersten sphenischen Zahlen sind 30, 42, 66, 70, 78, 102, 105, 110, 114. Dies ist die Sequenz A007304 im OEIS.

Deine Aufgabe:

Schreiben Sie ein Programm oder eine Funktion, um festzustellen, ob eine eingegebene Ganzzahl eine sphenische Zahl ist.

Eingang:

Eine ganze Zahl zwischen 0 und 10 ^ 9, die eine sphenische Zahl sein kann oder nicht.

Ausgabe:

Ein wahrer / falscher Wert, der angibt, ob die Eingabe eine sphenische Zahl ist.

Beispiele:

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

Wertung:

Dies ist , der kürzeste Code in Bytes gewinnt.

Gryphon - Setzen Sie Monica wieder ein
quelle
Ist 60eine sphenische Zahl? 2 × 2 × 3 × 5
Erik der Outgolfer
1
@EriktheOutgolfer, das ist jedoch nicht das Produkt von 3 unterschiedlichen Primzahlen, das ist das Produkt von 3 unterschiedlichen und 1 duplizierten Primzahlen.
23.
1
@Riker Ich bin mir nicht sicher, ob "3 verschiedene Primzahlen" "3 verschiedene Primzahlen" bedeutet oder "wenn es eindeutig ist, sollten 3 Primzahlen übrig bleiben". EDIT: Oh ich verstehe, 60ist keine sphenische Zahl. (Warten auf OP-Klärung)
Erik der Outgolfer
@EriktheOutgolfer Nach der Definition von sphenischen Zahlen gehört 60 nicht dazu. Ich weiß jedoch nicht, ob 60 für diese Herausforderung gültig ist.
Weizen-Assistent
@WheatWizard, 60 ist keine sphenische Zahl (zB Ausgabe / Rückgabe falsch).
Gryphon - Reinstate Monica

Antworten:

7

Brachylog , 6 3 Bytes

ḋ≠Ṫ

Probieren Sie es online!

Erläuterung

ḋ        The prime factorization of the Input…
 ≠       …is a list of distinct elements…
  Ṫ      …and there are 3 elements
Tödlich
quelle
2
Und dann gibt es noch die eine Sprache, die einen eingebauten Charakter hat .
Erik der Outgolfer
Und das eingebaute auch.
Zacharý
1
@ Zacharý ist allerdings kein eingebautes Prädikat; es ist eine eingebaute Variable: eine Liste von 3 variablen Elementen. Es ist eine ziemlich nützliche Variable mit Einschränkungen für viele verschiedene Herausforderungen.
Fatalize
Herzlichen Glückwunsch zur kürzesten Antwort.
Gryphon - Wiedereinsetzung von Monica
11

Bash, 43 Bytes

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

Probieren Sie es online!

Eingabe über Kommandozeilenargument, Ausgabe 0oder 1nach stdout.

Ziemlich selbsterklärend; analysiert die Ausgabe von factor, um zu überprüfen, ob der erste und der zweite Faktor unterschiedlich sind, der zweite und der dritte (sie sind in sortierter Reihenfolge, dies ist also ausreichend) und es gibt vier Felder (die Eingabenummer und die drei Faktoren).

Türknauf
quelle
11

MATL , 7 Bytes

_YF7BX=

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

_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
Luis Mendo
quelle
@Suever Ich habe darüber nachgedacht, aber dann wird falsy ouput hässlicher (entweder leer mit Fehler oder ein Array mit einigen Nullen). Ich bin mir nicht sicher, ob ich sollte ...
Luis Mendo
4
X=ist das traurigste, was ich je gesehen habe.
Erik der Outgolfer
9

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

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 kommentierte Erklärung:

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
}

Probieren Sie es online!

betseg
quelle
1
Betrachten Sie i*1.0/lstatt der Besetzung zu schweben. (Und da l, jglobal sind sie auf 0 kostenlos initialisiert sind, brauchen Sie nicht , das zu tun , wenn die Funktion nur einmal aufgerufen wird nicht sicher , was die Regel für das ist..)
Mat
76 Bytes
Ceilingcat
5

CJam , 11 Bytes

rimFz1=7Yb=

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

Basierend auf meiner MATL-Antwort.

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
Luis Mendo
quelle
5

Gelee , 8 Bytes

ÆEḟ0⁼7B¤

Probieren Sie es online!

Verwendet den Algorithmus von Luis Mendo.

Erläuterung:

ÆEḟ0⁼7B¤
ÆE       Prime factor exponents
  ḟ0     Remove every 0
    ⁼7B¤ Equal to 7 in base 2?
Erik der Outgolfer
quelle
4

Schale , 6 Bytes

≡ḋ3Ẋ≠p

Probieren Sie es online!

Gibt 1 für sphenische Zahlen und 0 sonst zurück.

Erläuterung

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

Im letzten Abschnitt bedeutet Kongruenz zwischen zwei Listen die gleiche Länge und die gleiche Verteilung von Wahrheits- / Falschheitswerten. In diesem Fall überprüfen wir, ob unser Ergebnis aus zwei wahren (dh nicht null) Werten besteht.

Löwe
quelle
4

Mathematica, 31 Bytes

SquareFreeQ@#&&PrimeOmega@#==3&
martin
quelle
Da Sie bereits auf Rechtwinkligkeit testen, funktioniert PrimeNudies genauso gut PrimeOmegaund ist kürzer.
Mark S.
4

Gelee , 6 Bytes

ÆE²S=3

Probieren Sie es online!

Wie es funktioniert

Æ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.
Dennis
quelle
2

Eigentlich 7 Bytes

w♂N13α=

Probieren Sie es online!

Erläuterung:

w♂N13α=
w       Push [prime, exponent] factor pairs
 ♂N     Map "take last element"
   1    Push 1
    3   Push 3
     α  Repeat
      = Equal?
Erik der Outgolfer
quelle
2

J , 15 Bytes

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

Probieren Sie es online!

Erläuterung

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
Meilen
quelle
Sehr gute Verwendung von ~: und #. Eine Alternative könnte (7 & (= #. @ ~: @Q:) ~ *) sein, die ich etwas einfacher zu lesen finde, die aber nicht kürzer ist.
Bob
2

Dyalog APL, 26 Bytes

⎕CY'dfns'
((≢,∪)≡3,⊢)3pco⎕

Probieren Sie es online!

Uriel
quelle
2

Ruby, 81 49 46 Bytes

Beinhaltet 6 Bytes für Befehlszeilenoptionen -rprime.

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

Probieren Sie es online!

daniero
quelle
2

Python 3 , 54 53 Bytes

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

Vielen Dank an @xnor für das Golfen ab 1 Byte!

Probieren Sie es online!

Dennis
quelle
Sie können die Rechteckigkeit mit k*k%nanstattn%k**2
xnor 24.07.17
Richtig, ich brauche nur einen Fehler. Vielen Dank!
Dennis
2

C, 91 102 Bytes, korrigiert (erneut), golfen und diesmal auf Echtheit getestet:

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

/ * Das funktioniert auch in 93 Bytes, aber da ich die Standardregeln vergessen habe, die den int-Standardtyp für dynamische Variablen ausschließen, und die impliziten Rückgabewerte ohne Zuweisungen nicht zulassen, nehme ich das nicht an:

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

(Wer hat gesagt, ich wüsste etwas über C? ;-)

Hier ist der Testrahmen mit Shell-Skript in Kommentaren:

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

Ich habe die vorherige Antwort von betseg ausgeliehen, um zu meiner Version zu gelangen.

Dies ist meine Version des Betseg-Algorithmus, mit dem ich zu meiner Lösung gekommen bin:

/* 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 */
Joel Rees
quelle
Beantwortet es jetzt die Frage?
Joel Rees
Ja tut es. Fügen Sie diese zu Link zu betseg Antwort: [betseg's answer](https://codegolf.stackexchange.com/a/135203/65836). Sie können auch auf "Bearbeiten" in seiner Antwort klicken, um eine Änderung vorzuschlagen, wenn Sie möchten, die die Erklärung enthalten würde - keine Zusicherung, ob sie genehmigt wird oder nicht.
Stephen
Ich bin jetzt hier und habe mein Programm repariert. Es ist jetzt 87 Byte groß. aber dein programm sieht auch gut aus.
Betseg
@betseg Interessant, dass Sie diesmal Gleitkommazahlen verwendet haben. Oh, und danke, dass ich Ihren Algorithmus ausleihen durfte. ;-)
Joel Rees
@ JoelRees Ich habe meiner Antwort eine Erklärung hinzugefügt. Hat auch Ihre Antwort ein Problem, denke ich? es scheint nicht richtig zu funktionieren: Probieren Sie es online aus
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])

Beispielcode-Snippet:

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)}`)
}

Herman L
quelle
1

Python 2 , 135 121 Bytes

  • Dies umfasst längst alle Prozeduren: Primcheck, Primfaktoren erhalten und Kugelzahlbedingung prüfen.
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))])

Probieren Sie es online!

officialaimm
quelle
1

Python 2 , 59 Bytes

lambda x:6==sum(5*(x/a%a+x%a<1)+(x%a<1)for a in range(2,x))

Probieren Sie es online!

Weizen-Assistent
quelle
Dies ergibt False Positives wie 48. Ich hatte das Gleiche versucht.
Xnor
@xnor Behoben, aber auf Kosten von Bytes.
Weizen-Assistent
1

J, 23 Bytes

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

Probieren Sie es online!

Umgang mit 8 und 0 im Grunde ruiniert dieses ...

q: gibt alle Primfaktoren an, aber behandelt nicht 0. der Rest sagt nur "die eindeutigen Faktoren sollten den Faktoren entsprechen" und "die Anzahl von ihnen sollte 3 sein"

Jona
quelle
Dies schlägt für die Eingabe fehl 60
Conor O'Brien
@ ConorO'Brien danke. Siehe meine Bearbeitung - das Reparieren von 60 hat geholfen , aber mir wurde klar, dass ich auch nicht richtig mit 0 umgegangen bin , und dass das die Bytes mehr als verdoppelt
Jonah
Der letzte war meine ursprüngliche Idee, und das scheitert für 8.
Conor O'Brien
Ich habe (6=]#@,~.)@q:als mögliche Lösung
Conor O'Brien
@ ConorO'Brien ah guter Punkt über 8. Ihr wird jedoch für 0 scheitern.
Jonah
1

Japt , 14 Bytes

k
k@è¥X ÉÃl ¥3

Probieren Sie es online!

Justin Mariner
quelle
@Oliver Das würde dazu führen, dass eine Funktion an übergeben wird Number.k() , die keine Auswirkung hat. Überprüfen Sie einfach, ob der Eingang 3 Primfaktoren und nicht 3 unterschiedliche Primfaktoren enthält. Das würde bedeuten, dass 8(mit drei Hauptfaktoren :) bestanden2, 2, 2 würde, obwohl ich nicht in A007304 bin
Justin Mariner
Ah, du hast recht. Ich habe gerade die Testfälle durchgesehen.
Oliver
@Oliver Ja, das hat mich bei der Arbeit an dieser Lösung wirklich auf eine Schleife gebracht. Aus 8diesem Grund habe ich gerade zu den Testfällen hinzugefügt .
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

Ich benutze die Funktion von VB, bei der der Funktionsname auch eine Variable ist. Da es am Ende der Ausführung keine return-Anweisung gibt, wird stattdessen der Wert der 'function' übergeben.

Das Letzte A=A=3 kann gedacht werdenreturn (A == 3) in C-basierten Sprachen .

Beginnt bei 2 und zieht iterativ die Primzahlen ab. Da ich mit den kleinsten Primzahlen beginne, kann sie nicht durch eine zusammengesetzte Zahl geteilt werden.

Ich werde ein zweites Mal versuchen, mich durch dieselbe Primzahl zu teilen. Wenn dies der Fall ist (z. B. wie 60 durch 2 geteilt wird), wird die Anzahl der Primzahlen auf 4 gesetzt (über dem für eine sphenische Zahl zulässigen Höchstwert).

Probieren Sie es online!

Brian J
quelle
1

Dyalog APL, 51 49 48 46 45 43 Bytes

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

Probieren Sie es online!(geändert, damit es auf TryAPL ausgeführt werden kann)

Ich wollte einen einreichen, der sich überhaupt nicht auf den dfns-Namespace stützt, auch wenn er lang ist .

Zacharý
quelle
1

J 15, 14 19 Bytes

Vorheriger Versuch: 3&(=#@~.@q:)~*

Aktuelle Version: (*/*3=#)@~:@q: ::0:

Wie es funktioniert:

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

Dies gilt für die Fälle 0, 8 und 60, die die vorherige Version nicht erfüllt hat.

Bob
quelle
1
warum nicht 3 = # ~ .q: für 7 Zeichen? Aus einer J-Sitzung 3 = # ~ .q: 30 ==> 1 und 3 = # ~ .q: 20 ==> 0
Richard Donovan
Richard, Ihr Vorschlag gibt ein falsches Positiv für n = 60 und erstellt einen Domänenfehler für n = 0, aber meine vorherige Version schlug auch für n = 60 fehl. Ihr Kommentar veranlasste mich, eine korrekte Lösung anzustreben!
Bob
0

Mathematica, 66 57 Bytes

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

Definiert eine anonyme Funktion.

ist Transponieren .

Erläuterung

FactorIntegergibt eine Liste von Faktorenpaaren und deren Exponenten an. Eg FactorInteger[2250]=={{2,1},{3,2},{5,3}}. Diese wird zur einfachen Bedienung transponiert und der Funktion zugeführt Length@#1==3&&And@@EqualTo[1]/@#2&. Der erste Teil Length@#1==3prüft, ob es 3 eindeutige Faktoren gibt, während der zweite And@@EqualTo[1]/@#2prüft, ob alle Exponenten 1 sind.

DanTheMan
quelle
0

PHP, 66 Bytes:

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

Laufen Sie als Pipe mit -nRoder versuchen Sie es online .

Endlosschleife für 0; $n&&vor --$ndem einlegen fixieren.

Nervenzusammenbruch

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

Beispiel
Argument = 30:
Primfaktoren sind 2, 3und 5
andere Teiler sind 1, 2 * 3 = 6, 2 * 5 = 10und 3 * 5 = 15
ihr Produkt: 1*2*3*5*6*10*15ist 27000==30**3

Titus
quelle
0

Python 99 Bytes

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

Erste Einreichung. Vergib mir, wenn ich etwas falsch gemacht habe. Ein bisschen albern, zählt die Anzahl der Faktoren nund ist dann die Anzahl der Male ndurch jeden teilbar (durch Addition von 10 ** 9).

Ich bin mir ziemlich sicher, dass es ein paar einfache Möglichkeiten gibt, ~ 10-20 Zeichen abzuschneiden, aber ich habe es nicht getan.

Auch dies ist bei 10 ** 9 unlösbar langsam. Könnte durch den Wechsel zu in Ordnung gebracht werden , da wir nur zur Quadratwurzel von gehen müssen .'...a+=1\n'*n'...a+=1\n'*n**.5n

Rückendeckung
quelle