Combinaisons qui se chevauchent avec des limites supérieures en Python / Ruby / PHP / Golang (Go)

Calculez le nombre de motifs qui se chevauchent avec une limite supérieure en Python / Ruby / PHP / Golang

Le nombre de 12 morceaux prélevés sur 3 types de fruits peut être calculé par la méthode de Combinaison en double lorsqu'il y a 12 morceaux ou plus de chaque fruit. ça peut. Cependant, s'il existe une limite supérieure de 6 pour chaque fruit, cette méthode ne peut pas être utilisée. Par conséquent, il est nécessaire de réaliser la combinaison de chevauchement avec une limite supérieure par une autre méthode. Dans cet exemple, le nombre est équivalent au cas où les dés sont secoués trois fois et le nombre total de lancers est de 12, donc cette formule peut être utilisée de manière inattendue (je pense).

Principe de déduction

Il existe une méthode de calcul de ces combinaisons qui se chevauchent avec une limite supérieure basée sur le principe de déduction. Cliquez ici pour accéder au Site de référence.

Formule

Depuis Site de référence, définissez la limite supérieure sur m, le type de fruit sur n (le nombre de secousses) et le total. Si t, il peut être calculé par la formule suivante.

\begin{eqnarray}
\sum_{ k = 0 }^{ [ \frac{ t - n }{ m } ]} (-1)^k \cdot {}_n \mathrm{ C }_k \cdot {}_n \mathrm{ H }_{ t - n - m \cdot k }
\end{eqnarray}

25 lorsque m = 6, n = 3 et t = 12.

Code source

Python3

import functools as ft


def permutation(n, k):
    if k > n:
        return 0
    elif 0 < k <= n:
        return ft.reduce(lambda x, y:x * y, [n - v for v in range(k)])
    else:
        return 1


def factorial(n):
    return permutation(n, n - 1)


def combination(n, k):
    return int(permutation(n, k) / factorial(k))


def homogeneous(n, k):
    return combination(n + k - 1, k)


def homogeneous_with_limit(m, n, t):
    return sum([(-1)**k * combination(n, k) * homogeneous(n, t - n - m * k) \
                for k in range(0, int((t - n) / m) + 1)])

if __name__ == '__main__':
    print(homogeneous_with_limit(6, 3, 12))

Résultat de sortie


25

Ruby2.4

def permutation(n, k)
  if k > n
    0
  elsif 0 < k && k <= n then ((n - k + 1)..n).inject(:*)
  else 1
  end
end

def factorial(n)
  permutation(n, n - 1)
end

def combination(n, k)
  (permutation(n, k) / factorial(k)).to_i
end

def homogeneous(n, k)
  combination(n + k - 1, k)
end

def homogeneous_with_limit(m, n, t)
  (0..((t - n) / m)).inject(0) {|s, k| s + (-1)**k * combination(n, k) * homogeneous(n, t - n - m * k)}
end

p homogeneous_with_limit(6, 3, 12)

Résultat de sortie


25

PHP7.1

<?php

function permutation(int $n, int $k) : int {
    if ($k > $n) return 0;
    elseif (0 < $k && $k <= $n)
        return array_reduce(range($n - $k + 1, $n), function ($c, $v) { return $c *= $v; }, 1);
    else return 1;
}

function factorial(int $n) : int {
    return permutation($n, $n - 1);
}

function combination(int $n, int $k) : int {
    return intval(permutation($n, $k) / factorial($k));
}

function homogeneous(int $n, int $k) : int {
    return combination($n + $k - 1, $k);
}

function homogeneous_with_limit(int $m, int $n, int $t) : int {
    return array_reduce(range(0, intval(($t - $n) / $m)), function ($s, $k) use ($m, $n, $t) {
        return $s += (-1) ** $k * combination($n, $k) * homogeneous($n, $t - $n - $m * $k);
    });
}

print(homogeneous_with_limit(6, 3, 12));

Résultat de sortie


25

Golang

package main;

import (
    "fmt"
    "math"
)

func permutation(n int, k int) int {
    v := 1
    if 0 < k && k <= n {
        for i := 0; i < k; i++ {
            v *= (n - i)
        }
    } else if k > n {
        v = 0
    }
    return v
}

func factorial(n int) int {
    return permutation(n, n - 1)
}

func combination(n int, k int) int {
    return permutation(n, k) / factorial(k)
}

func homogeneous(n int, k int) int {
    return combination(n + k - 1, k)
}

