Prime veya en yüksek faktör


14

Meydan okuma:

Aralığında0 to Infinity negatif olmayan tam sayı sayıları dizisi verildiğinde , hepsinin asal olup olmadığını kontrol edin. (İsterseniz girdiyi dize olarak da alabilirsiniz)

Giriş:

Girdi: Bir sayı dizisi

Çıktı: Her öğenin yerine aşağıdakilerden birinin girdiği dizi:

-1                 -----> If 0, 1
1                  -----> If it is a prime number greater than 1
the highest factor -----> If that number is not prime

-1 (0, 1), 1 (asal sayılar> = 2) veya verilen sayının en yüksek faktörünü (asal sayılar için olmayan) döndürün

Örnekler:

[1, 2, 3, 4, 10, 11, 13]                        ---> [-1, 1, 1, 2, 5, 1, 1]
[100, 200, 231321, 12312, 0, 111381209, 123123] ---> [50, 100, 77107, 6156, -1, 1, 41041]

Not:

Girdi her zaman geçerli olacaktır, yani yalnızca sayı ve ondalık sayılardan oluşacaktır. Dizi boş olabilir, öyleyse boş diziyi döndürün.

Kısıtlama:

Bu her dil için bayt olarak en kısa kod kazanır.

Liderler Sıralaması :

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

# Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra skor tablosu snippet'inde görünecek bir bağlantı da yapabilirsiniz:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


2
Soruları göndermeden önce geri bildirimde bulunmak için gelecekteki sorular için Sandbox'ı kullanmanızı şiddetle tavsiye ederim
Jo King

@ Şaka: sonsuzluk için tüm sayıları sonsuza kadar çıkarmalısınız. Bu sadece sizin içindir ve zaman aşımına uğramadığından veya başka bir şey olmadığından emin olmanız gerekir. JK: zaman aşımı hatası, sonsuzluk için alacağınız en olası şeydir

4
"1'den büyük bir asal sayı ise" 1'den büyük olmasının gerçekten gerekli olmadığına dikkat etmek istedim çünkü asal sayılar her zaman 1'den büyük
Ivo Beckers

5
En yüksek faktörü tanımlayın. Numarayı kendim iade etmeli miyim? En yüksek bölünebilir prime? Kendisi olmayan en yüksek faktör?
Nissa

2
Programlarımızın yalnızca seçtiğimiz dilin maksimum tamsayı boyutuna kadar tamsayılar için çalışması gerekir (keyfi olarak büyük tamsayılar için destek vermeyenler için)
JDL

Yanıtlar:


9

Jöle ,  7 6 bayt

ÆḌṪ€o-

Negatif olmayan tamsayıların bir listesini kabul eden ve -1'den büyük veya ona eşit bir tamsayıların listesini tutan bir monadik bağlantı.

Çevrimiçi deneyin!

Nasıl?

Bunu not et:

  • Tüm asalların tek bir uygun böleni vardır (bir)
  • Tüm kompozitlerde birden fazla uygun bölme vardır (biri artı diğerleri)
  • Hiçbir numaranın kendisi uygun bir bölen olarak değildir
  • Jelly'in uygun bölücüler atomu, ÆḌartan düzende uygun bölücülerin bir listesini verir
  • Sıfırın ve birinin uygun bölenleri yoktur (bunlar ne birincil ne de kompozittir)
  • Jelly'in kuyruk atomunu boş bir listeye uygulamak sıfır verir
  • Hiçbir numaranın uygun bir böleni sıfır değildir (en fazla olanı olsun)
  • Sıfır olmayan tüm sayılar Jelly'de doğrudur, sıfır ise falseydir

ÆḌṪ€o- | Link: list of integers   e.g. [ 0, 1,  2,  5,     10,    5183]
ÆḌ     | proper divisors (vectorises)  [[],[],[1],[1],[1,2,5],[1,71,73]]
  Ṫ€   | tail €ach                     [ 0, 0,  1,  1,      5,      73]
     - | literal minus one
    o  | logical OR (vectorises)       [-1,-1,  1,  1,      5,      73]

