Mod 2 Coefficients multinomiaux

14

quintopia a publié ici un défi pour calculer les coefficients multinomiaux (une partie du texte ici est copiée à partir de là). Il existe un algorithme amusant pour calculer les coefficients multinomiaux mod 2.

Étant donné une liste de nombres, k 1 , k 2 , ..., k m , sortent le résidu du coefficient multinomial:

entrez la description de l'image ici

mod réduit 2. L'algorithme suivant le fait efficacement: pour chaque k i , calculer l'expansion binaire de k i , c'est-à-dire trouver un ij tel que chaque a ij soit 1 ou 0 et

entrez la description de l'image ici

S'il existe un j tel que a rj = a sj = 1 pour r ≠ s, alors le coefficient multinomial mod 2 associé est 0, sinon le coefficient multinomial mod 2 est 1.

Tâche

Écrivez un programme ou une fonction qui prend m nombres, k 1 , k 2 , ..., k m , et génère ou renvoie le coefficient multinomial correspondant. Votre programme peut éventuellement prendre m comme argument supplémentaire si nécessaire.

  • Ces nombres peuvent être entrés dans n'importe quel format souhaité, par exemple regroupés dans des listes ou codés en unaire, ou toute autre chose, tant que le calcul réel du coefficient multinomial est effectué par votre code, et non le processus de codage.

  • La sortie peut être toute valeur vraie si le coefficient multinomial est impair et toute valeur de falsey si le coefficient multinomial est pair.

  • Les éléments intégrés conçus pour calculer le coefficient multinomial ne sont pas autorisés.

  • Des échappatoires standard s'appliquent.

Notation

Voici le code golf: la solution la plus courte en octets gagne.

Exemples:

Pour trouver le coefficient multinomial de 7, 16 et 1000, nous développons binaire chacun d'eux:

entrez la description de l'image ici

Puisqu'aucune colonne n'a plus d'un 1, le coefficient multinomial est impair, et donc nous devrions produire quelque chose de vrai.

Pour trouver le coefficient multinomial de 7, 16 et 76, nous développons binaire chacun d'eux:

entrez la description de l'image ici

Puisque 76 et 7 ont un 4 dans leur expansion binaire, le coefficient multinomial est pair et nous produisons donc une valeur de falsey.

Cas de test:

Input: [2, 0, 1]
Output: Truthy

Input: [5,4,3,2,1]
Output: Falsey

Input: [1,2,4,8,16]
Output: Truthy

Input: [7,16,76]
Output: Falsey

Input: [7,16,1000]
Output: Truthy

Input: [545, 1044, 266, 2240]
Output: Truthy

Input: [1282, 2068, 137, 584]
Output: Falsey

Input: [274728976, 546308480, 67272744, 135004166, 16790592, 33636865]
Output: Truthy

Input: [134285315, 33849872, 553780288, 544928, 4202764, 345243648]
Output: Falsey
capuche
la source
1
Bienvenue chez PPCG! Bon premier post!
Rɪᴋᴇʀ
Je pense que plusieurs langues avec ==pour l'égalité auraient pu sauver un octet si la vérité et le falsey avaient été autorisés à être inversés.
Ørjan Johansen
@ ØrjanJohansen Cela sonne bien.
Hood

Réponses:

7

Python 3 2, 55 43 42 octets

lambda l:sum(l)==eval(`l`.replace(*',|'))

-12 octets de M. Xcoder

-1 octet de Rod

Essayez-le en ligne!

Explication: Vérifie si la somme des nombres est égale au bit ou des nombres.

pizzapants184
la source
43 octets:lambda l:sum(l)==eval("|".join(map(str,l)))
M. Xcoder
Vous pouvez atteindre 42 octets en passant à python2
Rod
2

Japt, 6 octets

Un autre port des solutions de pizzapants184 et de Leaky Nun.

x ¶Ur|

Essaye-le

Hirsute
la source
Techniquement, pizzapants184 a répondu 14 secondes plus tôt que moi ...
Leaky Nun
2

JavaScript (ES6), 37 35 34 octets

Enregistré 2 octets grâce à @ Mr.Xcoder
Enregistré 1 octet grâce à @ETHproductions

La comparaison de la somme avec l'OR au niveau du bit (comme l'ont fait pizzapants184 et Leaky Nun ) est 1 3 4 octets plus courte que mon approche initiale:

a=>(q=c=>eval(a.join(c)))`|`==q`+`

Cas de test


Alt. version, 38 octets

a=>!a.some((x,i)=>a.some(y=>i--&&x&y))

Cas de test

Arnauld
la source
Techniquement, pizzapants184 a répondu 14 secondes plus tôt que moi ...
Leaky Nun
-1 octet:a=>(q=c=>eval(a.join(c)))`|`==q`+`;
ETHproductions
@ETHproductions Nice! Cela fonctionne bien dans Node.js. Mais avez-vous réussi à le faire fonctionner dans un navigateur?
Arnauld
Fonctionne bien pour moi dans Firefox 57. Obtenez-vous une erreur ou ne fonctionne-t-il pas correctement?
ETHproductions
@ETHproductions En fait, oui, cela fonctionne. Il arrive juste à échouer sur repl.it .
Arnauld
2

Haskell , 38 octets

(==).sum<*>foldl1 xorest une fonction anonyme renvoyant un fichier Bool. Utiliser comme ((==).sum<*>foldl1 xor) [2,0,1].

import Data.Bits
(==).sum<*>foldl1 xor

Essayez-le en ligne!

  • À peu près la même astuce de pizzapants184 et Leaky Nun que tout le monde utilise, sauf qu'avec les noms d'opérateurs Haskell, il enregistre un octet à utiliser (bit à bit) xorau lieu de (.|.)(bit à bit ou).

  • (==).sum<*>foldl1 xorest une version sans point de \l->sum l==foldl1 xor l.

Ørjan Johansen
la source
2

Java 8, 53 octets

a->{int i=0,j=0;for(int x:a){i+=x;j|=x;}return i==j;}

Port de la réponse Jelly de @LeakyNun .

Explication:

Essayez-le ici.

a->{             // Method with integer-array parameter and boolean return-type
  int i=0,j=0;   //  Two integers, both starting at 0
  for(int x:a){  //  Loop over the array
    i+=x;        //   Add them to the first integer
    j|=x;}       //   And bitwise-OR it with the second integer
  return i==j;}  //  Return if both integers are the same after the loop
Kevin Cruijssen
la source
1

Perl 6 , 15 octets

{.sum==[+|] $_}

Essaye-le

Étendu:

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

    .sum  # the sum of 「$_」 (implicit method call)

  ==

    [+|]  # reduce using &infix:«+|» (numeric binary or)

      $_  # the input
}
Brad Gilbert b2gills
la source
1

Rouge , 78 octets

f: func[x][b: :to-binary t: 0 s: b 0 foreach n x[t: t + n s: s or b n]s = b t]

Comment ça fonctionne:

Non golfé:

Red []
f: func [x][         -  a function taking a block as an argument
    b: :to-binary    -  an alias for the to-binary function
    t: 0             -  set the sum of the numbers to 0
    s: b 0           -  set the "or" total to binary 0
    foreach n x[     -  for each number in the block
        t: t + n     -  add it to the sum
        s: s or b n  -  bitwise or of its binary representation with the total
    ]
    s = b t          - are the sum (binary) and the "or" total equal?
]

Essayez-le en ligne!

Galen Ivanov
la source
0

Lot, 73 octets

@set/as=o=0
@for %%i in (%*)do @set/as+=%%i,o^|=%%i
@if %s%==%o% echo 1

Sorties 1pour vérité, rien pour fausse. Un autre port évident de l'algorithme de pizzapants184 / Leaky Nun.

Neil
la source
0

J , 10 octets

+/=+./&.#:

Encore un autre port des solutions de pizzapants184 et de Leaky Nun.

Comment ça fonctionne?

+/.&.#: - convertir les nombres en binaire, appliquer au niveau du bit ou aux puissances de deux et reconvertir du binaire en décimal

+/ - réduire l'entrée par addition

= - les éléments ci-dessus sont-ils égaux?

Essayez-le en ligne!

Alternative simple

J , 12 octets

2>[:>./+/@#:

Comment ça fonctionne?

+/@#: - convertir chaque nombre en binaire et trouver la somme de chaque puissance de 2

>./ - trouver le maximum

2>- est-ce moins de 2? -> véridique

Essayez-le en ligne!

Galen Ivanov
la source