Skip to main content

A fast Connect-4 Solver for Python & C++

Project description

BitBully: A fast and perfect-playing Connect-4 Agent for Python 3 & C/C++

bitbully-logo-full


GitHub Repo stars GitHub forks Python Python Python Docs pre-commit PyPI - Version PyPI - Downloads PyPI - License Coveralls Wheels Doxygen Doxygen Buy Me a Coffee

BitBully is a high-performance Connect-4 solver built using C++ and Python bindings, leveraging advanced algorithms and optimized bitwise operations. It provides tools for solving and analyzing Connect-4 games efficiently, designed for both developers and researchers.

Table of Contents


Features

  • Fast Solver: Implements MTD(f) and null-window search algorithms for Connect-4.
  • Bitboard Representation: Efficiently manages board states using bitwise operations.
  • Advanced Features: Includes transposition tables, threat detection, and move prioritization.
  • Python Bindings: Exposes core functionality through the bitbully_core Python module using pybind11.
  • Cross-Platform: Build and run on Linux, Windows, and macOS.
  • Open-Source: Fully accessible codebase for learning and contribution.

Installation

Prerequisites

  • Python: Version 3.10 or higher, PyPy 3.10 or higher

Build and Install

From PyPI (Recommended)

The easiest way to install the BitBully package is via PyPI:

pip install bitbully

This will automatically download and install the pre-built package, including the Python bindings.


Python API Docs

Please refer to the docs here: https://markusthill.github.io/BitBully/.

The docs for the opening databases can be found here: https://markusthill.github.io/bitbully-databases/


Usage

Start with a simple Widget on Colab

Open In Colab

BitBully Lib (recommended)

tbd

BitBully Core (advanced)

Use the BitBullyCore and BoardCore classes directly in Python:

BoardCore Examples

The low-level BoardCore API gives you full control over Connect-4 positions: you can play moves, generate random boards, mirror positions, and query win conditions or hashes.

Create and Print a Board
import bitbully.bitbully_core as bbc

board = bbc.BoardCore()
print(board)          # Human-readable 7x6 board
print(board.movesLeft())   # 42 on an empty board
print(board.countTokens()) # 0 on an empty board

Play Moves and Check for Winning Positions
import bitbully.bitbully_core as bbc

board = bbc.BoardCore()

# Play a small sequence of moves (columns 0–6)
for col in [3, 2, 3, 2, 3, 4, 3]:
    assert board.play(col)

print(board)

# Check if the side to move has an immediate winning move
print(board.canWin())      # False
print(board.hasWin())      # True, since the last move created 4-in-a-row

You can also check if a specific column is a winning move:

board = bbc.BoardCore()
board.setBoard([3, 3, 3, 3, 2, 2, 4, 4])

print(board.canWin())  # True
print(board.canWin(1))  # True  – playing in column 1 wins
print(board.canWin(3))  # False – no win in column 3

Set a Board from a Move List or Array
import bitbully.bitbully_core as bbc

board = bbc.BoardCore()

# From a move sequence (recommended)
assert board.setBoard([0, 1, 2, 3, 3, 2, 1, 0])

# Convert to 7x6 array (columns × rows)
array = board.toArray()
print(len(array), len(array[0]))  # 7 x 6

# From a 7x6 array of tokens (1 = Yellow, 2 = Red)
array_board = [[0 for _ in range(6)] for _ in range(7)]
array_board[3][0] = 1  # Yellow in center column bottom row
b2 = bbc.BoardCore()
assert b2.setBoard(array_board)

Generate Random Boards
import bitbully.bitbully_core as bbc

board, moves = bbc.BoardCore.randomBoard(10, True)

print(board)   # Random, valid board
print(moves)   # List of 10 column indices
print(board.canWin())  # Usually False for random boards in this setup

Mirroring Boards and Symmetry
import bitbully.bitbully_core as bbc

board = bbc.BoardCore()
board.setBoard([0, 1, 2])      # Left side

mirrored = board.mirror()      # Mirror around center column
print(board)
print(mirrored)

# Double-mirroring returns the original position
assert board == mirrored.mirror()

Hashing, Equality, and Copies
import bitbully.bitbully_core as bbc

b1 = bbc.BoardCore()
b2 = bbc.BoardCore()

moves = [0, 1, 2, 3]
for m in moves:
    b1.play(m)
    b2.play(m)

assert b1 == b2
assert b1.hash() == b2.hash()
assert b1.uid() == b2.uid()