8

Jöle , 9 8 bayt

@Dennis sayesinde 1 bayt kaydedildi

:ÆfṂ€$~~

Çevrimiçi deneyin! veya tüm test senaryolarını çalıştırın

Yorumlananlar

İkimiz de aslında yararlanmak nanve infolmak 0arasında ikilik kendilerine uygulanan DEĞİL zaman Jelly içinde.

:ÆfṂ€$~~ - main link, taking the input list
 ÆfṂ€$   - treat these two links as a monad:
 Æf      -   get the lists of prime factors (0 --> 0; 1 --> empty list; prime --> itself)
    €    -   for each list,
   Ṃ     -   isolate the minimum prime factor (turns empty lists into 0)
:        - divide each entry by its minimum prime factor (0/0 --> nan; 1/0 --> inf)
      ~~ - bitwise NOT x2 (nan or inf --> 0 --> -1; other entries are unchanged)

3
Bu sefer JavaScript kullanmadınız mı? güzel cevap btw

3
Gerçekten hoşuma gitti ~~. :ÆfṂ€$~~yardımcı bağlantıyı kaldırarak bir bayt kaydeder.
Dennis

@Dennis Ah! $aradığım şey bu. :) Teşekkürler!
Arnauld

7

R, 68 62 bayt

Map(function(n,v=rev(which(!n%%1:n)))"if"(n<2,-1,v[2]),scan())

Sadece R tabanını kullanan, kütüphanesiz çözüm! Giuseppe için 6 bayt uzakta golf için teşekkürler.

Hangi faktörlerin olduğunu belirlemek scaniçin boşlukla ayrılmış bir sayı listesinde okumak için kullanır %%. vdaha sonra artan sırada (1 ve n dahil) tüm faktörlerin bir vektörünü içerir. Bu ne zaman bu güzel özelliği reverse viçin, bizim istediğimiz sayı pahalı bir çağrıyı kaçınarak, ikinci sırada olacak lengthveya tail(eğer nasal oldu, viçerdiği n 1başka içerdiği n (factors in descending order) 1).

Örnek çıktı (TIO bağlantısı burada ):

> Map(function(n,v=rev(which(!n%%1:n)))"if"(n<2,-1,v[2]),scan())
1: 0 1 2 3 4 5 6 7 8 9
11: 
Read 10 items
[[1]]
[1] -1

[[2]]
[1] -1

[[3]]
[1] 1

[[4]]
[1] 1

[[5]]
[1] 2

[[6]]
[1] 1

[[7]]
[1] 3

[[8]]
[1] 1

[[9]]
[1] 4

[[10]]
[1] 3

Bir liste kabul edilebilir bir dönüş türü değil düşünüyorsanız, o dışarı takas Mapiçin sapplyve 3 bayt ekleyin.



nice - ile !
başlamayı

6

05AB1E , 11 9 8 bayt

Ñε¨àDd<+

-3 sayesinde bayt @Emigna değiştirme ©d1-®+için Dd<+ve €¨€àiçin ε¨à.

Sadece ikinci 05AB1E cevabım, bu yüzden kesinlikle golf edilebilir .

Çevrimiçi deneyin.

Açıklama:

Ñ           # Divisors of each item in the input-list (including itself)
            #  [1,2,10,3] → [[1],[1,2],[1,2,5,10],[1,2,3]]
 ε          # For each:
  ¨         #  Remove last item (so it's now excluding itself)
            #   [[1],[1,2],[1,2,5,10],[1,2,3]] → [[],[1],[1,2,5],[1,2]]
   à        #  And get the max
            #   [[],[1],[1,2,5],[1,2]] → ['',1,5,2]
    D       # Duplicate the list
     d      # Is it a number (1 if it's a number, 0 otherwise)
            #  ['',1,5,2] → [0,1,1,1]
      <     # Subtract 1
            #  [0,1,1,1] → [-1,0,0,0]
       +    # Add both lists together
            #  ['',1,5,2] and [-1,0,0,0] → ['-1',1,5,2]

