Asalı ana güçten kurtarın


13

Tanım : asal güç , p'nin asal ve n doğal sayı olduğu p n şeklinde ifade edilebilen doğal bir sayıdır.

Görev : asal bir güç p n > 1 verildiğinde, asal p'yi geri gönderin.

Testcases :

input output
9     3
16    2
343   7
2687  2687
59049 3

Puanlama : Bu . Bayt cinsinden en kısa cevap kazanır.


1
Can n1 olmak?
user202729

@ user202729: 4. test durumunda n = 1.
Emigna

15
Belki de ana kısım yerine güç kısmını almak daha zor olurdu . Olduğu gibi, bu sadece "1 olmayan en düşük faktörü alın"
Jo King

Yanıtlar:




7

Java 8, 46 39 37 bayt

n->{int r=1;for(;n%++r>0;);return r;}

@Tsathoggua sayesinde dolaylı olarak -7 bayt . JoKing
sayesinde -2 bayt

Çevrimiçi deneyin.

Açıklama:

n->{               // Method with integer as both parameter and return-type
  int r=1;         //  Start the result-integer `r` at 1
  for(;n%++r>0;);  //  Increase `r` by 1 before every iteration with `++r`
                   //  and loop until `n` is divisible by `r`
  return r;}       //  After the loop, return `r` as result

Aşağıdaki python3 Luis Mendo cevabı , yazmak mümkün olacağını n->{for(int i=1;++i<=n;)if(n%i<1)return i;}43 karakter alınır? (Java bilmiyorum.)
Tsathoggua

@Tsathoggua Şu anda sahip olduğunuz gibi, Java yöntemlerinin her zaman bir dönüşü olması gerektiğinden. n->{for(int i=1;++i<=n;)if(n%i<1)return i;return n;}ama maalesef daha uzundur. Bununla birlikte, Java sonsuz döngülerde tek bir dönüşe sahip olabilir, bu da gerçekten bayt tasarrufu sağlar, bu yüzden teşekkürler! n->{for(int i=1;;)if(n%++i<1)return i;}. Yana iolacak n(test durumu olduğu gibi nihayetinde 2687) ve n%n==0, i<=nbu durumda gerekli değildir.
Kevin Cruijssen

1
37 bayta ne dersiniz ? Daha fazla golf oynayabileceğini görmek için Java'ya yeterince aşina değilim
Jo King

@ Golf Daha fazla golf için bir şey görmüyorum, bu yüzden -2 için teşekkürler.
Kevin Cruijssen

5

Python 3 , 36 35 bayt

Mathmandan sayesinde -1 bayt

f=lambda n,x=2:n%x and f(n,x+1)or x

Çevrimiçi deneyin!

1'den büyük ilk faktörü bulur özyinelemeli işlev


1
Güzel. Değiştirmek eğer (genellikle) bir bayt kaydedebilirsiniz if/elseile and/or. Gibi f=lambda n,x=2:n%x and f(n,x+1)or x.
mathmandan


4

Boşluk , 80 61 60 bayt

[S S T  T   N
_Push_-1][S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_number][N
S S N
_Create_Label_LOOP][S S S T N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][S S S N
_Push_0][T  T   T   _Retrieve][S N
T   _Swap][T    S T T   _Modulo][N
T   T   N
_If_0_Jump_to_Label_LOOP][S S T T   N
_Push_-1][T S S N
_Multiply][T    N
S T _Print_as_number]

@JoKing sayesinde -20 bayt .

Harfler S(boşluk), T(sekme) ve N(yeni satır) yalnızca vurgulama olarak eklendi.
[..._some_action]yalnızca açıklama olarak eklendi.

Çevrimiçi deneyin (yalnızca ham alanlar, sekmeler ve yeni satırlarla).

Sahte kodda açıklama:

Integer n = STDIN as integer
Integer i = -1
Start LOOP:
  i = i - 1
  if(n modulo-i is negative)
    Go to next iteration of LOOP
  else
    i = i * -1
    Print i
    Exit with error: No exit defined

Örnek çalışma: input = 9

Command   Explanation                    Stack        Heap     STDIN    STDOUT    STDERR

SSTTN     Push -1                        [-1]
SSSN      Push 0                         [-1,0]
TNTT      Read STDIN as integer          [-1]         {0:9}    9
NSSN      Create Label_LOOP              [-1]         {0:9}
 SSSTN    Push 1                         [-1,1]       {0:9}
 TSST     Subtract top two (-1-1)        [-2]         {0:9}
 SNS      Duplicate top (-2)             [-2,-2]      {0:9}
 SSSN     Push 0                         [-2,-2,0]    {0:9}
 TTT      Retrieve                       [-2,-2,9]    {0:9}
 SNT      Swap top two                   [-2,9,-2]    {0:9}
 TSTT     Modulo top two (9%-2)          [-2,-1]      {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-2]         {0:9}

 SSTTN    Push -1                        [-2,-1]      {0:9}
 TSST     Subtract top two (-2-1)        [-3]         {0:9}
 SNS      Duplicate top (-2)             [-3,-3]      {0:9}
 SSSN     Push 0                         [-3,-3,0]    {0:9}
 TTT      Retrieve                       [-3,-3,9]    {0:9}
 SNT      Swap top two                   [-3,9,-3]    {0:9}
 TSTT     Modulo top two (9%-3)          [-3,0]       {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-3]         {0:9}
 SSTTN    Push -1                        [-3,-1]      {0:9}
 TSSN     Multiply top two (-3*-1)       [3]          {0:9}
 TNST     Print as integer               []           {0:9}             3
                                                                                  error

