Asal faktörleri hesapla


27

Bir süre önce ana çarpanlara ayırma mücadelesi yaşadık , ancak bu meydan okuma neredeyse altı yaşında ve mevcut şartlarımızı zorlukla karşıladığı için yeni bir zamanın geldiğine inanıyorum.

Meydan okuma

1'den büyük bir tamsayı girdi olarak alan ve ana faktörlerin bir listesini veren ya da veren bir program ya da işlev yazın.

kurallar

  • Giriş ve çıkış, herhangi bir standart yöntemle ve herhangi bir standart biçimde verilebilir.
  • Yinelenen faktörler çıktıya dahil edilmelidir.
  • Çıktı herhangi bir sırada olabilir.
  • Giriş 2'den az veya 2 31 - 1'den fazla olmayacak .
  • Yerleşiklere izin verilir, ancak yerleşik olmayan bir çözümü içeren teşvik edilir.

Test durumları

2 -> 2
3 -> 3
4 -> 2, 2
6 -> 2, 3
8 -> 2, 2, 2
12 -> 2, 2, 3
255 -> 3, 5, 17
256 -> 2, 2, 2, 2, 2, 2, 2, 2
1001 -> 7, 11, 13
223092870 -> 2, 3, 5, 7, 11, 13, 17, 19, 23
2147483646 -> 2, 3, 3, 7, 11, 31, 151, 331
2147483647 -> 2147483647

puanlama

Bu , yani bayttaki en kısa kod kazanır.


2
Yerleşiklere izin vermemeniz çok daha iyi olurdu.
Tampon Aşırı Okuma

2
@TheBitByte Yerleşiklere izin vermeme konusundaki zorluklar, genellikle bir çözümün teknik olarak yerleşik olup olmadığını anlamak zor olduğundan, Y zorlukları olmadan Do X olarak görülüyor .
ETHProductions,

1
Öyleyse, <5 baytlık çözümlerin akışının tadını çıkarın! Bunu yazarken Pyth zaten 1 baytta yapıyor.
Tampon Aşırı Okuma

2
@TheBitByte Öncelikle, bir dil dili sorunu olarak düşünün. Python'un çözümünü ya da yerleşik olmayan başka bir dili yenmeyi deneyin.
isaacg

1
@isaacg Şey, dilin diline bakmak daha iyi bir yol, kabul ediyorum.
Tampon Aşırı Okuma

Yanıtlar:




10

Python 2, 53 bayt

f=lambda n,i=2:n/i*[f]and[f(n,i+1),[i]+f(n/i)][n%i<1]

Her potansiyel böleni isırayla dener . Eğer ibir bölen olduğunu, bunu ve yeniden başlatır prepends n/i. Başka, bir sonraki en yüksek böleni dener. Bölenler artan sırayla kontrol edildiğinden, yalnızca asal olanlar bulunur.

55 bayt için bir program olarak:

n=input();i=2
while~-n:
 if n%i:i+=1
 else:n/=i;print i

8

Mathematica, 38 30 bayt

8 byte için @ Martininder teşekkürler!

Join@@Table@@@FactorInteger@#&

Ne dersiniz FactorInteger[#][[All, 1]]&? 26 bayt
David G. Stork

DavidG.Stork @ o olmaz iş gücü 1'den büyük ise o ana faktörler tekrarlamak olmaz çünkü
Junghwan Min



4

JavaScript (ES6), 44 bayt

f=(n,x=2)=>n-1?n%x?f(n,x+1):[x,...f(n/x)]:[]

Sonuncusu da dahil olmak üzere her asal faktörden 2'ye kadar yinelemesi nedeniyle korkunç derecede verimsiz. Zaman karmaşıklığını 5 bayt pahasına önemli ölçüde azaltabilirsiniz:

f=(n,x=2)=>x*x>n?[n]:n%x?f(n,x+1):[x,...f(n/x,x)]


3

Aslında , 6 bayt

w`in`M

Çevrimiçi deneyin!

Açıklama:

w`in`M
w       factor into primes and exponents
 `in`M  repeat each prime # of times equal to exponent

Muhtemelen şimdi kullanabilirsin o, değil mi?
Oliver

@Oliver Evet, ancak genellikle eski cevapları yerleşiklerle güncellemiyorum.
Mego




2

sağır ses tonu , 3 bayt

Bu dil oldukça genç ve henüz büyük bir şeye hazır değil, ancak asal çarpanlara ayırma yapabilir:

A/D

Bu kullanıcı girişi için bekleyecek ve ardından ana faktörlerin listesini çıkartacaktır.


2

MATLAB, 6 bayt

Bunun bir açıklama gerektirmediğini düşünüyorum.

factor

1

Bash + coreutils, 19 bayt

factor|sed s/.*:.//

Çevrimiçi deneyin!


Boşlukta kullanılan çıktıda önemli değilse, bir bayt tıraş olabilir factor|sed s/.*://. Ayrıca factor|cut -d: -f2(veya factor|cut -d\ -f2geçerli çıktınıza uyması için) aynı bayt uzunluğudur, ancak daha hızlı çalışacak ve daha az bellek yükü kullanacaktır.
Caleb

OP'ye beyaz boşluğu soracağım. Ne yazık ki, factor|cut -d\ -f2-bir bayt daha uzun olan öncü alanı ortadan kaldırmam gerekiyor .
Dennis,

1

Toplu, 96 bayt

@set/an=%1,f=2,r=0
:l
@set/af+=!!r,r=n%%f
@if %r%==0 echo %f%&set/an/=f
@if %n% gtr 1 goto l


1

Altıgen , 58 bayt

Henüz golf yapmadı, ama @ Martininder zaten bu imha edebilmelidir olmalıdır

Boşluk ile boşluk bırakarak, boşlukla ayrılmış faktörleri yazdırır

golfed:

2}\..}$?i6;>(<...=.\'/})."@...>%<..'':\}$"!>~\{=\)=\}&<.\\

Laid-out:

     2 } \ . .
    } $ ? i 6 ;
   > ( < . . . =
  . \ ' / } ) . "
 @ . . . > % < . .
  ' ' : \ } $ " !
   > ~ \ { = \ )
    = \ } & < .
     \ \ . . .