1
Dd<+yerine çalışmalı ©d1-®+. ïHala ints oldukları için de ihtiyacınız yok . Gerçi güzel görünümlü çıktı için altbilgi olabilir.
Emigna

@Emigna Ah 1-yerine <.. için teşekkürler oldukça aptal Dyerine ©...®! Ve gerçekten de ïşimdi altbilgiye koydum .
Kevin Cruijssen

1
Ya da daha iyisi:Ñε¨àDd<+
Emigna

12 baytımdan çok daha iyi.
Sihirli Ahtapot Urn

5

J , 21 bayt

_1:`(%{.@q:)@.(>&1)"0

Çevrimiçi deneyin!

Açıklama:

(>&1)"0 her sayı 1'den büyük mü?

@. değilse, geri dön _1:

(%{.@q:)2 veya daha büyükse, %sayıyı {.asal faktörlerden ilkine bölünq:


4

Japt , 6 bayt

Golften sonra, Jonathan'ın çözümüyle neredeyse aynı ve en kısa sürede sonuçlandı.

®â¬ÌªJ

Dene


açıklama

®          :Map
 ⬠       :  Proper divisors
   Ì       :  Get last element (returns null if the array is empty)
    ª      :  Logical OR
     J     :  -1

Bir bayt ile -m
Oliver

3

Python 3 , 62 bayt

lambda l:[max([k for k in range(1,n)if n%k<1]+[-1])for n in l]

Çevrimiçi deneyin!

İçin 0ve 1 range(1,n)boş olduğundan, kod olarak değerlendirilir max([]+[-1]) = -1. Asal sayılar için, [1, n) 'deki tek bölen 1istenen çıktıdır.


Hindistan cevizi , 50 bayt

map$(n->max([k for k in range(1,n)if n%k<1]+[-1]))

Çevrimiçi deneyin!


3

Java 8, 105 103 87 bayt

a->{for(int i=a.length,n,x;i-->0;a[i]=n<2?-1:n/x)for(n=a[i],x=1;++x<n;)if(n%x<1)break;}

Baytları kaydetmek için yenisini döndürmek yerine girdi dizisini değiştirir.

Çevrimiçi deneyin.

Açıklama:

a->{                  // Method with integer-array parameter and no return-type
  for(int i=a.length,n,x;i-->0;
                      //  Loop backward over the array
      a[i]=           //    After every iteration: change the current item to:
           n<2?       //     If the current item is 0 or 1:
            -1        //      Change it to -1
           :          //     Else:
            n/x)      //      Change it to `n` divided by `x`
     for(n=a[i],      //   Set `n` to the current item
         x=1;++x<n;)  //   Inner loop `x` in range [2,`n`)
       if(n%x<1)      //    If `n` is divisible by `x`:
         break;}      //     Stop the inner loop (`x` is now the smallest prime-factor)
                      //   (if the loop finishes without hitting the `break`,
                      //    it means `n` is a prime, and `x` and `n` will be the same)

3

Haskell, 52 49 bayt

map(\x->last$[d|d<-[1..x-1],mod x d<1]++[-1|x<2])

Çevrimiçi deneyin!

map                     -- for each element in the input array
  \x->                  -- apply the lambda function
    last                -- pick the last element of the following list
     [d|d<-[1..x-1]     --  all d from 1 to x-1 
           ,mod x d<1]  --    where d divides x 
     ++[-1|x<2]         --  followed by -1 if x<2

3

Kabuk , 8 bayt

m(|_1→hḊ

Çevrimiçi deneyin!

açıklama

m(|_1→hḊ  Implicit Input         [1,2,3,4,10]
m(        Map each element
       Ḋ    List of divisors     [[1],[1,2],[1,3],[1,2,4],[1,2,5,10]]
     →h     Penultimate element  [0,1,1,2,5]
  |_1       If falsy then -1     [-1,1,1,2,5]

3

Ataşe , 23 bayt

@{Max&-1!Divisors@_@-2}

Çevrimiçi deneyin!

29 bayt, noktasız: @(Max&-1@Last@ProperDivisors)

24 bayt, ayrıca işaretsiz: @(Max&-1@`@&-2@Divisors)

