Yếu tố chính hoặc cao nhất


14

Thử thách:

Cho một dãy các số nguyên không âm trong phạm vi0 to Infinity , Kiểm tra xem tất cả chúng có phải là số nguyên tố hay không. (Bạn cũng có thể lấy đầu vào dưới dạng chuỗi nếu muốn)

Đầu vào:

Đầu vào: Mảng số

Đầu ra: Mảng với mọi phần tử được thay thế bởi một trong những điều sau:

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

Trả về -1 (0, 1), 1 (cho số nguyên tố> = 2) hoặc hệ số cao nhất của số đã cho (đối với số không phải số nguyên tố)

Ví dụ:

[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]

Ghi chú:

Đầu vào sẽ luôn có giá trị, tức là nó sẽ chỉ bao gồm các số và số thập phân không được kiểm tra. Mảng có thể trống, nếu vậy, trả về mảng trống.

Sự hạn chế:

Đây là để mã ngắn nhất tính theo byte cho mỗi ngôn ngữ sẽ thắng.

Nhà lãnh đạo:

Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:

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

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


2
Tôi đặc biệt khuyên bạn nên sử dụng Hộp cát cho các câu hỏi trong tương lai, để cung cấp phản hồi về các câu hỏi trước khi đăng chúng
Jo King

@Joking: đối với vô cực, bạn phải xuất tất cả các số lên đến vô hạn. Điều này chỉ dành cho bạn và bạn cũng phải đảm bảo rằng nó không hết thời gian hoặc bất cứ điều gì. JK: lỗi hết thời gian là điều rất có thể bạn sẽ nhận được cho vô hạn

4
chỉ muốn lưu ý rằng trong "Nếu đó là số nguyên tố lớn hơn 1" thì lớn hơn 1 thực sự không cần thiết vì số nguyên tố luôn lớn hơn 1
Ivo Beckers

5
Xác định yếu tố cao nhất. Tôi có nên trả lại số đó không? Số nguyên tố chia hết cao nhất? Yếu tố cao nhất không phải là chính nó?
Nissa

2
Tôi cho rằng các chương trình của chúng tôi chỉ được yêu cầu để hoạt động cho các số nguyên với kích thước số nguyên tối đa của ngôn ngữ mà chúng tôi đã chọn (đối với các số nguyên không hỗ trợ cho các số nguyên lớn tùy ý)
JDL

Câu trả lời:


9

Thạch ,  7 6 byte

ÆḌṪ€o-

Liên kết đơn âm chấp nhận danh sách các số nguyên không âm và giữ lại danh sách các số nguyên lớn hơn hoặc bằng -1.

Hãy thử trực tuyến!

Làm sao?

Lưu ý rằng:

  • Tất cả các số nguyên tố đều có một ước số đúng (một)
  • Tất cả các vật liệu tổng hợp có nhiều ước số thích hợp (một cộng với các số khác)
  • Không có số nào là số chia đúng
  • Nguyên tử chia đúng của Jelly ÆḌ, tạo ra một danh sách các ước số thích hợp theo thứ tự tăng dần
  • Không và một không có ước số thích hợp (chúng không phải là số nguyên tố, cũng không phải là tổng hợp)
  • Áp dụng nguyên tử đuôi của Jelly , vào một danh sách trống sẽ mang lại số không
  • Không có số nào có ước số đúng bằng 0 (huống chi là số cực đại)
  • Tất cả các số khác không là số thật trong Jelly, trong khi số 0 là falsey

ÆḌṪ€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

Thạch , 9 8 byte

Đã lưu 1 byte nhờ @Dennis

:ÆfṂ€$~~

Hãy thử trực tuyến! hoặc chạy tất cả các trường hợp thử nghiệm

Đã bình luận

Chúng tôi tận dụng thực tế là cả hai naninftrở thành 0Jelly khi một chút KHÔNG được áp dụng cho chúng.

:Æ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
Bạn đã không sử dụng JavaScript lần này? câu trả lời hay btw