# Copying a board
b3 = b1.copy()           # or bbc.BoardCore(b1)
assert b3 == b1

b3.play(4)               # Modify the copy
assert b3 != b1
assert b3.hash() != b1.hash()

These examples are based on the internal test suite and show typical ways of interacting with BoardCore programmatically.

BitBullyCore: Connect-4 Solver Examples

The BitBullyCore module provides a high-performance Connect-4 solver written in C++ and exposed to Python. You can evaluate positions, score all legal moves, or run the full MTD(f) search.


Solve a Position with MTD(f)
import bitbully.bitbully_core as bbc

# Construct a position: alternate moves into the center column
board = bbc.BoardCore()
for _ in range(6):
    board.play(3)  # Column 3

solver = bbc.BitBullyCore()
score = solver.mtdf(board, first_guess=0)

print("Best score:", score)

mtdf returns an integer score from the perspective of the side to move (positive = winning, negative = losing).


Score All Moves in a Position

scoreMoves(board) returns a list of 7 integers: the evaluated score for playing in each column (0–6). Illegal moves (full columns) are still included in the list.

import bitbully.bitbully_core as bbc

board = bbc.BoardCore()
board.setBoard([3, 4, 1, 1, 0, 2, 2, 2])

solver = bbc.BitBullyCore()
scores = solver.scoreMoves(board)

print("Move scores:", scores)
# Example output:
# [-3, -3, 1, -4, 3, -2, -2]

Using the Solver in a Loop (Move Selection)
import bitbully.bitbully_core as bbc
import time

board = bbc.BoardCore()
solver = bbc.BitBullyCore()

for move in [3, 4, 1, 1, 0, 2, 2, 2]:  # Example opening
    board.play(move)

start = time.perf_counter()
scores = solver.scoreMoves(board)
best_move = max(range(7), key=lambda c: scores[c])
print(f"Time: {round(time.perf_counter() - start, 2)} seconds!")
print("Scores:", scores)
print("Best move suggestion:", best_move)
# best move is into column 4

Further Examples using the BitBully Solver

You can initialize a board using an array with shape (7, 6) (columns first) and solve it:

from bitbully import bitbully_core

# Define a Connect-4 board as an array (7 columns x 6 rows)
# You may also define the board using a numpy array if numpy is installed
# 0 = Empty, 1 = Yellow, 2 = Red
# Here, the left column represents the bottom row of the board
board_array = [
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [1, 2, 1, 2, 1, 0],
    [0, 0, 0, 0, 0, 0],
    [2, 1, 2, 0, 0, 0],
    [0, 0, 0, 0, 0, 0]
]

# Convert the array to the BoardCore board
board = bitbully_core.BoardCore()
assert board.setBoard(board_array), "Invalid board!"

print(board)

# Solve the position
solver = bitbully_core.BitBullyCore()
score = solver.mtdf(board, first_guess=0)
print(f"Best score for the current board: {score}") # expected score: 1

Run the Bitbully solver with an opening book (here: 12-ply opening book with winning distances):

from bitbully import bitbully_core as bbc
import bitbully_databases as bbd
import importlib.resources

db_path = bbd.BitBullyDatabases.get_database_path("12-ply-dist")
bitbully = bbc.BitBullyCore(db_path)
b = bbc.BoardCore()  # Empty board
bitbully.scoreMoves(b)  # expected result: [-2, -1, 0, 1, 0, -1, -2]

Further Usage Examples for BitBully Core

Create all Positions with (up to) n tokens starting from Board b:

from bitbully import bitbully_core as bbc

b = bbc.BoardCore()  # empty board
board_list_3ply = b.allPositions(3, True)  # All positions with exactly 3 tokens
len(board_list_3ply)  # should be 238 according to https://oeis.org/A212693

Opening Book Examples

BitBully Databases provide fast lookup tables (opening books) for Connect-4, allowing you to query evaluated positions, check if a board is known, and retrieve win/loss/distance values.

Load an Opening Book
import bitbully_databases as bbd
import bitbully.bitbully_core as bbc

# Load the 8-ply opening book (no distances)
db_path = bbd.BitBullyDatabases.get_database_path("8-ply")
book = bbc.OpeningBookCore(db_path, is_8ply=True, with_distances=False)

print(book.getBookSize())  # e.g., 34515
print(book.getNPly())      # -> 8

Accessing Entries

Each entry consists of (key, value) where:

  • key is the Huffman-encoded board state
  • value is the evaluation (win/loss/draw or distance)
