かわわんの色々

気になったこと色々

AGC020 A Move and Win

AtCoderを始めたもののバイトの関係でコンテストに参加できずにいましたが,時間があったのでAGCにチャレンジしてみました.

目次!

結果

A問題だけACです.翌日,B問題もACしました.B問題についても別に書きます.

A : Move and Win

A - Move and Win

いくつかの具体例を試すとすぐに法則が見えました.10分弱だったと思います.

問題の設定

  • AliceとBorysがゲームをする
  • Nマスに区切られたテープがある.左から1,2,3,\cdots,Nと番号が振ってある
  • ゲームスタート時AliceとBorysはそれぞれこのテープの第Aマス,第Bマスにいる
  • 必ずAliceが先行でターンプレイヤーは右か左に1マスだけ進む
  • ターンプレイヤーが動きたいと思う方向に相手プレイヤーがいる場合,その方向に進むことはできない
  • ターンプレイヤーがテープの左端(右端)にいる場合,左側(右側)に移動することができない
  • ターンプレイヤーが左右どちらにも移動できなかった場合,そのプレイヤーは敗北する
  • プレイヤーは勝つために最適な行動をする

答えるべきもの

制約

  • 2 \leq N \leq 100
  • 1 \leq A \leq B \leq N

解説

僕がこの問題を解いたときの思考過程をなぞりながら書きます.

AliceとBorysの動き方のパターンはたくさんあるように思われます.

それを全て試すわけにはいかないので,コード書く前に紙に実際の例を書いて何か法則を見つけようと思いました.

N=2 のとき

もっとも単純な時です. f:id:kebobokawawan:20180116155100p:plain

先行のAliceはゲームのルールより左側にも右側にも進むことができません.

よってこのときはBorysが勝つのでテープの右側には"Borys"と書いています.

N=3 のとき

2番目に単純な時です.AliceとBorysの初期位置は3通り. f:id:kebobokawawan:20180116155121p:plain

真ん中のパータンの時は"Alice"が勝ちます.

N=4 のとき

AliceとBorysの初期位置は例えば以下のようなものがあります.そろそろ法則が見えてきます. f:id:kebobokawawan:20180116155128p:plain

どちらが勝つのか

ゲームを進行していってAliceのターン開始時に二人の位置が

Alice Borys

と隣り合ってしまったら"Borys"が勝ちます.

Alice 空きマス Borys

になる場合は“Alice”が勝ちます.

f:id:kebobokawawan:20180116155747p:plain

二人の初期配置によって勝敗が決まる

AliceとBorysの初期配置の空きコマが偶数の時.すなわち,

(B - 1 - A) \, \verb|%| \, 2\, ==\, 0

となれば"Borys"が勝ちます.

f:id:kebobokawawan:20180116160025p:plain

"Borys"が勝たないときは"Alice"が勝ちます.elseで書けばよいです.

以上より次のようなコードを提出しました.

Submission #1975697 - AtCoder Grand Contest 020

AtCoderでの標準入力(python3)

python3系で標準入力するとき用メモ.

AtCoder毎日してるわけじゃないので忘れがち.

ほかの人も書いてるだろうけど自分のブログだとアクセスしやすいので書くぞよ.間違ったこと書いてたことに気づいたらそっと直します.

文字列だけの入力

a = input()

input()はstr型の引数を持ちstr型のデータを返すので数値は入力できません.

一つの数値だけの入力

a = int(input())

input()はstr型になるっぽいのでそれをint()入れ子にしたらint型になるっていうのめっちゃ直感的で好き (中でどうやってint型にしてるのかはわからないけれど)

いくつかの数値を入力するやつ(個数固定1行で一気に入力Ver.)

こういうの

入力

  1. a b c

入力する個数は固定です.この例だと3個です.なので3個変数を用意して

a, b, c = map(int, input().split())

とします.

いくつかの数値を入力するやつ(個数不定複数行で入力Ver.)

こういうの

入力

  1. n

  2. a1

  3. a2 ...

  4. an

最初に,「これからくるデータの個数」を入力させて,そのあと入力する数値の個数分だけ(この例では3個)「入力して改行入力して改行...」形式で入力されるパターン

hoge = []
for i in range(0,3):
    a = int(input())
    hoge.append(a)

リストを作ってappendメソッドで繰り返し入れていくという方法をとってます(一番初めに思いついたので)

入力される数値の個数が分かっているなら初めからその個数分の配列を用意するべきですよね.(記事書いてから気づいた)

appendメソッドがどういう仕組みで動いているのかこれまた分かんないんですけど,きっと空のリストを用意していたところから何か要素が入ったリストを新しく作ってhogeに代入するんですから元々用意していた空のリストはどこに行ったのですかってなりますし,新しいリストはどこから生まれたのってなりますし...

以前ABCのB問題でこの書き方をしてたらTLEを食らった問題がありましたのでまた書き直すか

追記

こういう書き方もありかもですね.

n = int(input())
hoge = [0 for i in range(0,N)]
for i in range(0,N):
    hoge[i] = int(input())

n = int(input())がこれから入力されるデータの個数で,hoge = [0 for i in range(0,N)]でデータの個数分の要素を持つリストを作っておいてfor i in range(0,N): hoge[i] = int(input()) hogeにデータを入力していく...,みたいなやつです.

いくつかの数値を入力するやつ(個数不定で一行で入力Ver.)

こういうやつ

入力

  1. n

  2. a1 a2 a3 ... an

これに困ったのでこの記事を書こうと思いました.