3
Tôi thực sự thích ~~. :ÆfṂ€$~~lưu một byte bằng cách loại bỏ liên kết của trình trợ giúp.
Dennis

@Dennis Ah! $là những gì tôi đang tìm kiếm. :) Cảm ơn!
Arnauld

7

R, 68 62 byte

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

Một giải pháp chỉ sử dụng cơ sở R, không có thư viện! Cảm ơn Giuseppe vì đã chơi golf 6 byte.

Sử dụng scanđể đọc trong một danh sách các số được phân tách bằng dấu cách, %%để xác định đó là các yếu tố. vsau đó chứa một vectơ của tất cả các yếu tố theo thứ tự tăng dần (bao gồm 1 và n). Điều này có một tài sản tuyệt vời mà khi chúng tôi revxóa v, số chúng tôi muốn sẽ ở vị trí thứ hai, tránh một cuộc gọi đắt tiền lengthhoặc tail(nếu nlà số nguyên tố, vcó chứa n 1, nếu không nó chứa n (factors in descending order) 1).

Ví dụ đầu ra (liên kết TIO tại đây ):

> 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

Nếu bạn nghĩ rằng một danh sách không phải là một kiểu trả về có thể chấp nhận, sau đó trao đổi trên Mapcho sapplyvà thêm 3 byte.



tốt đẹp - không nghĩ sẽ khởi tạo với!
JDL

6

05AB1E , 11 9 8 byte

Ñε¨àDd<+

-3 byte nhờ @Emigna , thay đổi ©d1-®+thành Dd<+€¨€àthành ε¨à.

Chỉ có câu trả lời 05AB1E thứ hai của tôi, vì vậy chắc chắn có thể được đánh gôn .

Hãy thử trực tuyến.

Giải trình:

Ñ           # 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<+Nên làm việc thay ©d1-®+. Bạn cũng không cần ïvì họ vẫn là ints. Bạn có thể có nó trong phần chân trang cho đầu ra đẹp hơn mặc dù.
Emigna

@Emigna Ah, 1-thay vì <khá ngu ngốc .. Cảm ơn vì sự Dthay vì ©...®! Và tôi thực sự đã đặt ïchân vào bây giờ.
Kevin Cruijssen

1
Hoặc thậm chí tốt hơn:Ñε¨àDd<+
Emigna

Tốt hơn nhiều so với 12 -ter của tôi.
Bạch tuộc ma thuật Urn

5

J , 21 byte

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

Hãy thử trực tuyến!

Giải trình:

(>&1)"0 là mỗi số lớn hơn 1?

@. nếu không, trở về _1:

