This is the package for the Software-Challenge Germany 2023. This Season the game will be 'Hey, danke für den Fisch' a.k.a. 'Penguins' in short.
Project description
Python Client for the Software-Challenge Germany 2024
Be warned! This package is currently experimental and has still a few known bugs. But please try it out and let us know if anything comes up.
Hey there! To help you out, it's best to start by checking out the documentation for this client before you ask any questions or open an issue. It'll provide you with some helpful information!
This repository contains the Python package for the Software-Challenge Germany, a programming competition for students. The students have to develop an artificial intelligence that plays and competes against other opponents in an annually changing game.
This year it is the game Mississippi Queen.
Table of Contents
Installation
Two methods are presented here to install the socha
client.
The first one is the fastest to get started right away.
However,
this method will not make it possible to run your player in the competition system,
since there is no Internet connection that allows you to download packages.
Therefore,
the possibility of a virtual environment is presented,
which installs the packages inside the folder.
Pleas make sure that you have at least Python 3.10 installed. Check with
$ python -V
or$ python3 -V
.If not present you can install python with the following commands:
- Windows:
> winget install -e --id Python.Python.3.10
- Debian:
$ sudo apt install python3.10
- Arch:
$ sudo pacman -S python
Globally
The installation is quite simple with pip.
$ pip install socha
If you want to install the package manually, then you have to download the release of your choice, unpack the package
and then run setup.py
with Python.
$ python setup.py install --user
This should satisfy the dependencies and you can start right away.
Virtual Environment
To create a virtual environment, you should first create a directory in which you want to develop your player and than enter that directory.
$ mkdir my_player
$ cd my_player
Now you can create the virtual environment (venv).
$ python -m venv venv/
This takes a moment. After the venv is created, you can open it.
On Linux:
$ source venv/bin/activate
On Windows:
> Set-ExecutionPolicy Unrestricted -Scope Process
> .\venv\Scripts\activate
It should open the venv and you can now install packages and run your scripts here.
To develop your player you just have to install the package socha with pip
.
(venv) $ pip install socha
This should satisfy the dependencies and you can start right away.
Getting Started
If you want to start with the Software-Challenge Python Client, you have to import some dependencies first.
The following are all possible imports which are available. You won't need every, but for the sake of completeness all are listed.
from socha import Accelerate, AccelerationProblem, Advance, AdvanceInfo, AdvanceProblem, Board
from socha import CartesianCoordinate, CubeCoordinates, CubeDirection, Field, FieldType, GameState
from socha import Move, Passenger, Push, PushProblem, Segment, Ship, TeamEnum, TeamPoints, Turn, TurnProblem
from socha.api.networking.game_client import IClientHandler
from socha.starter import Starter
If you now want to develop and implement your logic, then the structure of the class should look like this.
class Logic(IClientHandler):
gameState: GameState
def calculate_move(self) -> Move:
return Move([Advance(1)])
def on_update(self, state: GameState):
self.gameState = state
The above example is the simplest working Logic you can build. As you can see the Logic must inherit from
the IClientHandler
, so that you can overwrite its methods and the api knows where to find your logic.
If you're done with your version of an working player, than you have to finish your file with this function, where you call the Starter with your desired arguments. The following starts the client with the default arguments.
if __name__ == "__main__":
Starter(Logic())
If you want a complete file as an example, you can take a look at this
logic.py
.
Start arguments
If you want to run your logic from the console, you can of course pass start arguments.
Note that any arguments passed as startup parameters will override those in the code, including the ones you set yourself.
Command | Description |
---|---|
--help | Prints the help message. |
-h, --host | The host to connect to. The default is 'localhost'. |
-p, --port | The port of the host. The default is 13050. |
-r, --reservation | Reservation code for a prepared game. |
-R, --room | Room Id the client will try to connect. |
-s, --survive | If present, the client will keep running, even if the connection to the server is terminated. |
-l, --log | If present, the client will write a log file to the current directory. |
-v, --verbose | Verbose option for logging. |
--auto-reconnect | Automatically reconnect to the server if the connection is lost. |
-b, --build | Builds this script into a package with all its dependencies. |
Preparing Your Player for the Competition
To ensure that your player is usable for the competition system, you need to download all the dependencies that your client uses because the system will run on a docker container without access to the internet and sudo permission.
The package has made things easier for you! You can use it to handle almost everything by itself. All you need is a
requirements.txt
file that lists all your dependencies. To start, simply run the following command in your terminal:
$ python <your_main_script>.py --build <your_directory_name>
This will trigger the package to do its magic and build your project.
If you want to do it manually, follow the steps below to download the dependencies:
- Open your terminal or console wherever you want to create your directory that you will upload.
- Type
mkdir my_player
to create a new directory namedmy_player
. You can name yours whatever you want. - Enter the directory using
cd my_player
. - Run the command:
pip download socha xsdata==22.7 -d dependencies
in the directory. This command downloads the dependencies you need into the folderdependencies
. - Ensure to add all your dependencies that your client uses.
- After the download, create a last directory using
mkdir .pip_cache
.
Once you have downloaded all the dependencies,
you need to create a shell script that uses the contest system as the entry point for your player.
It must be named start.sh
and must be on the top level of your directory; otherwise, it cannot be found.
Follow the steps below to create your shell script:
-
Ensure that you create your shell script in a UNIX-Environment, or if you use Windows, you can do this with WSL or Notepad++. If you use Notepad++, you need to go to Bearbeiten->Format Zeilenende->Unix(LF). This step ensures that your line endings are
LS
only withoutCR
, which may cause problems on the contest system. -
Ensure that your shell script has the following structure:
#!/bin/sh
# Exit immediately if any command fails
set -e
# Sets the environment variable, which specifies the location for pip to store its cache files
export XDG_CACHE_HOME=./my_player/.pip_cache
# Sets the environment variable, which adds the directory to the list of paths that Python searches for modules and packages when they are imported.
export PYTHONPATH=./my_player/packages:$PYTHONPATH
# Install the socha package
pip install --no-index --find-links=./my_player/dependencies/ ./my_player/dependencies/socha-1.0.1-py3-none-any.whl ./my_player/dependencies/xsdata-22.7-py3-none-any.whl --target=./my_player/packages/ --cache-dir=./my_player/.pip_cache
# Run the logic.py script with start arguments
python3 ./my_player/logic.py "$@"
- Ensure that you add all your dependencies that your client is using to this script.
Once you have created your shell script, you should have a directory structure that looks like this:
my_player/
├── .pip_cache/
├── dependencies/
├── logic.py
└── start.sh
The my_player
directory or whatever you named yours just needs to be packaged as a ZIP archive,
and your player is ready to be uploaded. Congratulations! 🥳🎉
Local Development
🏗️ This part is currently still unfinished and subject to change.
This package was mostly written in Rust, which gives a significant performance boost compared to a natural Python program. However, this leads to considerable effort, as so-called bindings have to be created. These allow Python to access the functions in Rust. To realize this, PyO3 is used here with the help of Maturin.
If local development is desired, the following things must be installed beforehand:
- Rust Compiler with Cargo,
- Python 3.10 or later,
- and Maturin in a virtual environment in this repository.
If everything has been installed successfully, then the command maturin develop
must be executed in a virtual environment.
Now you can use a logic written in Python and make changes in the Rust code. Each time a change is made, maturin develop
must be executed again to make the change visible to the Python code.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for socha-2.0.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dcef19df8ffa0d88491deef48d8eb702e696dfaec45ee6d1f72351dcaa83f26b |
|
MD5 | 7d93c82a0b7e5f37c8614ceced435e89 |
|
BLAKE2b-256 | 207965465b2bde765ea1cee0495bc91bbf3a0c629a281218d87f7e55a64fa117 |
Hashes for socha-2.0.4-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | be2ba29ffa26de7b51a449202a95299779a6e0fe758c2f87d7dc19d2c8606614 |
|
MD5 | 0e1945b88c4bf1dcf102d3bad934a739 |
|
BLAKE2b-256 | b12d74876f2709399fa88f85637969fec061461b7284da61c8d5a9df51bf5f79 |
Hashes for socha-2.0.4-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5fba179d079f6944c5d02639358a59512b7cba388fb715561db38b967be16a3e |
|
MD5 | 12bd2fce050c121ee6953362ec82e64c |
|
BLAKE2b-256 | 1668a56c5da68175bd8c67c92b1000e4410831b68773d2051e09525d9dd8ad49 |
Hashes for socha-2.0.4-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bd47657ac50ebc08a2efae8fa8bde4de77d91bfb39502707721649bf70ca5f54 |
|
MD5 | 9271b3cf2aa8bfed82448d4af997c99d |
|
BLAKE2b-256 | 9dd51b54b3725751f52b6cb511d612bb77920318f5e7bb7cfa070a4dc32fdb4f |
Hashes for socha-2.0.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 478e04099e4074ef4d2fb911f279cd3c409eb2f38df185c95bb6f594007f0a3d |
|
MD5 | ff579646379de92f361c04fe09710389 |
|
BLAKE2b-256 | 216e44b69a70c0792071479182b8e80744085d2da1126c16bcffd9b22d6385e3 |
Hashes for socha-2.0.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e3896c58708052a2ba6a738071ddf464f5191332bc8e33db243e97dd0e115191 |
|
MD5 | b3e5fc2aba18f3eb321af734fc63df47 |
|
BLAKE2b-256 | 5ef9ffa29a92d246f9eaeb38d66cbb5e826a6251538a3f6233d5ef176f3801f8 |
Hashes for socha-2.0.4-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8d1afe11b9655d76622186fcc3fb37f9d6ccd990e5effd7df2a4153a090c5af0 |
|
MD5 | de4defe8f42faf0d649eeb76ff49f79a |
|
BLAKE2b-256 | 5c3295aedd8d9004fb3903b4975058dd4c5fbe810a68da6ff648d4abee3dbd8b |
Hashes for socha-2.0.4-cp312-none-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 78e1cb510360f813b9b6538dbdedfe23e54b038cfc7275fc0d67c2a63b2bcbc4 |
|
MD5 | 9d657114165d724b3cb465b36d67eee4 |
|
BLAKE2b-256 | b45b4087ab893cd1cbafb7d79caecb7769d4410002a05fc9d3725274e7df8e35 |
Hashes for socha-2.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0960dc07303268a0da38da16289530ceea8fb0d8d4a745c4e8250eeaa93ebd13 |
|
MD5 | 316494a5921e99e0af1e7bc9af533389 |
|
BLAKE2b-256 | b74739840f6da4dbc943c635ef6c98c02ab82b9e2fe5da35037ac6cc20a7a808 |
Hashes for socha-2.0.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9a7acb2f9856df3fce7186308b770dc0b3c2f3cec2a455d7dc35e5e6327e935a |
|
MD5 | 1588e5d0c05cc007f30789c41c4558a0 |
|
BLAKE2b-256 | 2a5caf0582213fa85331731c0854ae8de4f536c4517d04afd370e7d98fcc502b |
Hashes for socha-2.0.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 82f1705a48dddf8cb01764c93d47f2f051f8a5b43710cb77db2ff8a5a12cfcba |
|
MD5 | d79b23c6f3dc733d35ed70cf2eda4a73 |
|
BLAKE2b-256 | 4803e5ebd558c608003e81c7e580780fe9395748ca3e0c2312ea7e3cfdcf46b4 |
Hashes for socha-2.0.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d917d0d90caaf5ee2072edc5ad47f8f620778a1725ee5c9b50a9a81770c05c27 |
|
MD5 | 051878de7cc73341eb388e30014071e7 |
|
BLAKE2b-256 | f06d88949a960ec83f4eff9ad176b6711bc081f5940b72080929b39d88b8334f |
Hashes for socha-2.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 010e58babb12f1b6caca2b4342559135d60dfc40880905ef165e8f893f8008c5 |
|
MD5 | ae7dac9b5f47958a1ab20e96e1dd6157 |
|
BLAKE2b-256 | 976833c25cf4143fa25df391d7c44164ec9a275a276e013d0d7849915383d4d1 |
Hashes for socha-2.0.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 40fbb45b2833e14f4766557d3dd43d286213bd92a38e53d7d23d48d8d975e7f3 |
|
MD5 | 39ca513e7d9c482cc46190a60343422b |
|
BLAKE2b-256 | af5d6c3b4efa338ef3934fd8987fb8903a13726db7eee876be2bd5782595fa57 |
Hashes for socha-2.0.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 33e1f26eb94972b2916fea49a9486dc5ff1705439c32e2decff7e5024331ec52 |
|
MD5 | 297be46be996d85cb1c8661ddfb621e7 |
|
BLAKE2b-256 | 0f52a1742b06e0b735bb2f12026047713be97a369f51ef47b3eb3cc39a4ec1d5 |
Hashes for socha-2.0.4-cp312-cp312-macosx_10_7_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a81da1a980721f981c8c86b32ab39834623fa1b33d6bd2c2d74b6a7738847567 |
|
MD5 | 97f9f356498e850214e0be730157f2e8 |
|
BLAKE2b-256 | 20e100910204b5bbe42f978211f8b2b4fd4b2c043bc787e02c5d44f86c975710 |
Hashes for socha-2.0.4-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 27c7f90a477a4baf8488be3dc21e48265b11ded31011dbb9152a113f5cb17194 |
|
MD5 | 4640a478d85cfe47152bfdd4ed51db3b |
|
BLAKE2b-256 | 65b9d30368250256317f53bbae3aa90c303f427bfcdfea7df3f10d87a81e5662 |
Hashes for socha-2.0.4-cp311-none-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 30f6abe3662d8ff0cbe0cf819d5b18f19d4b09556564ca50f13a097b71eb22aa |
|
MD5 | 0033e259e46449ac27cf1d1574603bfd |
|
BLAKE2b-256 | 0a41e4dc9f1cd91e3a5e155532304986231af9708c28b5d10106a8d6fc7c0c59 |
Hashes for socha-2.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 05aa3d94a9ebc0bc022f3ef9e171befb4c3fab832f7e4c712c74efc2e93ad9af |
|
MD5 | b8983636fc10fd1d44e501c4788cd82c |
|
BLAKE2b-256 | fd1f99e30dcb8144e65a81d1810f5708bf6f972c320e4d516201387c921cdbdf |
Hashes for socha-2.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | acc71ff39d51462b36ceb61344373bbc841d57a21e148ad8a183454f86b71ea0 |
|
MD5 | d02dc8cd7297e9ced5487f5554889d0e |
|
BLAKE2b-256 | 03171ee31a021bdb6619c6417cd15d46ec74503917ff8b0eb13a23a154913b1d |
Hashes for socha-2.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1d28141976b796cdbab56d5d5904eb1194d7da2ec3135987d3ced9d19243be62 |
|
MD5 | 327003f2fe719092cc8eb731e3ffeb1b |
|
BLAKE2b-256 | b8596aacccd629dcd76738887c8cd6756959601de95cb365982c790966bf6cf7 |
Hashes for socha-2.0.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 54c3a4587ed2b4d616fdeef9bcc2cc7249656f30d8d7507f5176a6dd0d74a592 |
|
MD5 | f152c0cbc0b6f4a25d2f59da7cb373bd |
|
BLAKE2b-256 | 167977421b42c4e3acca3311bbdc06b9e9c16a8d1662811288aeb3fcb223b074 |
Hashes for socha-2.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1c409cb4d9adac7dc06a0c8436449d3cbc14243ac10a1f45ec10605f4ea86fbc |
|
MD5 | a7239def1503e25c53b076ba5ae8cd4f |
|
BLAKE2b-256 | 2cec1b4e245c24e09ee64eb9464e29312b46190812d5f93bb4ff3b47b4fb215f |
Hashes for socha-2.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2729c835523748fe043b7ccab2fd456b585a30fe38e2420d457e86030d5611e3 |
|
MD5 | 4a8eacc96e36fcf7f97e5b43abdffa28 |
|
BLAKE2b-256 | fda07fc5c6282efa93a1f66afd6bcd2b35859b7c6eacaf6a838f14909112aea7 |
Hashes for socha-2.0.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 292f306a001a66c6203f4b08db80d67451a798880c928559fcf5637bf37dc078 |
|
MD5 | a05d4c37517274abc00ac3673fef11b9 |
|
BLAKE2b-256 | c00da4e67e6bf21361589b15ea044fb3c33377e9ad10644c607b2a35d4a814fb |
Hashes for socha-2.0.4-cp311-cp311-macosx_10_7_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9df24d04573724e7f49f2a50357b6ef98cfee6238d3f8e11aa1ccf744a135ef4 |
|
MD5 | f053f9af6695fac1aee0f75fca106369 |
|
BLAKE2b-256 | 690040d95a0fe81c04a45ba20aee9786e39d354522417d3dc1c73c4b8e2f2127 |
Hashes for socha-2.0.4-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1f2fdae57495fe7bcbd4c131429ae801f9b7d2865de769012f3b9d9c85c5a46e |
|
MD5 | 89fc89e48a161adef07ad5782ea4fe8f |
|
BLAKE2b-256 | 90a0ae443c7163666aa7f5d39e89d034cc15be77c66cfe2a0d514cd683a2d07f |
Hashes for socha-2.0.4-cp310-none-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ac1d6620e3745e1cc93eb5cea5da2a5f9cd493ee157db87bd68e54a6afe023d1 |
|
MD5 | 15fa3ab4f1f3e228236fa4e8642e9f44 |
|
BLAKE2b-256 | 896d5abed377e6249765e6406cfe2f8c70ea0e5880d3f7283cca66b44ebbd5a0 |
Hashes for socha-2.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 950ac83f841b36a19be116e3c2a523db61b2217ceb81181117931c15f31b0968 |
|
MD5 | 66e64426ca9e7a7980870188019777a9 |
|
BLAKE2b-256 | 858630b283390b99f908ce6de20b1d41217fc21aabcae3cc26282522a55df370 |
Hashes for socha-2.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 29cebf3cddd6e34219beeea1757be8d298416a767628c7f097803ac20b4eccb6 |
|
MD5 | 934b939f4097eae71374e6e54f7541b4 |
|
BLAKE2b-256 | e42167c542ae351042c79cd3d98f1781548f29304e81a551856d821e7f5c0e43 |
Hashes for socha-2.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2f05d531e73c32b03ac7ef41edb51fcc8b07679b9ed77ee2dd3204fd025970b0 |
|
MD5 | fec25854da5052ac70eaef6fd72eecdd |
|
BLAKE2b-256 | 879ea2f006ba75b230132f8c1e464bd916f37c73d891cbbd04bd80e818a3f235 |
Hashes for socha-2.0.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c59c502d10aa0e8588576d9dda22d868f4d3aaf5c65da3135d60b4248a813e5 |
|
MD5 | b28172a2503f9324d3861e7bdcec107d |
|
BLAKE2b-256 | 1588c983f054b2391fc79192d4dfcbdb952f6b0b90682e6662958ba7629ee249 |
Hashes for socha-2.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b9ee81943c1dbe0ebf551ffde53a1956672005f0d66a356fc2c65d69a2b6399f |
|
MD5 | a7d44430175a75ea80c4fea1b935beab |
|
BLAKE2b-256 | 2604f94a85cdf6084b398ee765e2f1c4378ba9cafe5d2dfa5103aa0c0456e2ef |
Hashes for socha-2.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dc678acd968dac0d41fbe4a6a727214d453aedb1036f734e33d84c0b7b28fa43 |
|
MD5 | 7fb82d835562a190651b39d9a305bfcf |
|
BLAKE2b-256 | d48d37c0854bd76b513304b81e17c79db69a8166de2a72501f7e0cdceb6a2778 |
Hashes for socha-2.0.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f5c2c6cd7eafb12ee3f533554d964e909d82172b105d5954254e804a00ee5bce |
|
MD5 | 0af113e52b0b3df6a34b922df7127c6f |
|
BLAKE2b-256 | 9f1e7b1deb8e9e3e76ca30f3cd0c1868c2f69f18efafb239943c94310d7e7b08 |
Hashes for socha-2.0.4-cp310-cp310-macosx_10_7_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 225b663a84cfdad010c70c42f5f3fe3446fd12192779bf46352b79e031797aa1 |
|
MD5 | bffeb8be3d2c760039d1ef13d506debc |
|
BLAKE2b-256 | 6e63caae4e2d763a32b2e89d7b718f27dbfdff0e463c5d61fb838c17c520f6ea |