Finden Sie primitive semiperfekte Zahlen

17

Semiperfekte Zahlen

Eine Semiperfekt- / Pseudoperfekt-Zahl ist eine ganze Zahl, die der Summe eines Teils oder aller ihrer Teiler (ohne sich selbst) entspricht. Zahlen, die gleich der Summe aller ihrer Teiler sind, sind perfekt.

Divisors of 6 : 1,2,3
      6 = 1+2+3 -> semiperfect (perfect)
Divisors of 28 : 1,2,4,7,14
      28 = 14+7+4+2+1 -> semiperfect (perfect)
Divisors of 40 : 1,2,4,5,8,10,20
      40 = 1+4+5+10+20 or 2+8+10+20 -> semiperfect

Primitive

Eine primitive Semiperfektzahl ist eine Semiperfektzahl ohne semiperfekte Teiler (außer sich selbst :))

Divisors of 6 : 1,2,3
      6  = 1+2+3 -> primitive
Divisors of 12 : 1,2,3,4,6
      12 = 2+4+6 -> semiperfect

Verwenden Sie als Referenz die OEIS-Serie A006036 für primitive Semiperfekt-Zahlen und A005835 für Semiperfekte.

Tor

Schreiben Sie ein Programm oder eine Funktion in einer beliebigen Sprache. Als Eingabe wird eine Zahl n als Funktionsparameter oder von der nächstgelegenen Alternative von STDIN / Ihrer Sprache verwendet und es werden alle primitiven semi-perfekten Zahlen von 1 bis n (einschließlich) ausgegeben.

Die Ausgabe muss 6[separator]20[separator]28[separator]88...so formatiert werden, dass [Trennzeichen] entweder als Zeilenumbruch, Leerzeichen oder Komma steht. Es darf weder ein Start- noch ein End-Trennzeichen geben.

Bearbeiten: Sie können einen abschließenden Zeilenumbruch hinterlassen

Beispiele

Eingabe:

5

Ausgabe :

Eingabe:

20

Ausgabe :

6
20

Eingabe:

100

Ausgabe :

6 20 28 88

Wertung

Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes.

Versuchen Sie nicht, uns mit Lücken zu täuschen, bitte :).

Ich würde mich freuen, wenn Sie eine Erklärung Ihres Golf-Codes hinterlassen könnten, sobald Sie glauben, dass Sie damit fertig sind!

Da diese Herausforderung bereits einige nette Antworten hat und langsam leiser wird, werde ich dem ein Ende setzen. Der Gewinner dieses Code-Golfs wird am Montag, den 29., 00:00 Uhr GMT ermittelt. Gut gemacht an alle, die geantwortet haben, und viel Glück für diejenigen, die versuchen werden, sie zu schlagen :)

Katenkyo
quelle

Antworten:

8

Pyth, 28 27 Bytes

VQI}KhNsMyJf!%KTSNI!@JYeaYK

1 Byte danke an @Jakube

Demonstration.

VQI}KhNsMyJf!%KTSNI!@JYeaYK
                                Implicit:
                                Y = []
                                Q = eval(input())
VQ                              for N in range(Q):
    KhN                         K = N+1
           f    SN              filter T over range(1, N)
            !%KT                the logical not of K%T.
                                This is the list of divisors of K.
          J                     Store the list in J.
         y                      Create all of its subsets.
       sM                       Map each subset to its sum.
  I}K                           If K is in that list: (If K is semiperfect)
                  I!@JY         If the intersection of J (the divisors)
                                and Y (the list of primitive semiperfect numbers)
                                is empty:
                        aYK     Append K to Y
                       e        And print its last element, K.
isaacg
quelle
@AlexA. Vielen Dank! Es ist notwendig , anhängen Kzu Yzu bauen Y, die an anderer Stelle gebraucht wird. Allerdings könnte ich den Druck auch separat machen, zB mit aYKKstatt mit eaYK. In beiden Fällen sind es jedoch 4 Bytes.
Isaacg
3

Julia, 161 149 Bytes

n->(S(m)=!isempty(filter(i->i==unique(i)&&length(i)>1&&all(j->m%j<1,i),partitions(m)));for i=2:n S(i)&&!any(S,filter(k->i%k<1,1:i-1))&&println(i)end)

Dadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl als Eingabe akzeptiert und die Zahlen durch einen Zeilenumbruch getrennt an STDOUT ausgibt. Um es zu nennen, geben Sie ihm einen Namen, z f=n->....

Ungolfed + Erklärung:

# Define a function that determines whether the input is semiperfect
# (In the submission, this is defined as a named inline function within the
# primary function. I've separated it here for clarity.)

function S(m)
    # Get all integer arrays which sum to m
    p = partitions(m)

    # Filter the partitions to subsets of the divisors of m
    d = filter(i -> i == unique(i) && length(i) > 1 && all(j -> m % j == 0, i), p)

    # If d is nonempty, the input is semiperfect
    !isempty(d)
end

# The main function

function f(n)
    # Loop through all integers from 2 to n
    for i = 2:n
        # Determine whether i is semiperfect
        if S(i)
            # If no divisors of i are semiperfect, print i
            !any(S, filter(k -> i % k == 0, 1:i-1) && println(i)
        end
    end
end

Beispiele:

julia> f(5)

julia> f(40)
6
20
28
Alex A.
quelle
3

JavaScript ( ES6 ) 172

Führen Sie das folgende Snippet aus, um es zu testen

f=
v=>eval("for(n=h=[];n++<v;!t*i&&n>1?h[n]=1:0){for(r=[l=i=t=1];++i<n;)n%i||(h[i]?t=0:l=r.push(i));for(i=0;t&&++i<1<<l;)r.map(v=>i&(m+=m)?t-=v:0,t=n,m=.5)}''+Object.keys(h)")


// Less golfed

ff=v=>
{
   h=[]; // hashtable with numbers found so far

   for (n=1; n <= v; n++)
   {
      r=[1],l=1; // r is the list of divisors, l is the length of this list
      t=1; // used as a flag, will become 0 if a divisor is in h
      for(i=2; i<n; i++)
      {
         if (n%i == 0)
            if (h[i])
               t = 0; // found a divisor in h, n is not primitive
            else
               l = r.push(i); // add divisor to r and adjust l
      }
      if (t != 0) // this 'if' is merged with the for below in golfed code
      { 
         // try all the sums, use a bit mask to find combinations
         for(i = 1; t != 0 && i < 1<<l; i++)
         {
            t = n; // start with n and subtract, if ok result will be 0 
            m = 0.5; // start with mask 1/2 (nice that in Javascript we can mix int and floats)
            r.forEach( v=> i & (m+=m) ? t -= v : 0);
         }
         if (t == 0 && n > 1) h[n] = 1; // add n to the hashmap (the value can be anything)
      }
   }
   // the hashmap keys list is the result
   return '' + Object.keys(h) // convert to string, adding commas
}

(test=()=> O.textContent=f(+I.value))();
<input id=I type=number oninput="test()" value=999><pre id=O></pre>

edc65
quelle
@ JörgHülsermann fertig, danke fürs
mitbekommen
2

CJam, 54 Bytes

Diese Lösung fühlt sich etwas umständlich an, aber da es nur wenige Antworten und keine in CJam gibt, dachte ich, ich würde es trotzdem posten:

Lli),2>{_N,1>{N\%!},_@&!\_,2,m*\f{.*:+}N#)e&{N+}&}fNS*

Ein guter Teil des Zuwachses gegenüber der veröffentlichten Pyth-Lösung beruht auf der Tatsache, dass CJam meines Erachtens nicht über einen Operator verfügt, mit dem alle Teilmengen einer Menge aufgelistet werden können. Um dies mit den verfügbaren Operatoren abzuschließen, waren einige Arbeiten erforderlich. Natürlich, wenn es tatsächlich einen einfachen Operator gibt, den ich vermisst habe, werde ich irgendwie albern aussehen. :)

