Unity触ってみた(五目並べ)
まとめ
このサイトにそってUnityで五目並べを作ってみた。 【Unity 入門】2時間で作る五目並べゲーム! – XR-Hub
ポイント
手取り足取り書かれたサイトではないけれど、自分は以前に少しUnityについて勉強したことがあったので、五目並べが動くところまで作れた。
作ったGameObject(Textなど)をソースコードのpublic変数にアサイン(ドラッグ&ドロップ)するときにちょっとハマったのでメモ。
Github for Unity
Github for Unityというのも使ってみた。これについては下記の記事を参考にした。 【超初心者向け】Unityのプロジェクトを、GitHub for Unityを使って超簡単にバックアップする方法 - Qiita
「おまけ」部分を見逃していて、リモートリポジトリ側にPublishする部分は適当な感じの別手順でやった。 自分のやった手順:github側にリポジトリ(GOMOKU)を空で作成しておいて、下記の赤部分だけ入力。
VSCode+Pythonのリモートデバッグ:その2
下記で書いたptvsdよりも簡単な方法があった。ソースコード側への修正は不要になる。 VSCode+Pythonのリモートデバッグ - 自分用メモ
使うもの
使い方
使い方はptvsdと似ている。 python実行するとデバッガが接続しにくるまで待つので、VScodeのデバッガで接続しにいく。
①プログラムを起動時に下記のようなオプションをつける。
python3 -m debugpy --listen localhost:5678 --wait-for-client hogehoge.py
②VSCodeでリモートアタッチする
前回と同じでOK。launch.jsonは下記のような感じ。
{ // IntelliSense を使用して利用可能な属性を学べます。 // 既存の属性の説明をホバーして表示します。 // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Python: アタッチ", "type": "python", "request": "attach", "connect": { "host": "localhost", "port": 5678 }, "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "${workspaceFolder}", } ] } ] }
VSCode+Pythonのリモートデバッグ
追記:もっと良い方法があった。こっちだとソース修正が不要になる。→ VSCode+Pythonのリモートデバッグ:その2 - 自分用メモ
HTTF2022のようなマラソンマッチでは、作成したpythonスクリプトを別プログラムからキックすることになることが多い。 普段のようにVSCodeから実行する場合は、ブレークポイントを仕掛けたりエラー箇所で停止して変数を見れたりするけれど、別プログラムからキックされている場合はそんなことはできないので困る。
このようなときにどうすればよいのか?を調べて見つけたのでメモする。
なお、この手順はWindows10のWSL2のUbuntu上のpython3で行っている。 VSCodeについては、Windows上で動いているけどRemote機能をつかってUbuntu接続している。
やること
事前準備:ptvsd をインストール(pip install ptvsd)
Pythonコードに追加
コード例
pythonスクリプトの先頭の方に追記するもの
import sys # デバッグ用(引数にdebugがあればptvsdでデバッグする) if (len(sys.argv) > 1) and (sys.argv[1] == "debug"): import ptvsd print("## [debug mode] waiting for debugger attach (port:5678)", file=sys.stderr) ptvsd.enable_attach(address=('0.0.0.0', 5678)) ptvsd.wait_for_attach() print("## [debug mode] debugger was attached", file=sys.stderr)
VScodeのアタッチの設定例
{ // IntelliSense を使用して利用可能な属性を学べます。 // 既存の属性の説明をホバーして表示します。 // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Python: アタッチ", "type": "python", "request": "attach", "connect": { "host": "localhost", "port": 5678 }, "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "${workspaceFolder}", } ] } ] }
競プロ典型90問の★4以下が終わった
競プロ典型 90 問:085 - Multiplication 085(★4)
問題
挑戦結果
- 挑戦日:2021/11/03
- 結果:解けた
- 時間:30分
考えたこと
- 約数を列挙して、permutationで組み合わせを全パターン列挙。やってみたけどTLEだった。
- ライブラリ化していた約数列挙のアルゴリズムのような感じで、a,bを決めてしまい、cは自動的に決まるような形ができそうだと思った。
公式解説
https://twitter.com/e869120/status/1412541885160189952/photo/2
解説を読んだふりかえり
- 解説が自分が考えたり、失敗した内容をだいたい盛り込んでいた。
- 自分は約数を求めながらループを回したけど、実装例の用にやると約数を列挙してから求めることもできるのか。次はそっちで解いてみたい。
ソース
from itertools import permutations K = int(input()) ansset = set() a = 1 while a * a * a <= K: b = a while K % a == 0 and a * b * b <= K: if K % (a * b) == 0: c = K // (a * b) if a <= b <= c: ansset.add((a,b,c)) b += 1 a += 1 print(len(ansset))
競プロ典型 90 問:084 - There are two types of characters(★3)
問題
挑戦結果
- 挑戦日:2021/11/03
- 結果:解けた
- 時間:20分ぐらい
考えたこと
- ????ox????となっていたら、 lはoか左の?部分から何を選んでもいいし、rはxか右の?部分から何を選んでもいい
- lを各字に固定して、lの右で一番近い別文字を見つければ良さそう
- Nの大きさがと大きいので、lをなめるループ&右の別文字を探すとまずそう。とかになる。
- 同文字はまとめてしまえば良さそう。「ooxo」を「("o", 2), ("x", 1), ("o", 1)」のようにする感じで持っておけば、配列の隣の要素が別文字になっている。
公式解説
https://twitter.com/e869120/status/1412179495868534784/photo/2
解説を読んだふりかえり
- 「ooxo」を「("o", 2), ("x", 1), ("o", 1)」にすることを、ランレングス圧縮とよぶ。
- 解説の解法は自分とはちょっと異なり、一文字になってしまうパターンを求めて、全体から引くだった。言われてみればそのほうがシンプルな気がする。
- たとえば、「ooxo」の場合、
- 全体は 個。
- 一文字になってしまうパターンは、先頭のoo部分から選ぶ場合で 個。
- 答えは差をとって
ソース
N = int(input()) S = input() # 「ooxo」を「("o", 2), ("x", 1), ("o", 1)」のようにする # 現在の色 cur = S[0] length = 0 L = [] for c in S: if cur == c: length += 1 else: L.append((cur, length)) # 色がかわる cur = c length = 1 # 最後のやつも忘れずに入れる if length > 0: L.append((cur, length)) # L[i] = (c, num)としたとき、 # このL[i]のnum個のどれかを、lとして選んだとする。 # rはL[i+1]以降なら何を選んでもOK。 # 現在位置を覚えておく curidx = 0 ans = 0 for i in range(len(L)): num = L[i][1] curidx += num # lはnum個から選んでOK、 rは(N-curidx)個から選んでOK ans_sub = num * (N - curidx) ans += ans_sub print(ans)
競プロ典型 90 問:082 - Counting Numbers(★3)
問題
挑戦結果
- 挑戦日:2021/11/03
- 結果:解けた
- 時間:2時間ぐらい
考えたこと
- i桁の整数単位で計算すれば良さそう
- 解法は5分ぐらいで思いついたけど、実装やデバッグがうまく行かなかった・・・。
公式解説
https://twitter.com/e869120/status/1411094412319330305/photo/1
解説を読んだふりかえり
- 大方針としての考え方はあっていた。
- 実装に苦労したのは、下記のような考え方に気が付かなかったからか。。。
- 一応解けたけど、これは後日もう一度やってみよう。
ソース
L,R = [int(x) for x in input().split()] MOD = 10**9 + 7 ans = 0 # 各桁(i桁)で集計する。 for i in range(1, 20): # a~bの個数を後で計算する。 # LやRが関係しなければ、a=10**(i-1), b=(10**i)-1。 isCalc = False if L <= 10**(i-1) and (10**i)-1 <= R: a,b = 10**(i-1), (10**i)-1 isCalc = True elif 10**(i-1) <= L and R < 10**i: a,b = L,R isCalc = True elif 10**(i-1) <= L < 10**i: a,b = L, (10**i)-1 isCalc = True elif 10**(i-1) <= R < 10**i: a,b = 10**(i-1), R isCalc = True # a~bについて計算。i桁なのでiをかける。 if isCalc: sub = (a+b) * (b-a+1) //2 ans += sub * i ans %= MOD print(ans)