Danh sách cân bằng Mod


14

Giới thiệu

Giả sử tôi có một danh sách các số nguyên, giả sử L = [-1,2,2,1,2,7,1,4] . Tôi thích có sự cân bằng trong cuộc sống của mình, vì vậy tôi rất vui khi thấy nó có nhiều yếu tố kỳ lạ như các yếu tố chẵn. Hơn nữa, nó cũng có số lượng phần tử bằng nhau trong tất cả các lớp modulo là 3 mà nó có các phần tử trong:

         [-1,2,2,1,2,7,1,4]
0 mod 3:
1 mod 3:         1   7 1 4
2 mod 3:  -1 2 2   2

Đáng buồn thay, đối với các lớp modulo của 4 điều này không còn giữ được nữa. Nói chung, chúng tôi nói rằng một danh sách không trống là modulo N cân bằng nếu nó có số phần tử bằng nhau trong tất cả các lớp modulo của N mà số này không bằng 0. Danh sách trên L được cân bằng modulo 2 và 3, nhưng modulo không cân bằng 4.

Nhiệm vụ

Đầu vào của bạn là một danh sách không trống L gồm các số nguyên được lấy ở bất kỳ định dạng hợp lý nào. Đầu ra của bạn là danh sách các số nguyên N 2 sao cho L được cân bằng modulo N , một lần nữa ở bất kỳ định dạng hợp lý nào. Thứ tự của đầu ra không quan trọng, nhưng nó không nên chứa các bản sao.

Nó được đảm bảo rằng chỉ có nhiều số chính xác trong đầu ra, điều đó có nghĩa chính xác là không phải tất cả các phần tử của L xảy ra một số lần bằng nhau trong đó. Ví dụ về các đầu vào không hợp lệ là [3] , [1,2][0,4,4,0,3,3] . Lưu ý rằng số lớn nhất trong đầu ra tối đa là tối đa (L) - min (L) .

Số byte thấp nhất trong mỗi ngôn ngữ sẽ thắng và áp dụng quy tắc tiêu chuẩn .

Các trường hợp thử nghiệm

[1,1,2] -> []
[1,1,5] -> [2,4]
[1,1,24] -> [23]
[1,2,3,2] -> [2]
[12,12,-4,20] -> [2,3,4,6,8,12,24]
[1,1,12,12,-3,7] -> [3,10]
[-1,2,2,1,2,7,1,4] -> [2,3]
[4,-17,-14,-18,-18,3,5,8] -> []
[-18,0,-6,20,-13,-13,-19,13] -> [2,4,19]
[-11,-19,-19,3,10,-17,13,7,-5,16,-20,20] -> []
[3,0,1,5,3,-6,-16,-20,10,-6,-11,11] -> [2,4]
[-18,-20,14,13,12,-3,14,6,7,-19,17,19] -> [2,3]
[-16,-9,6,13,0,-17,-5,1,-12,-4,-16,-4] -> [3,9]
[-97,-144,3,53,73,23,37,81,-104,41,-125,70,0,111,-88,-2,25,-112,54,-76,136,-39,-138,22,56,-137,-40,41,-141,-126] -> [2,3,6]

Một số ngôn ngữ tự động tính toán giới hạn trên (có lẽ là Brachylog?) Sẽ có lợi thế ...
user202729

Câu trả lời:


4

05AB1E , 11 byte

ÄOL¦ʒ%{γ€gË

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

ÄOL¦ʒ%{γ€gË  | Full program.

Ä            | Absolute value (element-wise).
 O           | Sum.
  L          | 1-based inclusive range.
   ¦         | Remove the first element (generates the range [2 ... ^^]).
    ʒ        | Filter / Select.
     %       | Modulo of the input with the current integer (element-wise).
      {      | Sort.
       γ     | Group into runs of adjacent elements.
        €g   | Get the length of each.
          Ë  | Are all equal?

4

Ngôn ngữ Wolfram (Mathicala) , 56 52 byte

Cảm ơn Không phải là một cây để tiết kiệm 4 byte.

Cases[Range[2,#.#],n_/;Equal@@Last/@Tally[#~Mod~n]]&

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

Thủ thuật đánh gôn chính là sử dụng tổng các giá trị tuyệt đối (hoặc tổng 1 giá trị ) của các giá trị bình phương, được tính như một sản phẩm chấm với chính nó, làm giới hạn trên thay vì Max@#-Min@#. Mặt khác, nó chỉ thực hiện các thông số kỹ thuật rất theo nghĩa đen.


3

Perl 6 ,  52  48 byte

{grep {[==] .classify(*X%$^a).values},2.. .max-.min}

Kiểm tra nó

{grep {[==] bag($_ X%$^a).values},2.. .max-.min}

Kiểm tra nó

Mở rộng:

{  # bare block lambda with implicit parameter 「$_」

  grep

    {  # bare block lambda with placeholder parameter 「$a」

      [==]           # reduce with &infix:«==» (are the counts equal to each other)

        bag(         # group moduluses together

          $_ X% $^a  # find all the moduluses using the current divisor 「$a」

        ).values     # the count of each of the moduluses
    },

    2 .. .max - .min # all possible divisors
}

3

Haskell , 85 84 byte

f l=[n|n<-[2..sum$abs<$>l],all.(==)=<<head$[r|m<-[0..n],_:r<-[[0|x<-l,mod x n==m]]]]

Hãy thử trực tuyến! Sử dụng tổng giá trị tuyệt đối tối đa từ câu trả lời của Martin Ender .

Chỉnh sửa: -1 byte nhờ rjan Johansen.

Giải trình:

f l=                             -- Given a list of numbers l,
  [n|n<-                       ] -- return a list of all numbers n of the range
    [2..sum$abs<$>l],            -- from 2 to the sum of the absolute values of l
      all.(==)=<<head$           -- for which all elements of the following list are equal:
        [r|m<-[0..n],         ]  -- A list r for each number m from 0 to n, where
          _:r<-[             ]   -- r is the tail of a list (to filter out empty lists)
          [0|x<-l,mod x n==m]    -- of as many zeros as elements of l mod n equal m.


2

R , 75 72 byte

function(L){for(x in 2:(max(L)-min(L)))F=c(F,!sd(table(L%%x)))
which(F)}

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

Sử dụng tableđể tính tổng số của từng modulo nguyên x. Độ lệch chuẩn sdcủa một tập hợp số là 0 nếu chúng đều bằng nhau và ngược lại là dương. Do đó !sd(table(L%%x))TRUEbất cứ nơi nào Llà mod mod cân bằng xvà sai khác. Những giá trị này sau đó được nối vào F.

whichsau đó trả về các chỉ số của các giá trị thực từ hàm. Vì R sử dụng lập chỉ mục dựa trên 1 và Fban đầu là một vectơ có độ dài có giá trị FALSE, nên điều này sẽ trả về chính xác các giá trị bắt đầu bằng 2.

Người ta có thể mong đợi hàm dựng sẵn rangeđể tính toán phạm vi của một tập dữ liệu , nghĩa là max(D)-min(D), nhưng thật đáng buồn, nó tính toán và trả về vectơ c(min(D), max(D)).


2

Sạch , 121 byte

Sử dụng mánh khóe tổng hợp từ câu trả lời của Martin Ender.

Chơi gôn

import StdEnv   
f l=[n\\n<-[2..sum(map abs l)]|length(removeDup[length[m\\m<-[(e rem n+n)rem n\\e<-l]|m==c]\\c<-[0..n]])<3]

Có thể đọc được

import StdEnv
maximum_modulus l = sum (map abs l)
// mod, then add the base, then mod again (to fix issues with negative numbers)
list_modulus l n = [((el rem n) + n) rem n \\ el <- l]
// count the number of elements with each mod equivalency
equiv_class_count l n = [length [m \\ m <- list_modulus l n | m == c] \\ c <- [0..n]]
// for every modulus, take where there are only two quantities of mod class members
f l=[n \\ n <- [2..maximum_modulus l] | length (removeDup (equiv_class_count l n)) < 3]

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


1

Thạch , 12 byte

⁹%LƙE
ASḊçÐf

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

Cảm ơn user202729 vì đã lưu một byte và Martin Ender (gián tiếp) để lưu một byte.

Làm thế nào nó hoạt động

⁹%LƙE ~ Helper link. Let's call the argument N.

⁹%    ~ Modulo the input by N (element-wise).
  Lƙ  ~ Map with length over groups formed by consecutive elements.
    E ~ All equal?

ASḊçÐf ~ Main link.

AS     ~ Absolute value of each, sum.
  Ḋ    ~ Dequeue (create the range [2 ... ^]).
   çÐf ~ Filter by the last link called dyadically.

Một thay thế 12-liner thay thế có thể được thử trực tuyến!


Tôi xóa câu trả lời của tôi vì bây giờ nó là dư thừa. Cảm ơn Martin cho AS( Sum of Absolutes) quá.
dùng202729

1
Để tham khảo cho các độc giả tương lai, tôi đã làm rõ lý do tại sao ḟ0không cần thiết trong trò chuyện .
Ông Xcoder


1

MATL , 19 byte

-4 byte nhờ Luis Mendo!

S5L)d:Q"G@\8#uZs~?@

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

Cảng của tôi câu trả lời trong R .

Suppose we have input [12,12,-4,20]
         # (implicit input), stack: [12,12,-4,20]
S        # sort the list, stack: [-4, 12, 12, 20]
5L       # push [1 0], stack: [[-4, 12, 12, 20]; [1 0]]
)        # 1-based modular index, stack: [-4, 20]
d        # successive differences, stack: [24]
:        # generate 1:(max(data)-min(data)), stack: [[1...24]]
Q        # increment to start at 2, stack: [[2...25]]
"        # for each element in [2...25]
 G       # push input, stack: [[12,12,-4,20]]
 @       # push loop index, stack: [[12,12,-4,20], 2]
 \       # compute modulo, stack: [[0,0,0,0]]
 8#      # use alternate output spec, unique has 4 outputs, so 8 keeps only the 4th
 u       # unique. 4th output is the counts of each unique value, stack: [4]
 Zs      # compute standard deviation, stack: [0]
 ~       # logical negate, stack: [T]
 ?       # if true,
  @      # push loop index
         # (implicit end of if)
         # (implicit end of for loop)
         # (implicit output of stack as column vector


Bạn có thể rút ngắn một chút bằng cách sử dụng S5L)dthay vì X>GX<-8#uthay vìFFFT#u
Luis Mendo

@LuisMendo Tôi không thể tìm ra cách đẩy [1 0](nhưng tôi biết điều đó là có thể) nên rất 5Ltiện dụng và tôi *still* really need to go and properly read the docs for # `:( nhưng cảm ơn bạn!
Giuseppe

Đối với #, chỉ định một số lớn hơn số lượng đầu ra tối đa chỉ cần chọn các đầu ra riêng lẻ. Với chức năng utối đa là 4, vì vậy 5#uT#u, 6#uFT#u, vv
Luis Mendo

0

JavaScript (ES6), 117 byte

Xuất ra một danh sách các giá trị được phân tách bằng dấu cách.

a=>(g=m=>a.map(n=>x[k=(z|=m/2<n|m/2<-n,n%m+m)%m]=-~x[k],y=z=0,x=[])|z?(x.some(x=>x-(y?y:y=x))?'':m+' ')+g(m+1):'')(2)

Các trường hợp thử nghiệm


0

Clojure, 91 byte

#(for[i(range 2(apply +(map * % %))):when(apply =(vals(frequencies(for[j %](mod j i)))))]i)

Sử dụng frequencieskhông lý tưởng trong mã golf.


0

J, 38 byte

[:}.@I.([:i.1#.|)(1=1#.[:~:|#/.])"0 1]

Tín dụng cho ông Xcoder cho tổng số giá trị tuyệt đối lừa.

Chỉnh sửa trong một liên kết TIO nếu bạn muốn - Tôi đã vội vàng đánh golf này.

Sắp có giải thích và liên kết TIO (ish).


0

APL (Dyalog) , 43 41 38 30 byte

S trong mã cho biết toàn bộ câu chuyện.

8 byte được lưu nhờ vào @ Adám

x⊆⍨1=⊂(≢∘∪1⊥|∘.=|)¨⍨x1+∘⍳1⊥|

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


Tàu hỏa + Độ sâu → Xếp hạng, 30 byte:∊x⊆⍨1=⊂(≢∘∪1⊥|∘.=|)¨⍨x←1+∘⍳1⊥|
Adám
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.