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.


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

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


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

@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!


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


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


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.


4

Mathematica, 31 Bytes

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

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.




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

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

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

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


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!



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"


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!


@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!


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 .


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.


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.


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.