自分用メモ

プログラミングとかのメモを書きたいです

Unity触ってみた(五目並べ)

まとめ

このサイトにそってUnityで五目並べを作ってみた。 【Unity 入門】2時間で作る五目並べゲーム! – XR-Hub

ポイント

手取り足取り書かれたサイトではないけれど、自分は以前に少しUnityについて勉強したことがあったので、五目並べが動くところまで作れた。

作ったGameObject(Textなど)をソースコードのpublic変数にアサイン(ドラッグ&ドロップ)するときにちょっとハマったのでメモ。

  • GameObjectをソースコードアサインするところ
    • ソースコードを選択して右のインスペクタに設定したくなるけど、ソースコードをクリックして出てくる画面にはドラッグ&ドロップできない。ヒエラルキーにあるGameController(ソースコードとリンクしている)の方をクリックして、そのときのインスペクタに対してドラッグ&ドロップする。
    • WebGLは日本語フォントをちゃんと入れないと日本語が出ない。とりあえず英語にした。

GameObjectをソースコードアサイン:失敗 f:id:ebinafactory:20211107160256p:plain

GameObjectをソースコードアサイン:成功 f:id:ebinafactory:20211107160724p:plain

Github for Unity

Github for Unityというのも使ってみた。これについては下記の記事を参考にした。 【超初心者向け】Unityのプロジェクトを、GitHub for Unityを使って超簡単にバックアップする方法 - Qiita

「おまけ」部分を見逃していて、リモートリポジトリ側にPublishする部分は適当な感じの別手順でやった。 自分のやった手順:github側にリポジトリ(GOMOKU)を空で作成しておいて、下記の赤部分だけ入力。

f:id:ebinafactory:20211107161425p:plain
Github for Unity

VSCode+Pythonのリモートデバッグ:その2

下記で書いたptvsdよりも簡単な方法があった。ソースコード側への修正は不要になる。 VSCode+Pythonのリモートデバッグ - 自分用メモ

使うもの

github.com

使い方

使い方は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)

  1. pythonスクリプトにptvsdのコードを追記する。
  2. pythonスクリプトを実行する
    • 指定されたポートを開いて、デバッガがつなぎに来るまで待つ
  3. VScode からアタッチする

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以下が終わった

最近の競プロのブームによって平均レベルが上っているような感じがするのと、競技プログラミングを1年以上サボっていて実力が落ちた感もあって、 このままでは水色維持なんてとてもじゃないけど無理だ・・・と思ったので、競プロ典型90問によってトレーニングを始めてみた。

それと同時にブログにも競プロをとといたメモを残し始めた。とりあえず、今日★4以下が完了したので自分を褒めてあげたい。

次は★5を順にやってみるかな。たぶん解けないんじゃないかな・・・。

競プロ典型 90 問 - AtCoder

競プロ典型 90 問:085 - Multiplication 085(★4)

問題

atcoder.jp

挑戦結果

  • 挑戦日: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)

問題

atcoder.jp

挑戦結果

  • 挑戦日:2021/11/03
  • 結果:解けた
  • 時間:20分ぐらい

考えたこと

  • ????ox????となっていたら、 lはoか左の?部分から何を選んでもいいし、rはxか右の?部分から何を選んでもいい
  • lを各字に固定して、lの右で一番近い別文字を見つければ良さそう
  • Nの大きさが \mathcal{O} (10 ^ 6)と大きいので、lをなめるループ&右の別文字を探すとまずそう。 \mathcal{O} (10 ^ {12})とかになる。
  • 同文字はまとめてしまえば良さそう。「ooxo」を「("o", 2), ("x", 1), ("o", 1)」のようにする感じで持っておけば、配列の隣の要素が別文字になっている。

公式解説

https://twitter.com/e869120/status/1412179495868534784/photo/2

解説を読んだふりかえり

  • 「ooxo」を「("o", 2), ("x", 1), ("o", 1)」にすることを、ランレングス圧縮とよぶ。
  • 解説の解法は自分とはちょっと異なり、一文字になってしまうパターンを求めて、全体から引くだった。言われてみればそのほうがシンプルな気がする。
  • たとえば、「ooxo」の場合、
    • 全体は  {}_{4} C _ {2}=6 個。
    • 一文字になってしまうパターンは、先頭のoo部分から選ぶ場合で   {}_{2} C _ {2}=1 個。
    • 答えは差をとって  5

ソース

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)

問題

atcoder.jp

挑戦結果

  • 挑戦日:2021/11/03
  • 結果:解けた
  • 時間:2時間ぐらい

考えたこと

  • i桁の整数単位で計算すれば良さそう
  • 解法は5分ぐらいで思いついたけど、実装やデバッグがうまく行かなかった・・・。

公式解説

https://twitter.com/e869120/status/1411094412319330305/photo/1

解説を読んだふりかえり

  • 大方針としての考え方はあっていた。
  • 実装に苦労したのは、下記のような考え方に気が付かなかったからか。。。
    •  E_{i}=f( \min ( 10^{i}-1) ,R) -f( \max ( 10^{i-1},L) -1)
    • f:id:ebinafactory:20211103151454p:plain
  • 一応解けたけど、これは後日もう一度やってみよう。

ソース

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)