k, v = book.getEntry(0)
print(k, v)

Evaluating a Board Position
import bitbully.bitbully_core as bbc

board = bbc.BoardCore()
board.setBoard([2, 3, 3, 3, 3, 3, 5, 5])  # Sequence of column moves

value = book.getBoardValue(board)
print("Evaluation:", value)

Check Whether a Position Is in the Opening Book

The books only contain one variant for mirror-symmetric positions:

board = bbc.BoardCore()
board.setBoard([1, 3, 4, 3, 4, 4, 3, 3])

print(book.isInBook(board))              # e.g., False
print(book.isInBook(board.mirror()))     # e.g., True, checks symmetric position

Advanced Build and Install

Prerequisites

  • Python: Version 3.10 or higher
  • CMake: Version 3.15 or higher
  • C++ Compiler: A compiler supporting C++-17 (e.g., GCC, Clang, MSVC)
  • Python Development Headers: Required for building the Python bindings

From Source

  1. Clone the repository:

    git clone https://github.com/MarkusThill/BitBully.git
    cd BitBully
    git submodule update --init --recursive # – Initialize and update submodules.
    
  2. Build and install the Python package:

    pip install .
    

Building Static Library with CMake

  1. Create a build directory and configure the project:

    mkdir build && cd build
    cmake .. -DCMAKE_BUILD_TYPE=Release
    
  2. Build the a static library:

    cmake --build . --target cppBitBully
    

Contributing & Development

Whether you're fixing a bug, optimizing performance, or extending BitBully with new features, contributions are highly appreciated. The full development guide provides everything you need to work on the project efficiently:

📘 Complete Development Documentation https://markusthill.github.io/BitBully/develop/

It covers all essential workflows, including:

  • Repository setup: cloning, submodules, virtual environments
  • Development environment: installing dev dependencies, using editable mode
  • Code quality tools: ruff, mypy/pyrefly, clang-format, pre-commit, commitizen
  • Building the project: local wheels, CMake, cibuildwheel, sdist
  • Testing: running pytest, filtering tests, coverage, CI integration
  • Release workflow: semantic versioning, version bumping, tagging, PyPI/TestPyPI publishing
  • Debugging & tooling: GDB, Doxygen, mkdocs, stub generation for pybind11
  • Platform notes: Debian/Linux setup, gcov matching, MSVC quirks
  • Cheatsheets: Git, submodules, CMake, Docker, Ruby/Jekyll, npm, environment management

If you're contributing code, please:

  1. Follow the coding standards and formatting tools (ruff, mypy, clang-format).
  2. Install and run pre-commit hooks before committing.
  3. Write or update tests for all behavioral changes.
  4. Use Commitizen for semantic commit messages and versioning.
  5. Open an issue or discussion for major changes.

Pull requests are welcome — thank you for helping improve BitBully! 🚀


License

This project is licensed under the AGPL-3.0 license.


Contact

If you have any questions or feedback, feel free to reach out:


Acknowledgments