Açıklama daha sonra gelecek.




1

C, 92 bayt

int p(int n){for(int i=2;i<n;i++)if(n%i==0)return printf("%d, ",i)+p(n/i);printf("%d\n",n);}

Ungolfed versiyonu:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int prime(int number) {
    for (int i = 2; i < number; i++) {
        if (number % i == 0) {
            printf("%d, ", i);
            return prime(number / i); //you can golf away a few bytes by returning the sum of your recursive function and the return of printf, which is an int
        }                             //this allow you to golf a few more bytes thanks to inline calls
    }
    printf("%d\n", number);
}

int main(int argc, char **argv) {
    prime(atoi(argv[1]));
}




0

Perl 6 , 77 64 bayt  

{my$a=$_;.is-prime??$_!!map ->\f{|({$a%f||($a/=f)&&f}...^*!= f)},(2... *>$a)}

Dene

{my$a=$_;map ->\f{|({$a%f||($a div=f)&&f}...^ f>*)},(2... *>$a)}

Deneyin (Not: bitirmek için ayrılan zamana sahip değil)


Çok daha performanslı bir sürüm 100 byte'ta biraz daha uzundur.

{my$a=$_;map ->\f{|({$a.is-prime??($/=$a)&&($a=0)||$/!!($a%f||($a div=f)&&f)}...^ f>*)},(2... *>$a)}

Dene


Genişletilmiş: (64 bayt versiyonu)

{
  my $a = $_;  # the input 「$_」 is read-only by default
  map
    -> \f {
      |(              # slip ( flattens into outer list )

        # generate sequence of 0 or more 「f」s
        {
          $a % f      # is it not evenly divisible

          ||          # if it is evenly divisible
          ($a div=f)  # divide it
          &&          # and
          f           # return 「f」
        }
        ...^   # keep doing that until
        f > *  # 「f」 is bigger
      )

    },

    # do that over the following list

    (2 ... * > $a) # generate a sequence from 2
                   # up to whatever the value of $a
                   # is at the time of the check
}

0

VB.NET, 86 bayt

Bu, bazı Project Euler programlarında oturuyordu. İyileştirmeler kısalığa göre kaldırıldı ve sonuç bu oldu. Doğal olarak, VB çok ayrıntılı, bu yüzden oldukça uzun. Önde gelen boşlukları saymıyorum. Atlanabilir, ancak onunla okumak daha kolaydır.

Bu bir tamsayı parametre olarak alır ve sonra ana faktörleri virgül ile yazdırır. Sonunda takip eden bir virgül var.

Sub A(a)
    For i=2To a ' VB re-evaluates a each time, so the /= at the end of the loop shortens this
        While a Mod i=0 ' this is a factor. We've grabbed primes before this, so this must be a prime factor
            Console.Write(i &",") ' output
            a/=i ' "mark" the prime as "used"
        End While
    Next
End Sub

0

Perl 6 , 51 bayt

Özyinelemeli bir çözüm:

sub f(\n,\d=2){n-1??n%d??f n,d+1!!(d,|f n/d,d)!!()}

0

Java (OpenJDK) , 259 bayt

import java.util.*;interface g{static void main(String[]z){int a=new Scanner(System.in).nextInt();int b=0;int[]l={};for(int i=2;i<=a;i++){for(;a%i<1;l[b-1]=i){l=Arrays.copyOf(l,b=l.length+1);a/=i;}}for(int i=0;i<b;i++)System.out.print(l[i]+(i<b-1?", ":""));}}

Çevrimiçi deneyin!


Bu gönderinin daha fazla nasıl golf oynayabileceğini görmek için bu öze bakın: gist.github.com/kritixilithos/fde37dc5a8ae54852aa134a6e70ea495 . Bir şey açıklamak gerekirse, :) 19 byte beni ping çekinmeyin
Kritixi Lithos

0

Ruby, 61 bayt

require'prime';->x{x.prime_division.flat_map{|x|[x[0]]*x[1]}}

Düşünebildiğim en kısa yerleşik sürüm.


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.