Bu sadece ikinci-son bölen nalır ve o zaman maksimum alır ve -1. İkiden az elemanı olan bir dizideki ikinci-son öğe nil, ve Max[-1, nil]değeridir -1. @basitçe bu işlevi vektörleştirir, her bir atom için geçerli kılar.



2

R + numbers, 88 79 bayt

Esas olarak nasıl başvuru yapılacağı konusunda bazı tavsiyeler için yapılan yorumlara teşekkürler.

function(y)sapply(y,function(x)"if"(x<2,-1,prod(numbers::primeFactors(x)[-1])))

En küçük faktör dışındaki tüm asal faktörlerin çarpımını ve boş bir vektörün elemanlarının çarpımının tanımlandığı gerçeğini kullanır 1.

Çevrimiçi deneyin!


1
libraryçağrıyı atlamak ve numbers::primeFactorsdoğrudan kullanmak için bayt kaydeder .
JDL

1
JDL'nin ne önerdiğini görmek ve bunu anonim bir işleve değiştirmek için bir TIO bağlantısı .
Giuseppe

2

Brachylog , 10 bayt

{fkt|∧_1}ˢ

Çevrimiçi deneyin!

Aşağıdaki açıklama çoğunlukla kısalık adına zorunlu olarak ifade edilmiştir ve Brachylog'un beyan niteliğini doğru bir şekilde yansıtmamaktadır.

{          Start of inline predicate.
           Implicit input to the predicate.
 f         Create a list of all of the input's factors (including itself).
  k        Remove the last item of this list so that it no longer contains the original number.
   t       Take the last item of the list with the last item removed.
           Implicitly unify the output with the aforementioned last item.
    |      If that failed, because one of the lists was empty...
     ∧     discarding the input, (there's probably some obvious reason ∨ won't work here but I don't know what it is)
      _1   unify the output with -1 instead.
        }  End of the inline predicate.
         ˢ For every item of the input, unify it with the predicate's input and get a list of the corresponding outputs.

Ben Osmoz aracılığıyla gerçek Prolog bazı davranışlarını öğrenmek umuduyla kod golf ile biraz eğlenebilir böylece Brachylog öğrenmeye karar verdim ve tamamen emin nasıl olsa bile, ben şimdiye kadar gerçekten zevk alıyorum yürütme denetim karakterleri çalışır.


2
"Muhtemelen açık bir nedeni var ∨ burada işe yaramaz ama ne olduğunu bilmiyorum" -> (Sen unuttum sanırım) .∨yerine kullanabilirsiniz , ama aynı bayt sayısı. Bu arada PPCG'ye (ve daha da önemlisi Brachylog'a) hoş geldiniz! |∧.
Fatalize

Ah, elbette! Teşekkürler.
İlişkisiz String

Brachylog ile ilgili bu tür soruları Brachylog sohbet odasında
sorabilirsiniz

1

Stax , 14 13 bayt

ü±p╞Ö*«òτ♀╣â▀

Çalıştır ve hata ayıkla

Açıklama (ambalajsız):

m|fc%c{vsH1?}U? Full program, implicit input-parsing
m               Map
 |fc%c            Get factorisation and length of it (0 and 1 yield [])
      {     } ?   If length != 0:
       v            Decrement
           ?        If still != 0:
        sH            Last element of factorisation
           ?        Else:
          1           Push 1
              ?   Else:
             U      Push -1