Many of the concepts and techniques used in this project are inspired by the outstanding Connect-4 solvers developed by Pascal Pons and John Tromp. Their work has been invaluable in shaping this effort:


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bitbully-0.0.70.tar.gz (8.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

bitbully-0.0.70-pp311-pypy311_pp73-win_amd64.whl (467.3 kB view details)

Uploaded PyPyWindows x86-64

bitbully-0.0.70-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (343.6 kB view details)

Uploaded PyPymanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.70-pp311-pypy311_pp73-macosx_11_0_arm64.whl (239.7 kB view details)

Uploaded PyPymacOS 11.0+ ARM64

bitbully-0.0.70-pp310-pypy310_pp73-win_amd64.whl (465.8 kB view details)

Uploaded PyPyWindows x86-64

bitbully-0.0.70-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (342.2 kB view details)

Uploaded PyPymanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.70-pp310-pypy310_pp73-macosx_11_0_arm64.whl (238.4 kB view details)

Uploaded PyPymacOS 11.0+ ARM64

bitbully-0.0.70-cp313-cp313-win_amd64.whl (468.7 kB view details)

Uploaded CPython 3.13Windows x86-64

bitbully-0.0.70-cp313-cp313-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bitbully-0.0.70-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (345.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.70-cp313-cp313-macosx_11_0_arm64.whl (240.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bitbully-0.0.70-cp312-cp312-win_amd64.whl (468.7 kB view details)

Uploaded CPython 3.12Windows x86-64

bitbully-0.0.70-cp312-cp312-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bitbully-0.0.70-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (346.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.70-cp312-cp312-macosx_11_0_arm64.whl (240.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bitbully-0.0.70-cp311-cp311-win_amd64.whl (467.9 kB view details)

Uploaded CPython 3.11Windows x86-64

bitbully-0.0.70-cp311-cp311-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bitbully-0.0.70-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (343.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.70-cp311-cp311-macosx_11_0_arm64.whl (239.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bitbully-0.0.70-cp310-cp310-win_amd64.whl (466.6 kB view details)

Uploaded CPython 3.10Windows x86-64

bitbully-0.0.70-cp310-cp310-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bitbully-0.0.70-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (342.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.70-cp310-cp310-macosx_11_0_arm64.whl (238.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file bitbully-0.0.70.tar.gz.

File metadata

  • Download URL: bitbully-0.0.70.tar.gz
  • Upload date:
  • Size: 8.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bitbully-0.0.70.tar.gz
Algorithm Hash digest
SHA256 9da278e83a8836920fffec5d034b4970572de4595be1437eeabd8c5f6a62af14
MD5 399d412b1a9171bb291a655d938999ec
BLAKE2b-256 080a09cb51cb5552280de8531019cf7fed7ef772e472b589af51ae0702545d68

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70.tar.gz:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-pp311-pypy311_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-pp311-pypy311_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 fa03f57b11acc6dd29c6a0d337bd8988709a75fe6422e9bb2d75a42ad5b0f61a
MD5 556b90be095d6444b6a421b7f3ab04c0
BLAKE2b-256 87d7546180b647984ee9ff197564293e064b771fec854ad8f2133fb524feb688

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-pp311-pypy311_pp73-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 663556d902175b7986b9d6faab5f4f4bf36dd8634b40ea572d15abc9e8e1c2f0
MD5 090da177e30cda23cf2c958dd92330b2
BLAKE2b-256 ae375b909997aa1844d896ca368c637c4755815a4fbc70a9a0b3d13fa2a4f50f

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-pp311-pypy311_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e686157b60dafce1221be5a82a0f6655f8c50ffd7241cad4a38622bbdae3242e
MD5 fdd74605737c53cbfe9853a8c0437efe
BLAKE2b-256 c714b078d258c4a5087fb3fc2b4e0edb054adea2045797cb98726cf061eecea6

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-pp311-pypy311_pp73-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-pp310-pypy310_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-pp310-pypy310_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 5712237ba6ff494ca99f3ac94f1e9cce14c993989aa2e3932c04023761547213
MD5 a5d03862224d1f7edd9269fde2585c19
BLAKE2b-256 d1f248e63f9173f0915607e21540e134d1e02b81c5fcba5d503b1fb66094a9c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-pp310-pypy310_pp73-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a94b1305c6790ce8852d7f19ce7461ba9292f7a035347f4cb5fb2e1f4b0d953e
MD5 9b70b5ffa3426ccbfee3997803c7b620
BLAKE2b-256 1c0ee2c0e443fb1f69ca8fa67e827e727af5c198845b5853fb5412fade3fdf1f

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-pp310-pypy310_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-pp310-pypy310_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c959f1eb31789bc7a0d14d60eb38e6d3170323bab1fbabfe97ef28ac881279a
MD5 3f2ff9cce329dfa7852068ed5bbb5a26
BLAKE2b-256 6316cdecd3a22728e538e263963393744f068c98f9379a584994744910236b5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-pp310-pypy310_pp73-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: bitbully-0.0.70-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 468.7 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bitbully-0.0.70-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5342452a0d8f75cf07b101d2846a3db6965c40875d13e79d3fd6c9936471470a
MD5 9f6aa653ff2e8440b65a313cc592ee14
BLAKE2b-256 e3d06c9d4434fe88aaa9fd5d0309da80b125100c1f5e3146b729bc8091eb301c

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp313-cp313-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c4f5fd5eddba515327b428f2cedd7ba2198834306e8bf5e5b83f3d79a776784f
MD5 dfec5d615b7a40faf739aff2cf770cb1
BLAKE2b-256 64dc8a0884e987285b93df3f8fad800c42bf3e916066460bf3fa7c30323a6415

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7b5d58f1af628636c5deda9df394f48abb65754de2ddfbd95bfa9164c3c0f166
MD5 5fa8bb72354c4e0bf7567bee749f12b4
BLAKE2b-256 c051255a97f0b75caf279cb5326e0971759fca019cced5ab3eddf25218c9e425

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 99267c16143ecd92020e43f7a1fb4c375a5b9db7d5aa777b3f1221f1cb7562ea
MD5 7effae40318e48e8ef21f6ba7ae2007b
BLAKE2b-256 41b09439e27686ee8bfa6a7cb1ac39823931d6daa2febdc2fb1173493d88610b

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: bitbully-0.0.70-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 468.7 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bitbully-0.0.70-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fad26d49a993907e292f532666e106b620ba758feadfe07cf445a35194be8ba2
MD5 5bb57d4d1cfd3298160136aef409a89d
BLAKE2b-256 2516cd3128b333420d3066309f6712624caf5b21c7fcf408b2a3a7468db80f17

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp312-cp312-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7e335cc4b3496a37545e691ff184d71f165f035d1ff62cacf8d687705c2f0760
MD5 4792ea9d0923fc801ed5ed7ea02478e1
BLAKE2b-256 016c4eeb57e2a8faf1c3e00e6f35a02560f0cace3c504686a0d4860dcbd6ddd8

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 84a7025a3ba6a8ee708b719ccacab14e4420f9248090727296e89ba6b671249c
MD5 8d9ece450032199e77198919a078f422
BLAKE2b-256 885c849da292eba20b5fa4d71c6db927e7658712a2d4be1afb590a875a14819c

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ddc56f292919ed2a8187ed195c26daa7fe2c0a308e355727ec0cafa24ff4ded
MD5 4726e53e4c094b6a4e86a4b9dde70d5e
BLAKE2b-256 b3ed09a09b0d870c4d95d3eb49786191daf0939310ca83cf43082b0465061582

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: bitbully-0.0.70-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 467.9 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bitbully-0.0.70-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 06b11a739a46f89f0054008fa3b7a743e3ff9d08df38fb01290313250a446835
MD5 2655c67c5fc8724ba6dfc02e9817e5c0
BLAKE2b-256 a49390e0e0b8f32d18fde6b64769d5eec2718a63925393221cfe751508b84eaf

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp311-cp311-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1fab533952a756eeef7de4caec7eb72beeb0e5904fcb8ebf01f0da98eb56558c
MD5 1bb9ef6b059c715c4f0e1ff20c54ff83
BLAKE2b-256 d22c7d094682b1f1c0366b6a2faf733ad1513a6f503c3e79c209828635858743

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b716294961a62313179711ec946fcde2fd7dc919b7f9d9850388bd2dd5bf2f0e
MD5 4b0d9fefa60e501cd74b65bc08e1b391
BLAKE2b-256 b2935a6a043719f0aec9b50f3691385bc4732b35e50ba9b245d67b8e4c800473

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9f288986b3fed060bfbca888ef154cf2142f2d98b4e2c67c88ebcd4e689877ad
MD5 8138ca7214ddda06a4bdad2874d241ef
BLAKE2b-256 748f85e6793f3a4e07aea6cb6ea3b8b69cc6dd3ff8cc9d137531387bd44b6626

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: bitbully-0.0.70-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 466.6 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bitbully-0.0.70-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a8037a199b6557c9d2c93621592d65985d4667fe4833ad1c9f10b61ccbb4e5a6
MD5 ff9ab36663f21c1d9c5262fe4a5037b6
BLAKE2b-256 b0837c85efb712a007185c03cbed1337e8bead8d6ebca1d3accaf2d18a59e133

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp310-cp310-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f87531d35660d810968ca6ac0f27367b3960f14e7982dbe2a90166b5469d6c82
MD5 1e9ebae4cd692153062692cc96d2cf1c
BLAKE2b-256 4f30e15fb1edbead399180226485a119212bd4a7b5ff14eb70ed2c34f493d05d

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ff9318e97069f3fe3fde7704ec0ca90556e8bc9f8eeb440aefd01447766f61cd
MD5 7d58547ba53104cba869095f14d68c7d
BLAKE2b-256 648d14b9ffee74f6f9dc035aa9f2c1a369525466ff68296321e6c4b34b2bf673

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.70-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.70-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6180079faeba08d5c12214e384922c52da3e7f1f40ad819e66d9e7e305284124
MD5 a96f8a33e2cc791e7018c383c7794556
BLAKE2b-256 d8f2cb06cd770e41ec7e6f95d2700f81dbca66918b443e7047f58656fc2cb2a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.70-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page