Erläuterung:

L     Start stack with empty list that will become list of solutions.
li    Get input N and convert to int.
),2>  Build list of candidate solutions [2 .. N].
{     Start for loop over all candidate solutions.
_     Copy list of previous solutions, needed later to check for candidate being primitive.
N,1>  Build list of possible divisors [1 .. N-1].
{N\%!},  Filter list to only contain actual divisors of N.
_     Check if one of divisors is a previous solution. Start by copying divisor list.
@     Pull copy of list with previous solutions to top of stack
&!    Intersect the two lists, and check the result for empty. Will be used later.
\     Swap top two elements, getting divisor list back to top.
_,    Get length of divisor list.
2,    Put [0 1] on top of stack.
m*    Cartesian power. Creates all 0/1 sequences with same length as divisor list.
\     Swap with divisor list.
f{.*:+}  Calculate element by element product of all 0/1 sequences with divisors,
         and sum up the values (i.e. dot products of 0/1 sequences with divisors).
         The result is an array with all possible divisor sums.
N#)  Find N in list of divisor sums, and covert to truth value.
e&   Logical and with earlier result from primitive test.
{N+}&  Add N to list of solutions if result is true.
}fN  Phew! We finally made it to the end of the for loop, and have a list of solutions.
S*   Join the list of solutions with spaces in between.

Probieren Sie es online aus

Reto Koradi
quelle
2

PHP, 263 Bytes

function m($a,$n){for($t=1,$b=2**count($a);--$b*$t;$t*=$r!=$n,$r=0)foreach($a as$k=>$v)$r+=($b>>$k&1)*$v;return$t;}for($o=[];$i++<$argn;m($d,$i)?:$o=array_merge($o,range($r[]=$i,3*$argn,$i)))for($d=[],$n=$i;--$n*!in_array($i,$o);)$i%$n?:$d[]=$n;echo join(",",$r);

Probieren Sie es online!

Erweitert

function m($a,$n){ 
  for($t=1,$b=2**count($a);--$b*$t;$t*=$r!=$n,$r=0) #loop through bitmasks
    foreach($a as$k=>$v)$r+=($b>>$k&1)*$v; # loop through divisor array
  return$t;} # returns false for semiperfect numbers 
for($o=[];$i++<$argn;
m($d,$i)?
  :$o=array_merge($o,range($r[]=$i,3*$argn,$i))) # Make the result array and the array of multiples of the result array 
  for($d=[],$n=$i;--$n*!in_array($i,$o);) # check if integer is not in multiples array
    $i%$n?:$d[]=$n; # make divisor array
echo join(",",$r); #Output
Jörg Hülsermann
quelle
1

Jelly , 22 Bytes

ÆDṖŒPS€i
ÆDÇ€TL’
RÇÐḟY

Probieren Sie es online!

Erläuterung

ÆDṖŒPS€i - helper function to check if input is a semiperfect number
ÆD       - list of divisors of input
  Ṗ      - except for the last one (the input)
   ŒP    - power set = every possible subset of divisors
     S€  - sum of each subset
       i - return truthy iff input is one of these

ÆDÇ€TL’ - helper function to check if input is a primitive semiperfect number
ÆD       - list of divisors of input
  ǀ     - replace each with if they are a semiperfect number, based on 
           the above helper function. If input is a primitive semiperfect 
           number, we get something like [0,0,0,0,0,94]. 
    T    - get all truthy values.
     L’  - return falsy iff there is only one truthy value

RÇÐḟY    - main link
R        - Range[input]
 ÇÐḟ     - Filter out those elements which are not primitive semiperfect
           numbers, based on the helper function
    Y    - join by newlines.
fireflame241
quelle