Haritanın içindeki sahte kod:

f = factorisation(i)
l = length(f)
if l:
    if --l:
        return f[-1]
    else:
        return 1
else:
    return -1

1

Pyth, 12 bayt

me+_1f!%dTSt

Burada deneyin

açıklama

me+_1f!%dTSt
m            Q    For each number d in the (implicit) input...
          Std     ... get the range [1, ..., d - 1]...
     f!%dT        ... take the ones that are factors of d...
  +_1             ... prepend -1...
 e                ... and take the last.

1

J , 14 bayt

1(%0{q:,-)@>.]

Çevrimiçi deneyin!

Her n sayısı için bunun yerine maksimum (n, 1) değerini alın.
Reddedilen sayıyı asal faktörler listesine (1 için boş liste) ekleyin ve sayıyı listedeki ilk öğeye bölün.

Ayrıca 14 bayt

(%0{q:) ::_1"0

Çevrimiçi deneyin!

Her sayıyı asal faktörlerden ilkine bölün. 0, ile bir etki alanı hatası oluşturur q:ve boş bir listede 0'ıncı öğeyi ararız - bu da bir hatadır. Hatalı herhangi bir sayı için −1 değerini döndürün.


Çok güzel çözümler!
Galen Ivanov

1

Japt , 14 11 8 bayt

®/k v)ªÉ
®        // For each input number,
 /k v    // return the number divided by it's first prime factor,
     )ªÉ // or -1 if such a number doesn't exist (the previous result is NaN).

Çevrimiçi deneyin!

Shaggy sayesinde bu üç sinir bozucu baytı tıraş etti .


Asalleri filtrelemenize gerek yok - asal faktörleri kdöndürür - bu 8 bayt olur:N®/k v)ªÉ
Shaggy

@Shaggy Teşekkürler, docs bunu söylemediğinden sadece ana faktörleri döndürdüğünü bilmiyordum.
Nit

1
Oh, evet, unutmuşum. Bir süre bunun için bir PR sunmanın anlamı var; kısa bir süre içinde yapacak.
Shaggy

1

JavaScript (Node.js) , 61 55 bayt

@Shaggy sayesinde -6 bayt

_=>_.map(_=>eval('for(v=_/(d=_>>1);v!=~~v;v=_/--d);d'))

Çevrimiçi deneyin!


Açıklama:

_ =>                                     // input i.e : the original array
    _.map(                               // map over all elements of the array
        eval('                           // eval a string
            for(v=_/(d=_>>1);            // set v = _ / _ >> 1 and set that to d
                v!=~~v;                  // and keep going until v !== floor(v)
                        v=_/d--);        // to _ / d again (d was changed)
                    d'                   // return d
            ))                           // end eval and map and function

Bu hala eski kod bu güncelleme için değil.

ES5 dostu da:

 const primeOrNot = function(input) { // the function with argument input
      return input.map(function(value) { // returns the array after mapping over them
           d = Math.floor(value * 0.5); // multiply each element by 0.5 and floor it 
           for(let v = value / d; v != Math.floor(v);) { // for loop goes until v!=~~v
                d --; // subtract one from d
                v = value / d; // set v again to value / d
           }
           return d; // return d
      })
 };


@Shaggy: teşekkürler
Muhammad Salman

1

Bash + GNU yardımcı programları, 49

  • @Cowsquack sayesinde 9 bayt kaydedildi
factor|sed '/:$/c-1
/: \w+$/c1
s%: %/%
y/ /#/'|bc