Program bir hatayla duruyor: Çıkış bulunamadı.


1
Çeke ihtiyacınız var i == nmı? n%nYine de 0 olur
Jo King

@JoKing Ah, elbette. Teşekkürler, 19 bayt orada saklandı. :)
Kevin Cruijssen

Sadece değilse döngü yapabilir n%ive daha sonra baskıyı arayabilir misiniz?
Jo King

1
@JoKing Emin değilim. Whitespace'te gerçekten döngüler yoktur, sadece etiketlere atlar. Sahip olduğum tek üç seçenek: 1. koşulsuz olarak belirli bir etikete atlamak; 2. destenin üstü 0 ise belirli bir etikete atlayın; 3. yığının üstü negatifse belirli bir etikete atlayın. Maalesef döngüye devam etmek için "olumluysa etikete atla" yoktur. Negatif olup olmadığını kontrol etmeden önce -1 ile çarparak bunu başarabilirdim, ama bunun daha kısa olacağından şüpheliyim.
Kevin Cruijssen

1
Negatif bir modülle yapmaya çalıştım ve <s> 62 </s> 60 bayt (yay) ile sonuçlandı . Negatif yığın adreslerinde depolayamayacağınız ortaya çıkıyor (0, birkaç bayt kurtardı)
Jo King






2

İleri (gforth) , 34 bayt

: f 1 begin 1+ 2dup mod 0= until ;

Çevrimiçi deneyin!

açıklama

  1. 2'den başlayarak yineleme tam sayıları
  2. N'yi geriye kalanla bölen birini bulduğunuzda durun ve geri dönün

Kod Açıklaması

: f               \ Define a new word
  1               \ place a 1 on the stack (to use as a counter/index)
  begin           \ start indefinite loop
    1+ 2dup       \ increment counter and duplicate counter and prime power
    mod           \ calculate power % index
  0= until        \ end the loop if modulus is 0 (no remainder)
;                 \ end word definition




1

Neim , 1 bayt

𝐔

Çevrimiçi deneyin!


U + 1D414 bir karakterdir, ancak UTF-8 ve UTF-16'da bu 4 bayt ile temsil edilir.
Ruud Helderman

1
@RuudHelderman Doğru, ancak bu UTF-8 veya UTF-16'da değil.
Okx

1
@RuudHelderman Neim kod sayfasını görmek isteyebilirsiniz .
JungHwan Min

@JungHwanMin Teşekkürler; Okx'un önceki Neim başvurularına göz atarken, biraz cahil tepkimin ilk olmadığını fark ettim. Akıllı özellik, ancak açık olmaktan uzak; açıklamayı garanti eder ( burada yapılanlar gibi ). Kod-golf etiketi bilgisi alıntılanıyor : "Soru karakterler tarafından puanlanacağı belirtilmezse, bayt tarafından puanlanır. Puanlama için kullanılacak bir karakter kodlaması belirtmezse, 0 ila 255 dışında Unicode kod noktaları kullanan cevaplar kullanılan kodlamayı belirtir. "
Ruud Helderman

@RuudHelderman meta konsensüs başına , eğer bir cevap bir kodlama belirtmezse, varsayılan olarak dilin varsayılan kodlamasını kullanır. Bu yoksa, o zaman UTF-8'dir. Bu durumda, Neim'in tanımlı bir varsayılan kodlaması vardır, bu nedenle cevaplayıcının bu şekilde açıklamasına gerek kalmadan cevabın kodlaması olduğu varsayılır.
JungHwan Min






0

PowerShell , 31 bayt

param($a)(2..$a|?{!($a%$_)})[0]

Çevrimiçi deneyin!

Girdiden 2girdiye bir aralık oluşturur, $abu öğeleri çıkarır where( ?) modulo işlemi %sıfırla sonuçlanır !(...)(yani, bölenleri $a) ve sonra [0]bunların en küçüğünü alır . Bu boru hattında kaldı, çıktı örtük.


0

Perl 6 , 22 bayt

{grep($_%%*,2..$_)[0]}

Çevrimiçi deneyin!

2 aralığının etkenlerini girdiye filtreleyen ve ilki döndüren anonim kod bloğu. ^$2 bayt kaydetmek için kullanmayı denedim , ancak girişin asal olması durumunda işe yaramadı.


0

Visual Basic .NET (.NET Framework v4.5), 123 71 bayt

@Jo King sayesinde -52 bayt

Function A(n)
For i=n To 2 Step-1
A=If(n Mod i=0,i,A)
Next
End Function

Çevrimiçi deneyin!

Ungolfed:

Function A(input As Long) As Long
    For i = input To 2 Step -1
        A = If (input Mod i = 0, i, A)
    Next
End Function

Açıklama:

iDöngü arama birinci sayıdan geriye doğru ve eşit bir şekilde bölmek tüm numaraları bulur. Geriye gittiğimiz için, en küçüğü vairable'da saklanır A.

VB size işlev adınızla eşleşen ücretsiz bir değişken verir (benim durumumda A). İşlev yürütmesinin sonunda, bu değişken içindeki değer döndürülür (açık bir Returnifade engellenir) .


1
Başbakan kontrolüne hiç ihtiyacınız yok. Bir sayının en küçük faktörünün (1 dışında) asal olduğu garanti edilir, aksi takdirde daha küçük bir faktör olacaktır
Jo King

@JoKing D'oh! Tabii ki, bunu özlediğime inanamıyorum. Teşekkürler!
Brian J






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.