func homogeneous_with_limit(m int, n int, t int) int {
    e := int((t - n) / m) + 1
    v := 0
    for i := 0; i < e; i++ {
       v += int(math.Pow(-1, float64(i))) * combination(n, i) * homogeneous(n, t - n - m *i)
    }
    return v
}

func main () {
    fmt.Printf("%v\n", homogeneous_with_limit(6, 3, 12))
}

Résultat de sortie


25

Autre

Le principe de déduction est également utilisé dans la preuve de Eratostenes Sieve. Je manque aussi le symbole gaussien ([x]).

Il y a beaucoup de défis, par exemple, si vous secouez 3 dés et que les jets sont (3,5,4) et (3,4,5), ce sera 12, mais si vous ne considérez pas un tel ordre, un autre Vous devez adopter une approche. De plus, si la valeur maximale des trois yeux coupés en dés n'est pas de 6 mais de valeurs différentes, il est nécessaire d'adopter une autre approche. Le cas où l'ordre n'est pas pris en compte a fait l'objet de l'algorithme quelque part, mais je n'ai pas pu le formuler, et j'ai fini par tourner la boucle, alors j'aimerais réessayer. Si la valeur maximale est différente, trouvez la formule graduelle quelque part et c'est clair.

Recommended Posts

Combinaisons qui se chevauchent avec des limites supérieures en Python / Ruby / PHP / Golang (Go)
Hiérarchie, ordre, combinaison (dupliquée) en Python / Ruby / PHP / Golang (Go)
Combinaison de regroupement en Python / Ruby / PHP / Golang (Go)
Gérer les nombres premiers avec Python / Ruby / PHP / Golang (Go)
Proxy dynamique avec python, ruby, PHP
Python avec Go
[Résumé du scraping] | Python Node.js PHP Ruby Go VBA | Scraping Yahoo Top en 6 langues
GNU GLOBAL (gtags) + α dans Go, Ruby, Python
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
Combinaison avec duplication en Python
Comment gérer JSON en Ruby, Python, JavaScript, PHP
Grattage au sélénium en Python
Exploitez LibreOffice avec Python
Java VS PHP VS Python VS Ruby
Grattage avec chromedriver en python
Débogage avec pdb en Python
Gérer les sons en Python
Grattage avec du sélénium en Python
Trouvez l'ordre / la combinaison en Python
Zundokokiyoshi avec python / rubis / Lua
Grattage avec Tor en Python
À propos de Perl, Python, PHP, Ruby
Tweet avec image en Python
Combiné avec ordinal en Python
Hello World dans divers langages [Python / PHP / Java / Perl / Ruby]
Analyse morphologique avec Igo + mecab-ipadic-neologd en Python (avec bonus Ruby)
Reconnaissance des nombres dans les images avec Python
Tester avec des nombres aléatoires en Python
Sélection en plusieurs étapes (Go / C # / Ruby / Python)
Scraping avec Node, Ruby et Python
GOTO en Python avec Sublime Text 3
Scraping avec Selenium en Python (Basic)
Analyse CSS avec cssutils en Python
Numer0n avec des objets fabriqués avec Python
Ouvrez UTF-8 avec BOM en Python
Utiliser rospy avec virtualenv dans Python3
Utiliser Python mis en pyenv avec NeoVim
Heatmap avec dendrogramme en Python + matplotlib
Lire des fichiers en parallèle avec Python
Générer un mot de passe pour le manuel avec python
Utiliser OpenCV avec Python 3 dans Window
Jusqu'à traiter de python dans Atom
Gestion des expressions régulières par PHP / Python
Démarrez avec Python avec Blender
Envoyer l'image avec python et enregistrer avec php
Travailler avec des images DICOM en Python
J'ai essayé de frapper l'API Mastodon avec Ruby (Faraday) / Python (Pycurl) / PHP (Curl)
Écrire de la documentation dans Sphinx avec Python Livereload
Chevauchement d'expressions régulières en Python et Java
Obtenez des données supplémentaires vers LDAP avec python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Essayez de vous connecter à qiita avec Python
Test de stress avec Locust écrit en Python
Évitez les boucles imbriquées en PHP et Python
Python3> dans le mot clé> Vrai avec une correspondance partielle?
Contrôle exclusif avec fichier de verrouillage en Python
Surveillance des appareils effectuée par Python On-box de IOS-XE
Essayez de travailler avec des données binaires en Python
Grande différence dans les performances de ruby, python, httpd
Exemple PHP / Python / Ruby frappant l'API Path
Obtention d'informations d'identification AWS temporaires en PHP, Python