açıklama

  • factor STDIN giriş satırlarını her satıra bir tane okur ve formatta çıktılar <input number>: <space-separated list of prime factors (ascending)>
  • sed bunu aşağıdaki gibi işler:
    • /:$/c-1 0 ve 1 numaralı girişlerin asal çarpanları yoktur ve bunların yerine -1
    • /: \w+$/c1Bir asal çarpanı olan sayılar (kendileri) asaldır. Bunları ile değiştirin1
    • s%: %/%Değiştir :ile /. Bu, (asal olmayan) girdi numarasını en büyük faktörü vermek için en küçük asal çarpanına bölmek için aritmetik bir ifade oluşturur
    • y/ /#/ Diğer (gereksiz) faktörlerin listesini kaldırın (yorum yaparak)
  • bc Aritmetik olarak değerlendirme ve görüntüleme

Çevrimiçi deneyin!


1
Sen düşmesi mümkün olabilir -rve ilk iki için s'işe yarar bir s /regex/cvaluedaha fazla tasarruf edebilirsiniz ayrıca bu düzenli ifade basitleştirilmesi, golf için bir byte ve yalnızca değiştirerek son iki regex en bir bayt kaydedebilirsiniz :ile /ve daha sonra istenmeyen kısmı yorumlayın, böyle, tio.run/##JYlBCoMwFET3c4qABhdSfuZ/…
user41805

@Cowsquack çok iyi - teşekkürler!
Dijital Travma





1

Befunge-98 (FBBI) , 39 bayt

j&:!+f0p1-1:::' -:!j;3k$.nbj;-\%!!j:1+a

Çevrimiçi deneyin!

Başka &sayı kalmadığında biter . Bu, TIO programı sonlandırana kadar programın 60 saniye durmasına neden olur. Bu, Befunge-98 için en azından TIO'da kaçınılmaz çünkü her iki tercüman da bunu yapıyor. Oyuna bastıktan sonra, dakika beklediyseniz ne çıkacağını görmek için programı biraz sonra durdurabilirsiniz.


Esasen, her yeni sayı için, eğer 0 ise, onu 1'e dönüştürür. Sonra yığına -1 ve ardından 1'den başlayan bir sayı koyar ve giriş numarasına ulaşana kadar sayılır, bu durumda destedeki ikinci sayıyı yazdırır (0 veya 1 girişi için -1 ve diğerleri için en yüksek faktör). Döngü boyunca her seferinde, yineleyicinin değerini if ​​( input % iterator == 0) ise arkasındaki yığına ekleriz . Bu, girdiye geldiğimizde, yineleyiciyi atmamız ve yazdırmamız gerektiği anlamına gelir. Ardından, yığını temizler nve okuma giriş işlevine döneriz.

Açıklamayı daha sonra genişletebilirim, göreceğiz ...


0

Retina 0.8.2 , 33 bayt

%(`^0|^1$
-1
\d+
$*
^(1+)\1+$
$.1

Çevrimiçi deneyin! Bağlantı, çok yavaş olmayan test senaryolarını içerir. Açıklama:

%(`

Her bir giriş numarasının üzerine gelin.

^0|^1$
-1

Özel durum 0 ve 1.

\d+
$*

Tekli'ye dönüştür (-1'i etkilemez).

^(1+)\1+$
$.1

Her sayıyı ondalık basamaktaki en büyük uygun faktörle değiştirin.


0

tinylisp , 75 bayt

(load library
(q((L)(map(q((N)(i(l N 2)(- 1)(/ N(min(prime-factors N))))))L

Çevrimiçi deneyin! (Adsız işleve altbilgide çağırabileceğimiz bir ad vermek için 4 ekstra bayt içerir.)

Ungolfed / açıklama

nnnn/ppn

(load library)               Library gives us map, -, /, min, and prime-factors functions

(lambda (L)                  Anonymous function, takes a list of numbers L
 (map                         Map
  (lambda (N)                  Anonymous function, takes a number N
   (if (less? N 2)              If N < 2
    (- 1)                        -1; else
    (/ N                         N divided by
     (min                        the minimum
      (prime-factors N)))))      of the prime factors of N
  L)))                        ... to L
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.