(%{.@q:)nếu 2 hoặc lớn hơn, chia %số cho số đầu tiên {.của các thừa số nguyên tốq:


4

Japt , 6 byte

Sau khi chơi golf, cuối cùng, nó gần giống với giải pháp của Jonathan.

®â¬ÌªJ

Thử nó


Giải trình

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

Lưu một byte với-m
Oliver


3

Java 8, 105 103 87 byte

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;}

Sửa đổi mảng đầu vào thay vì trả về một mảng mới để lưu byte.

Hãy thử trực tuyến.

Giải trình:

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 byte

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

Hãy thử trực tuyến!

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

Husk , 8 byte

m(|_1→hḊ

Hãy thử trực tuyến!

Giải trình

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

Tùy viên , 23 byte

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

Hãy thử trực tuyến!

29 byte, không có điểm: @(Max&-1@Last@ProperDivisors)

24 byte, cũng không có điểm: @(Max&-1@`@&-2@Divisors)

Điều này chỉ đơn giản là ước số thứ hai đến cuối cùng nsau đó lấy tối đa của nó và -1. Yếu tố thứ hai-to-cuối cùng trong một mảng có ít hơn hai yếu tố là nil, và Max[-1, nil]-1. @chỉ đơn giản là vector hóa chức năng này, làm cho nó áp dụng cho mỗi nguyên tử.



2

R + numbers, 88 79 byte

Nhờ các ý kiến ​​cho một số lời khuyên chủ yếu về cách làm bài nộp.

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

Sử dụng tích của tất cả các thừa số nguyên tố trừ yếu tố nhỏ nhất và thực tế là tích của các phần tử của một vectơ trống được định nghĩa là 1 .

Hãy thử trực tuyến!


1
lưu byte để bỏ qua librarycuộc gọi và sử dụng numbers::primeFactorstrực tiếp.
JDL

1
đây là một liên kết TIO để xem JDL đang gợi ý điều gì, cũng như hoán đổi điều này với một chức năng ẩn danh.
Giuseppe

2

Brachylog , 10 byte

{fkt|∧_1}ˢ

Hãy thử trực tuyến!

Giải thích sau đây chủ yếu là phrased vì lợi ích của sự ngắn gọn và không phản ánh chính xác bản chất khai báo của Brachylog.

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

Tôi quyết định tôi học Brachylog để tôi có thể vui chơi với môn đánh gôn trong khi hy vọng tìm hiểu một số hành vi của Prolog thực tế thông qua thẩm thấu, và tôi thực sự thích nó cho đến nay, ngay cả khi tôi không hoàn toàn chắc chắn về cách nhân vật điều khiển thực thi làm việc.


2
"Có thể có một số lý do rõ ràng" sẽ không hoạt động ở đây nhưng tôi không biết đó là gì " -> Bạn có thể sử dụng .∨thay vì |∧(tôi đoán là bạn đã quên .), nhưng đó là cùng một số byte. Chào mừng bạn đến với PPCG (và Brachylog quan trọng hơn: p) bằng cách này!
Gây tử vong vào

À, tất nhiên rồi! Cảm ơn.
Chuỗi không liên quan

Bạn có thể hỏi những loại câu hỏi này trên Brachylog trong phòng trò chuyện Brachylog
Fatalize 20/2/19

1

Stax , 14 13 byte

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

Chạy và gỡ lỗi nó

Giải thích (giải nén):

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

Mã giả bên trong bản đồ:

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

1

Bình thường, 12 byte

me+_1f!%dTSt

Hãy thử nó ở đây

Giải trình

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 byte

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

Hãy thử trực tuyến!

Thay vào đó, với mọi số n, hãy lấy tối đa (n, 1).
Nối số phủ định vào danh sách các thừa số nguyên tố của nó (danh sách trống cho 1) và chia số cho mục đầu tiên trong danh sách.

Cũng 14 byte

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

Hãy thử trực tuyến!

Chia mỗi số cho các yếu tố đầu tiên của nó. 0 làm tăng lỗi tên miền q:và chúng tôi tìm kiếm mục thứ 0 trong danh sách trống cho 1 - đó cũng là một lỗi. Đối với bất kỳ số nào có lỗi, trả về −1.


Giải pháp rất hay!
Galen Ivanov

1

Japt , 14 11 8 byte

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

Hãy thử trực tuyến!

Cạo sạch ba byte phiền phức đó nhờ Shaggy .


Bạn không cần phải lọc các số nguyên tố - ktrả về các thừa số nguyên tố của N- vì vậy, điều này trở thành 8 byte:®/k v)ªÉ
Shaggy

@Shaggy Cảm ơn, không biết nó chỉ trả về các thừa số nguyên tố vì các tài liệu phương thức không nói như vậy.
Nit

1
Ồ, vâng, quên điều đó. Có ý nghĩa để gửi một PR cho điều đó trong một thời gian; sẽ làm như vậy trong thời gian ngắn.
Xù xì

1

JavaScript (Node.js) , 61 55 byte

-6 byte nhờ @shaggy

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

Hãy thử trực tuyến!


Giải trình :

_ =>                                     // 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

Đây vẫn là mã cũ chưa được cập nhật này.

ES5 cũng thân thiện:

 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: cảm ơn
Muhammad Salman

1

Tiện ích Bash + GNU, 49

  • 9 byte được lưu nhờ @Cowsquack
factor|sed '/:$/c-1
/: \w+$/c1
s%: %/%
y/ /#/'|bc

Giải trình

  • factor đọc các số đầu vào từ STDIN, một số trên mỗi dòng và đầu ra ở định dạng <input number>: <space-separated list of prime factors (ascending)>
  • sed xử lý việc này như sau:
    • /:$/c-1 Các số đầu vào 0 và 1 không có thừa số nguyên tố và được thay thế bằng -1
    • /: \w+$/c1Các số có một thừa số nguyên tố (bản thân) là số nguyên tố. Thay thế chúng bằng1
    • s%: %/%Thay thế :bằng/ . Điều này xây dựng một biểu thức số học để chia số đầu vào (không phải số nguyên tố) cho thừa số nguyên tố nhỏ nhất của nó để đưa ra hệ số lớn nhất
    • y/ /#/ Xóa danh sách các yếu tố khác (không cần thiết) (bằng cách nhận xét)
  • bc Đánh giá và hiển thị một cách hợp lý

Hãy thử trực tuyến!


1
Bạn có thể bỏ -rvà trong hai sgiây đầu tiên bạn có thể sử dụng /regex/cvalueđể đánh gôn một byte, đơn giản hóa biểu thức này hơn nữa có thể tiết kiệm nhiều hơn và bạn có thể lưu một byte trong hai biểu thức chính cuối bằng cách chỉ thay thế :bằng /và sau đó bình luận về phần không mong muốn, như vậy, tio.run/##JYlBCoMwFET3c4qABhdSfuZ/ Kẻ
Kritixi Lithos

@Cowsquack rất tốt - cảm ơn!
Chấn thương kỹ thuật số





1

Befunge-98 (FBBI) , 39 byte

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

Hãy thử trực tuyến!

Kết thúc với &khi không còn số. Điều này khiến chương trình bị đình trệ trong 60 giây cho đến khi TIO kết thúc chương trình. Điều này là không thể tránh khỏi đối với Befunge-98, ít nhất là trên TIO vì cả hai phiên dịch viên đều làm điều này. Sau khi nhấn play, bạn có thể dừng chương trình sau một lát để xem đầu ra sẽ là gì nếu bạn chờ trong phút.


Về cơ bản, với mỗi số mới, nếu là 0, nó biến nó thành số 1. Sau đó, nó đặt -1 vào ngăn xếp theo sau là một số bắt đầu từ 1 và đếm lên cho đến khi đạt đến số đầu vào, trong trường hợp đó in ra số thứ hai trên ngăn xếp (-1 cho đầu vào 0 hoặc 1 và hệ số cao nhất cho các số khác). Mỗi lần qua vòng lặp, chúng ta thêm giá trị của trình vòng lặp vào ngăn xếp phía sau nó nếu (input % iterator == 0 ). Điều này có nghĩa là khi chúng ta nhận được đầu vào, chúng ta chỉ cần vứt bỏ trình lặp và in. Sau đó, chúng tôi xóa ngăn xếp vớin và trở về chức năng đọc đầu vào.

Tôi có thể mở rộng giải thích sau, chúng ta sẽ thấy ...


0

Võng mạc 0.8.2 , 33 byte

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

Hãy thử trực tuyến! Liên kết bao gồm những trường hợp thử nghiệm không quá chậm. Giải trình:

%(`

Lặp lại trên mỗi số đầu vào.

^0|^1$
-1

Trường hợp đặc biệt 0 và 1.

\d+
$*

Chuyển đổi sang unary (không ảnh hưởng đến -1).

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

Thay thế mỗi số bằng hệ số thích hợp lớn nhất của nó trong số thập phân.


0

tinylisp , 75 byte

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

Hãy thử trực tuyến! (Chứa thêm 4 byte để đặt tên hàm ẩn danh để chúng ta có thể gọi nó trong phần chân trang.)

Ungolfed / giải thích

Quan sát rằng trả về 1 cho số nguyên tố n và yếu tố lớn nhất ít hơn n cho hỗn hợp n có thể kết hợp trở lại n/p Ở đâu p là yếu tố chính nhỏ nhất của n.

(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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.