Daftar mod-seimbang

14

pengantar

Misalkan saya memiliki daftar bilangan bulat, katakanlah L = [-1,2,2,1,2,7,1,4] . Saya suka memiliki keseimbangan dalam hidup saya, jadi saya senang melihatnya memiliki banyak elemen aneh bahkan elemen. Terlebih lagi, ia juga memiliki jumlah elemen yang sama di semua kelas modulo yang terdiri dari 3 elemen:

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

Sayangnya, untuk kelas modulo 4 ini tidak lagi berlaku. Secara umum, kita katakan daftar tidak kosong adalah modulo N seimbang jika ia memiliki jumlah elemen yang sama di semua kelas modulo N yang angka ini bukan 0. Daftar di atas L adalah modulo 2 dan 3 yang seimbang, tetapi modulo tidak seimbang 4.

Tugas

Input Anda adalah daftar L kosong dari bilangan bulat yang diambil dalam format apa pun yang masuk akal. Output Anda adalah daftar bilangan bulat N ≥ 2 sehingga L seimbang modulo N , sekali lagi dalam format yang masuk akal. Urutan output tidak masalah, tetapi seharusnya tidak mengandung duplikat.

Dijamin bahwa hanya ada banyak angka dalam output, yang berarti tepat bahwa tidak semua elemen L terjadi jumlah yang sama kali di dalamnya. Contoh input yang tidak valid adalah [3] , [1,2] dan [0,4,4,0,3,3] . Perhatikan bahwa jumlah terbesar dalam output paling banyak adalah max (L) - min (L) .

Hitungan byte terendah dalam setiap bahasa menang, dan standar berlaku.

Uji kasus

[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]
Zgarb
sumber
Beberapa bahasa yang secara otomatis menghitung batas atas (mungkin Brachylog?) Akan memiliki keuntungan ...
user202729

Jawaban:

4

05AB1E , 11 byte

ÄOL¦ʒ%{γ€gË

Cobalah online!

Ä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?
Tuan Xcoder
sumber
4

Bahasa Wolfram (Mathematica) , 56 52 byte

Terima kasih untuk Tidak pohon untuk menyimpan 4 byte.

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

Cobalah online!

Trik golf utama adalah dengan menggunakan jumlah nilai absolut (atau 1-norma) dari nilai kuadrat, dihitung sebagai produk titik dengan dirinya sendiri, sebagai batas atas alih-alih Max@#-Min@#. Kalau tidak, itu hanya mengimplementasikan spek secara sangat harfiah.

Martin Ender
sumber
3

Perl 6 ,  52  48 byte

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

Menguji

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

Menguji

Diperluas:

{  # 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
}
Brad Gilbert b2gills
sumber
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]]]]

Cobalah online! Menggunakan jumlah nilai absolut sebagai maksimum dari jawaban Martin Ender .

Sunting: -1 byte berkat Ørjan Johansen.

Penjelasan:

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.
Laikoni
sumber
2

R , 75 72 byte

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

Cobalah online!

Menggunakan tableuntuk menghitung jumlah setiap modulo integer x. Standar deviasi sddari satu set angka adalah nol jika mereka semua sama, dan sebaliknya positif. Oleh karena !sd(table(L%%x))itu TRUEdimanapun Lmod mod-seimbang xdan salah sebaliknya. Nilai-nilai ini kemudian digabungkan menjadi F.

whichlalu mengembalikan indeks nilai sebenarnya dari fungsi. Karena R menggunakan pengindeksan berbasis 1 dan Fawalnya merupakan vektor panjang-satu dengan nilai FALSE, ini akan dengan benar mengembalikan nilai yang dimulai dengan2 .

Orang mungkin berharap fungsi builtin rangeuntuk menghitung rentang dataset , yaitu max(D)-min(D), tetapi sayangnya menghitung dan mengembalikan vektor c(min(D), max(D)).

Giuseppe
sumber
2

Bersih , 121 byte

Menggunakan trik penjumlahan mutlak dari jawaban Martin Ender.

Golf:

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]

Dapat dibaca:

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]

Cobalah online!

Suram
sumber
1

Jelly , 12 byte

⁹%LƙE
ASḊçÐf

Cobalah online!

Terima kasih kepada user202729 untuk menyimpan byte dan untuk Martin Ender (secara tidak langsung) karena menyimpan byte.

Bagaimana itu bekerja

⁹%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.

Alternatif 12-by-one liner dapat dicoba secara online!

Tuan Xcoder
sumber
Saya menghapus jawaban saya karena sudah berlebihan sekarang. Terima kasih Martin untuk AS( Sum Absolutes) juga.
user202729
1
Sebagai referensi untuk pembaca masa depan, saya menjelaskan mengapa ḟ0tidak diperlukan dalam obrolan .
Tn. Xcoder
1

Python 3, 120 102 byte

Tidak cantik golf.

-18 byte terima kasih kepada Tn . Xcoder .

f=lambda a,i=2:[]if i>max(a)-min(a)else(len({*map([k%i for k in a].count,range(i)),0})<3)*[i]+f(a,i+1)

Cobalah online!

Colera Su
sumber
1

MATL , 19 byte

-4 byte terima kasih kepada Luis Mendo!

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

Cobalah online!

Pelabuhan saya jawaban dalam 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

Giuseppe
sumber
Anda dapat mempersingkat penggunaan S5L)dalih- alih X>GX<-dan 8#ubukannyaFFFT#u
Luis Mendo
@LuisMendo Saya tidak tahu bagaimana cara mendorong [1 0](tapi saya tahu itu mungkin) jadi 5Lberguna, dan saya *still* really need to go and properly read the docs for # `:( tapi terima kasih!
Giuseppe
Untuk #, menentukan jumlah yang lebih besar dari jumlah maksimum output hanya memilih output individual. Dengan fungsi umaksimal adalah 4, sehingga 5#uadalah T#u, 6#uadalah FT#udll
Luis Mendo
0

JavaScript (ES6), 117 byte

Menghasilkan daftar nilai yang dipisahkan ruang.

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)

Uji kasus

Arnauld
sumber
0

Clojure, 91 byte

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

Menggunakan frequencieskode golf tidak ideal.

NikoNyrh
sumber
0

J, 38 byte

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

Kredit diberikan kepada Tn. Xcoder untuk jumlah trik nilai absolut.

Sunting di tautan TIO jika Anda mau - Saya telah membuatnya dengan cepat.

Penjelasan dan tautan TIO segera hadir (ish).

cole
sumber
0

APL (Dyalog) , 43 41 38 30 byte

Ins dalam kode menceritakan keseluruhan cerita.

8 byte disimpan berkat @ Adám

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

Cobalah online!

Uriel
sumber
Kereta + Kedalaman → Pangkat, 30 byte:∊x⊆⍨1=⊂(≢∘∪1⊥|∘.=|)¨⍨x←1+∘⍳1⊥|
Ad