リストの内包表記っていうかっこいいやり方を使えばいけるっぽい

a = [int(x) for x in input().split()]

for文です.

a1 a2 a3 ... aninput().split()で読み取って[input()の部分]そして分割する[split()の部分].そのx達をint(x)にしたものをリストの要素しなさい!

的な命令です.こんなことするんですねーはえー.

さらに

a = [int(x) for x in input().split() if x != "0"]

みたいな感じで条件を付け加えることもできるようです.x != "0"ってなってるのはこのif文の時点ではxはまだstr型だからでしょうね.

Pythonは英語の文章みたいに書ける!

とよく言われますが,リストの内包表記は特にそんな感じがします.

入力した単語を文字ごとに分割するやつ

こういうの

入力

  1. hogehuga

入力した"hogehoge"['h','o','g','e','h','u','g','a']という感じにしたいやつです.

a = input()
x = [a[i:i+1] for i in range(len(a))]

例えばa = "abcde"とするとa[0:1]"a"になります.これはどういうことかというと,イメージとしては"abcde""a"の左側を0番目として縦線を引いていくイメージ.

"|a|b|c|d|e|"という感じで縦線がひかれていてa[0:1]は0番目の縦線から1番目の縦線の間のものを返すという感じです.

この例でa[0:3]とするとそれは"abc"となります.

なのでa="abcde"としたとき,[a[i:i+1] for i in range(len(a))]

[ a[0:1],a[1:2],...,a[4:5] ]

すなわち

["a","b","c","d","e"]

となる,というわけでした.

また標準入力わからん!ってなったら書きくわえます.標準入力,地味に最初の難関な気がします.

『敗北の少年』を弾きました!

こんにちは.

 

kemuさんの『敗北の少年』を弾かせていただきました!

 

www.nicovideo.jp

 

www.youtube.com

 

何より歌詞がとても大好きで思い入れも強い歌です.ここでは演奏動画の裏話をば.

目次!

 

楽譜

敗北の少年 - Google ドライブ

 

まず,今回のアレンジの楽譜をアップロードしました.

 

何か演奏動画をアップロードしたときには私のピアノアレンジの楽譜をDLできるようにします

 

ピアノアレンジ的小話

語りたい話だけど読まなくていい話

ベース

この曲はコード進行も伴奏も言ってしまえば単純です.(だからこそ力強い曲なのですが)

前奏は

 

Dm → B♭ → C → F

 

サビは

 

B♭ → C → F → F

 

です.

 

この音をオクターブで8分音符でダカダカ弾くと左手完成です.下が実際の左手の楽譜.

 

f:id:kebobokawawan:20180102004039p:plain

f:id:kebobokawawan:20180102004149p:plain

 

テンポをずらさずやれば結構カッコよく弾けます🌠

 

不協和音

ギターのディトーションが激しい曲です.

 

僕がこういう音をピアノアレンジするときは不協和音を使っています.

 

f:id:kebobokawawan:20180102004618p:plain

 

一番最初の黄色い音です.「ラ・レ・ソ」という4度ずつ重ねる音です.

他にもこういう不協和音を使いました.

 

裏打ち

f:id:kebobokawawan:20180102005257p:plain

 

中盤のソロの導入部分です.左の動きが右の裏を埋める感じです.

 

黄色の縦線を見たら分かるように右手で弾いていない部分を左で弾いています.

 

練習法

左手のオクターブの8分音符を弾いて右手はメロディをなぞってみましょう.

右手の和音の一番高い音だけを弾けばメロディを弾くことができます.

それだけでもかなりカッコよく弾けるはずです.

『自転車丸洗いクリーナー』でクロスバイクを掃除した話

年末なので、自転車を掃除しました。

 

使った洗剤がとても良かったので記事にしておきます。

 

自転車使用状況

  • 私のクロスバイクはGIANT escape RX2
  • 購入して10ヶ月
  • 普段は家と駅との往復のみ
  • 長期休暇にロングライドとかする(ビワイチとか)

 

要するに、自転車初心者です。

 

普段メンテする時間はないので汚れもたまります。

 


f:id:kebobokawawan:20171227161744j:image

 

こんなだったり、

 


f:id:kebobokawawan:20171227161813j:image

 

こんなだったり。

 

触ったら指が黒くなります。黄砂で汚れた車みたいになってました。

 

自転車の掃除は専用の洗剤を使うべきだ

 

Google先生はおっしゃいましたので、買いました。

 

 

 

 これです。


f:id:kebobokawawan:20171227162156j:image

 

 私はアマゾンで買わずに自転車ショップで購入しました。タオルは付属でした。

 

使い方

  1. 自転車にシューっと吹きかける
  2. 泡になるので拭き取る
  3. おわり

 

簡単。洗い流す水さえ要らない。

 

実際やってみたのが↓

 

これが
f:id:kebobokawawan:20171227161744j:image

 

こうなって


f:id:kebobokawawan:20171227162652j:image

 

拭き取るとこうなります


f:id:kebobokawawan:20171227162713j:image

 

 

『自転車丸洗いクリーナー』良い点まとめ

  • 超簡単。シュってやってサッと拭くだけ
  • 掃除なのに水が要らない
  • お手頃価格(1000円前後)

 

『自転車丸洗いクリーナー』良くない点まとめ

  • 室内で使えない
  • 風が強いと泡が顔にかかる

 

 

何も考えずに吹きかけて拭いたら綺麗になる

 

くらいシンプルな洗剤でした。

大好きです。次もこれ使う。