Markov Algorithm Online Test Contestに参加しました。
きみはだれ?
競プロerです。一応Highest水コーダーです。
これはなに?
AtCoderの社員かつレッドコーダーのすぬけさんが作ったマルコフアルゴリズムで遊ぶサイトMarkovAO : Markov Algorithm Onlineがあります。
昨日(2020/05/07)ついにMarkovAO最初のコンテストTest Contestが開催されたので参加しました。
たのしいので感想を書きます。
10問中6問しか解けず137位でした。 しかし、自分の発想と問題が噛み合ったのでMod 3のTop Player(初めて最小行のコードを提出した人)になれました。
ネタバレあり。
#0016 Min
Line 1 Best 1
6文字を5文字に置換します。 置換できなくなったら停止する。
oooooo:ooooo
0: ooooooo 1: oooooo 2: oooo
#0017 Max
Line 2 Best 2
5文字になるまで先頭にo
を追加して、5文字になったら何も置換せずに停止します。
もし1行目と2行目を逆にすると、永遠に1行目の置換規則が適用されてしまいます。
コードの後ろの方の置換規則で先頭に何か文字を追加する処理は典型のようで、いくつかの問題で使われます。
序盤の問題ですが、かなり難しいです。
ooooo::ooooo :o
0: oo 1: ooo 2: oooo 3: ooooo 4: ooooo
#0018 Win Draw Lose
Line 7 Best 7
まずxo:ox
で文字列をソートします。
(よく考えればxo:ox
→xo:
でよかった)
ox:
でo
かx
の多い方が残ります。
答えを回答するためにoo:o
,xx:x
で残った文字の文字数を1つにして回答して停止します。
xo:ox ox: oo:o xx:x o::win x::lose ::draw
0: xoxoo 1: oxxoo 2: oxoxo 3: ooxxo 4: ooxox 5: oooxx 6: oox 7: o 8: win
#0019 Sort 2
Line 5 Best 5
答えは必ず12345
なので1234
を空文字列に置換したあと5
を12345
に置換して停止します。
ギャグ。
1: 2: 3: 4: 5::12345
0: 31425 1: 3425 2: 345 3: 45 4: 5 5: 12345
#0020 Dot
Line 13 Best 12
最初の置換で....
を先頭において、その後すべての要素をなめるように置換して停止させました。
こういう問題は最初の置換でダミー文字を挿入して最後に消すのが典型のようですが、ダミー文字の代わりに.
を複数置いてみました。
- 各要素を置換する。
- ダミー文字を取り除いて停止させる。
- ダミー文字を先頭に挿入する。
...0:.0... ...1:.1... ...2:.2... ...3:.3... ...4:.4... ...5:.5... ...6:.6... ...7:.7... ...8:.8... ...9:.9... ...: ..:: :....
0: 3141592 1: ....3141592 2: ..3...141592 3: ..3.1...41592 4: ..3.1.4...1592 5: ..3.1.4.1...592 6: ..3.1.4.1.5...92 7: ..3.1.4.1.5.9...2 8: ..3.1.4.1.5.9.2... 9: ..3.1.4.1.5.9.2 10: 3.1.4.1.5.9.2
#0023 Mod 3
Line 5 Best 5 Top Player
Win Draw Loseと同じ解き方ができると考えて次のコードを書きました。
0
はすべて消去。12
をソートしつつ11
,22
を置換。
最後に1
,2
,12
が残る。もし12
なら0
に置換して停止。
0: 11:2 22:1 21:12 12::0
しかし、このコードは入力が0
のときにWAする。
0
を空文字列ではなく12
に置換すればいいとひらめいて終了。
Top Playerになれました。
0:12 11:2 22:1 21:12 12::0
0: 01210 1: 121210 2: 1212112 3: 121222 4: 12112 5: 1222 6: 112 7: 22 8: 1
upsolve
2020年6月28日追記
本番で解けなかった問題やります。
#0022 Mode
Line 11 Best 8
解法はこうです。
abc
をまとめて消す。- 1,2種類の文字が残る。
- 残った2種類の文字を1組ずつ消す。
- 1種類の文字が残る。
- 回答のため、残った1文字が2つ以上あるとき、1つにする。
ab
を#
に変換して#c
を消すことでabc
をまとめて消した。
ランダム文字列未使用(Line 12)
ba:ab ca:ac cb:bc #c: #b:b# #: ab:# ac: bc: aa:a bb:b cc:c
ランダム文字列使用(Line 11)
ba:ab ca:ac cb:bc bbbbbbbbbbbbbbbbbbbc: bbbbbbbbbbbbbbbbbbb: ab:bbbbbbbbbbbbbbbbbbb ac: bc: aa:a bb:b cc:c bbbbbbbbbbbbbbbbbbb
#0024 Min digit
Line 11 Best 8
括弧列テクでMaxを取れます。 問題をMaxを取る問題と読み替えて、括弧列テクでMaxを取ります。
5:() 4:(()) 3:((())) 2:(((()))) 1:((((())))) )(: ((((())))) ::1 (((()))) ::2 ((())) ::3 (()) ::4 () ::5
#0025 Balanced
Line 5 Best 5
正しい括弧列ならば、()
を消していけば括弧がなくなります。
そうでないなら、残った括弧を消してnoに置き換えます。
(
を全部)
にして重複を消して行きました。
もし)
を全部(
にしたとすると、文字列を変換中に正しい括弧列になってしまう可能性があります。
(): (:) )):) )::no ::yes
#0026 Divide in half
Line 7 Best 7
カーソルs
を2つ進めるたびにカーソル|
を1つ進めます。
s
が1つ進むたびにx
を起きます。
x
が2つあれば|
を1つ進めます。
x=00000000000000000(0を17個)
に置き換えることで、規則を減らせます。(ランダム文字列テク)
ランダム文字列未使用(Line 8)
|xx0:0| |xx1:1| 0x:x0 1x:x1 s0:x0s s1:x1s s:: :|s
ランダム文字列使用(Line 7)
00000000000000000 |00000000000000000000000000000000000:0| |00000000000000000000000000000000001:1| 100000000000000000:000000000000000001 s0:000000000000000000s s1:000000000000000001s s:: :|s
Note
Test Contestの解説放送はこちらです。 https://www.youtube.com/watch?v=Pgf2cO9iz44
マルコフアルゴリズムのIDEです。 https://southball.cc/markov-ide/
ちなみにスマートフォン版ではサイトの下に問題、コンテストへのリンクがあります。
追記 その後今は右上にハンバーガーメニューが追加されましたが。