Listes équilibrées par mod

14

introduction

Supposons que j'ai une liste d'entiers, disons L = [-1,2,2,1,2,7,1,4] . J'aime avoir l'équilibre dans ma vie, donc je suis heureux de voir qu'il a autant d'éléments impairs que d'éléments pairs. De plus, il a également un nombre égal d'éléments dans toutes les classes modulo de 3 dans lesquelles il a des éléments:

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

Malheureusement, pour les classes modulo de 4, cela ne tient plus. En général, nous disons qu'une liste non vide est équilibrée modulo N si elle a un nombre égal d'éléments dans toutes les classes modulo de N pour lesquelles ce nombre n'est pas 0. La liste ci-dessus L est modulo équilibrée 2 et 3, mais modulo déséquilibrée 4.

La tâche

Votre entrée est une liste non vide L d'entiers pris dans n'importe quel format raisonnable. Votre sortie est la liste de ces entiers N ≥ 2 tels que L est modulo N équilibré , là encore dans n'importe quel format raisonnable. L'ordre de sortie n'a pas d'importance, mais il ne doit pas contenir de doublons.

Il est garanti qu'il n'y a qu'un nombre fini de nombres dans la sortie, ce qui signifie précisément que tous les éléments de L n'y figurent pas autant de fois. Des exemples d'entrées non valides sont [3] , [1,2] et [0,4,4,0,3,3] . Notez que le plus grand nombre dans la sortie est au maximum max (L) - min (L) .

Le nombre d'octets le plus bas dans chaque langue gagne et le standard s'appliquent.

Cas de test

[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
la source
Certaines langues qui calculent automatiquement la borne supérieure (Brachylog peut-être?)
Auront

Réponses:

4

05AB1E , 11 octets

ÄOL¦ʒ%{γ€gË

Essayez-le en ligne!

Ä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?
M. Xcoder
la source
4

Wolfram Language (Mathematica) , 56 52 octets

Merci à Not a tree d'avoir économisé 4 octets.

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

Essayez-le en ligne!

L'astuce principale du golf est d'utiliser la somme des valeurs absolues (ou la norme 1) somme des valeurs au carré, calculée comme un produit scalaire avec lui-même, comme limite supérieure au lieu de Max@#-Min@#. Sinon, il implémente juste la spécification très littéralement.

Martin Ender
la source
3

Perl 6 ,  52  48 octets

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

Essaye-le

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

Essaye-le

Étendu:

{  # 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
la source
3

Haskell , 85 84 octets

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

Essayez-le en ligne! Utilise la somme des valeurs absolues comme maximum de la réponse de Martin Ender .

Edit: -1 octet grâce à Ørjan Johansen.

Explication:

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
la source
2

R , 75 72 octets

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

Essayez-le en ligne!

Utilise tablepour calculer les comptes de chaque module entier x. L'écart type sdd'un ensemble de nombres est égal à zéro s'ils sont tous égaux et positifs sinon. C'est !sd(table(L%%x))donc TRUELest mod mod-équilibré xet faux sinon. Ces valeurs sont ensuite concaténées dans F.

whichrenvoie ensuite les indices des valeurs vraies de la fonction. Puisque R utilise l'indexation basée sur 1 et Fest initialement un vecteur de longueur un avec valeur FALSE, cela renverra correctement les valeurs commençant par 2.

On pourrait s'attendre à ce que la fonction intégrée rangecalcule la plage d'un ensemble de données , c'est-à-dire max(D)-min(D), mais malheureusement, elle calcule et renvoie le vecteur c(min(D), max(D)).

Giuseppe
la source
2

Nettoyer , 121 octets

Utilise l'astuce de la somme des absolus de la réponse de 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]

Lisible:

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]

Essayez-le en ligne!

Οurous
la source
1

Gelée , 12 octets

⁹%LƙE
ASḊçÐf

Essayez-le en ligne!

Merci à user202729 pour avoir sauvegardé un octet et à Martin Ender (indirectement) pour avoir sauvegardé un octet.

Comment ça fonctionne

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

Une alternative à une ligne de 12 octets peut être essayée en ligne!

M. Xcoder
la source
Je supprime ma réponse car elle est redondante maintenant. Merci aussi à Martin pour AS( Seuh de Absolutes).
user202729
1
En tant que référence pour les futurs lecteurs, j'ai précisé pourquoi ḟ0n'est pas nécessaire dans le chat .
M. Xcoder
1

Python 3, 120 102 octets

Pas assez golfique.

-18 octets grâce à M. 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)

Essayez-le en ligne!

Colera Su
la source
1

MATL , 19 octets

-4 octets grâce à Luis Mendo!

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

Essayez-le en ligne!

Port de ma réponse dans 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
la source
Vous pouvez raccourcir un peu en utilisant S5L)dau lieu de X>GX<-et 8#uau lieu deFFFT#u
Luis Mendo
@LuisMendo Je ne savais pas comment pousser [1 0](mais je savais que c'était possible) donc 5Lc'est pratique, et je *still* really need to go and properly read the docs for # `:( mais merci!
Giuseppe
Pour #, la spécification d'un nombre supérieur au nombre maximal de sorties sélectionne simplement les sorties individuelles. Avec la fonction, ule maximum est 4, 5#uest T#u, 6#uest FT#uetc.
Luis Mendo
0

JavaScript (ES6), 117 octets

Génère une liste de valeurs séparées par des espaces.

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)

Cas de test

Arnauld
la source
0

Clojure, 91 octets

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

L'utilisation frequenciesn'est pas idéale dans le golf de code.

NikoNyrh
la source
0

J, 38 octets

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

Le mérite revient à M. Xcoder pour la somme des valeurs absolues.

Modifiez-le dans un lien TIO si vous le souhaitez - je l'ai joué un peu rapidement.

Explication et lien TIO à venir (ish).

cole
la source
0

APL (Dyalog) , 43 41 38 30 octets

Les ⍨ dans le code racontent toute l'histoire.

8 octets économisés grâce à @ Adám

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

Essayez-le en ligne!

Uriel
la source
Train + Profondeur → Rang, 30 octets:∊x⊆⍨1=⊂(≢∘∪1⊥|∘.=|)¨⍨x←1+∘⍳1⊥|
Adam