Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save kenkoooo/3647f6f73095eb2ced0cb3ba1feb03a3 to your computer and use it in GitHub Desktop.
Save kenkoooo/3647f6f73095eb2ced0cb3ba1feb03a3 to your computer and use it in GitHub Desktop.
#!/bin/bash
set -eu
# Topcoder MM の実行可能ファイルのパス
# 一時ファイルは /workdir に置くといいらしい
TEMP_PATH="/workdir/a.out"
rm -f submission.zip
cargo clean
# --target x86_64-unknown-linux-musl とすると、共有ライブラリに依存しない実行可能ファイルを作れる。
# いろいろ制限はあるが、競プロ目的であれば気にする必要はない。
cargo build --release --target x86_64-unknown-linux-musl
# 以下のようなPythonファイルを生成する。
# やっていることは単純で、BINにBase64文字列として入っている実行可能ファイルを書き出して、
# パーミッションを変更して、実行する。
#
# import base64
# import subprocess
# import os
# import stat
# BIN='${BINARY}'
# byte_array = base64.b64decode(BIN)
# with open('${TEMP_PATH}', mode='wb') as f:
# f.write(byte_array)
# st = os.stat('${TEMP_PATH}')
# os.chmod('${TEMP_PATH}', st.st_mode | stat.S_IEXEC)
# subprocess.call('${TEMP_PATH}')
BINARY=$(base64 -w 0 ./target/x86_64-unknown-linux-musl/release/super_minesweeper)
echo "import base64" > SuperMinesweeper.py
echo "import subprocess" >> SuperMinesweeper.py
echo "import os" >> SuperMinesweeper.py
echo "import stat" >> SuperMinesweeper.py
echo "BIN='${BINARY}'" >> SuperMinesweeper.py
echo "byte_array = base64.b64decode(BIN)" >> SuperMinesweeper.py
echo "with open('${TEMP_PATH}', mode='wb') as f:" >> SuperMinesweeper.py
echo " f.write(byte_array)" >> SuperMinesweeper.py
echo "st = os.stat('${TEMP_PATH}')" >> SuperMinesweeper.py
echo "os.chmod('${TEMP_PATH}', st.st_mode | stat.S_IEXEC)" >> SuperMinesweeper.py
echo "subprocess.call('${TEMP_PATH}')" >> SuperMinesweeper.py
# 提出用にzipする
zip -j submission.zip SuperMinesweeper.py
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment