かわわんの色々

気になったこと色々

RUPC2018に参加しました。

初参加でした。というか同じ大学の人間なのに春休みに入るまでRUPCの存在知らなかったです。

 

一日目

バイトの関係で出席してません。B問題がなんか難しかったと聞きましたがまだ見てないです。

 

二日目

A,C,F問題を書きました。

後で調べて初めて知ったんですがCみたいなやつをナップザック問題っていうんですねぇ。

 

Fはチームメイトの方に色々と教えてもらって、頑張って場合分けしました。

 

解説フェイズに入って聞いていたんですが「何言ってるのか全然分からねえ」となりました。

 

atcoderのC問題くらいなら通せるようになってきたしそろそろ基本的なアルゴリズムとかも学んで行きたいな〜、と。

 

次回もし参加できるなら、次は話について行けるように頑張って行きましょう。

 

懇親会は同大学の人たちと同じ席になったのであまり交流を広げられなかった感。

 

ミドリムシさんが同じ席だったけど年齢を知ってビビったりするなど。行動力高えなー。

 

三日目

nadareさんとbeetさんとチームでした。

 

A,Cを書きました。

 

Cはもうnadareさんにおんぶにだっこでした。

さらにPythonのcollectionモジュール便利だよと教えてもらいました。

 

beetさんからはDPの考え方について教えてもらって、チームメイトのお二方には圧倒的感謝という感じです。

 

感想

教えてもらってばっかですねぇ。ありがたみの深さがマリアナ海溝です。忘れないうちに復習しなきゃね。

 

次回も参加できそうなら参加したいなー。

 

 

 

夏休みと後期を振り返る会

人間一年前のことは忘れていても半年前のことは案外覚えてる。(?)

 

後期テストも終わったので夏休みくらいから振り返りをば

 

8月

基礎論サマースクール

基礎論サマースクールに参加した。計算論に出会い「やっばこれめっちゃ面白いやん」となった。先輩の玲於奈さんのお家に泊めてもらった。ありがとうございます。そのついでに御茶ノ水で古本屋めぐったり秋葉原を観光したりした。

数学基礎論サマースクール2017

 

バイト

バイトが大量に入った。まあ、お勉強教えるバイトだし夏休みだしそうなるよね。(お仕事あるのはありがたい)

 

弾いてみた動画

ニコニコ動画YouTubeに初めて演奏動画をアップロードした。とりあえず聞いてほしいです。ありがとうございます。

nico.ms

ピアノアレンジはまだまだストックがあるのでしばらくは投稿頑張れそうです。

tex勉強会

サークルで(la)texの勉強会をした。texの仕組みやlatexとの違いを述べて、実際にlatexの練習をしてもらった。今後も使えるいい感じの資料ができたのでは?

untitled-1.pdf - Google ドライブ

数物セミナー予習

それ以外は数物セミナーの予習をしていた。辛い辛いと言いながら予習を進めてたがこれがあったからこそ、今測度論を理解できていると言ってもいいくらい。

9月

数物セミナー

数物セミナーに参加した。

数物セミナー

班員みんなやさしくて楽しく議論できた。前回参加したときより周りの参加者が話してる内容についていけたし、ちゃんとセミナーもできたしルベーグ積分もだいぶ理解できたし実りの多いものになりました。もう感謝しかねえ。ちなみに場所は福島県の白河。ラーメンが有名らしく、ラーメン屋だらけだった。数物セミナー終わったあとは白河駅を探索して白河ラーメン食べました。

 ここで完全に夏休みの気力を使い果たした。

Remakers合宿

Remakers(立命館理系自主ゼミサークル)の合宿に参加した。集合論から始めて位相空間論のゼミをした。順序集合のことがあまり理解できていなかった気がしてたのでその辺りのことを発表した。しかし、予習もおざなりだったし微妙な感じに終わった。この合宿で『モテる男のための音楽理論講座入門』とかいうタイトルで発表した。どんな内容だったかはスライドおいておくので見てね♡

もておと.pdf - Google ドライブ

9月はこれ以外あんまり記憶がない。

10月

後期が始まった。

プログレセッション

プログレッシブロック限定のセッションライブイベントがあり、そこでELPのTarkusを演奏することに。どんな曲なのかは聞いてみて。


Tarkus - Emerson, Lake & Palmer [1971] (HD)

古い曲だし楽譜落ちてないかなと思って調べたら落ちてました。これでも助かってなくて、テクニック的に非常に難しい。僕が演奏を録音したものを置いておきます。「実はMIDI入力で後でうまく行くように編集した」とか言う甘いことはしてないです。生演奏です。 soundcloud.com

計算論の入門書

エフィーム・キンバー著の『計算論への入門』を読んだ。電車の中でのパラ読みでも雰囲気がつかめるいい本でした。

計算論への入門―オートマトン・言語理論・チューリング機械 (スタンダードテキスト)

計算論への入門―オートマトン・言語理論・チューリング機械 (スタンダードテキスト)

セミナー

数研で数理論理学セミナーと線形代数セミナーが始まった。数理論理学セミナーは鹿島先生の『数理論理学』を、線形代数セミナーは斉藤先生の『線形代数入門』を読んだ。

数理論理学 (現代基礎数学)

数理論理学 (現代基礎数学)

線型代数入門 (基礎数学1)

線型代数入門 (基礎数学1)

ディープラーニング

RCCディープラーニング班に参加した。内容は『0からできる!(略)ディープラーニング』を輪読しながら実装しようというものだった。この本ではPythonが用いられていた。そこでPythonを勉強し始めたが、これが運命の出会いだった。

暗号通貨

暗号通貨を始めた。Kindleでセールになっていた暗号通過について簡単にまとめられている本を読んだ。初めてbtcを買って数分待ってると20円分増えた。「これが投資ってやつか〜。いや、お金に対する考え方が変わりますねこれ」というのが第一の感想だった。

Atcoder

月末くらいに勧められてAtcoder(競技プログラミング)を始めた。プログラミングの勉強はとりあえずなにか作ってみよう!というのはよく聞きます。しかし、そういうので成功したためしがない自分にとってAtcoderはすごく合っていた。問題を解いていくことで勉強した証が残るのがモチベーションアップになった。さらに、問題を解いていくことでアルゴリズムの知識がつくし、なによりたくさんコードをかける。そして問題に正解すると純粋に嬉しい。そうして暇なときでネット環境とPCがあれば競プロをするようになった。

11月

pythonの勉強

pythonと運命の出会いを果たした僕はそのあまりのわかりやすさに涙を流しながらディープラーニング班、競技プログラミング、自分で購入した参考書、グーグル先生を使いつつ勉強した。 

Kindle

kindleの良さに気づいた。暗号通貨を始めたのでお金のことも勉強しようと思った。大きめのセールがあったのでKindleでいろいろ買ってみた。結論から言うと大正解だった。読書量が格段に増えることに気づいた。ただ、専門書や教科書はKindleに向いてないなーとも思った。

正課

遅刻…

学園祭

10月に読んだ計算論の本とその他ウェブサイトなどを参考に有限オートマトンに関するLTをした。

12月 

そろそろ記憶に新しい

Remakers機関誌

Remakersに記事を投稿するよう伝えられたので、今年かなり学んだルベーグ積分について書こうと思いました。しかし、手を付けてみると理解できていないことが多かったことに気付かされました。この記事執筆で自分の理解を整理することができたので、頭の中が大分スッキリしました。

遅刻

滋賀寒すぎだし神戸が最高すぎるのが悪い…

コンテスト初参加

atcoder beginner contestに初参加しました。この当時は過去問解いてる感じB問題がかろうじてできるくらいだったので、B問題を解くことを目標にしました。なんと無事達成しました。嬉しくないわけがありません。神は私に「競プロを続けなさい…」とお告げをしているのだと思いました。

冬休みとバイト

年末年始は日本の学生は冬休みなので、当然バイトも増えます。ありがたいですね。

大学行きたくない気持ちでいっぱいだったので、冬休みに入ると逆にタスクをたくさんこなせました。

ブログ

気づいたらブログ始めていました。

敗北の少年

投稿しました。うーん、もう少し早く投稿できたよね…?ぜひ聞いてみてください♥記事も読んでみてください♥

skbtkey.hatenablog.com

1月

膝を壊した

淡路島にサイクリングのテストランをしたら左膝を壊した。3週間はまともに階段の昇降ができなくなり、現在もまだ自転車に乗れない。非常に辛い。

TOEIC

645点でした。なんと英語を履修してた2回時点での得点が605点。しかし今回は英語を履修していない。にもかかわらずあの点数!

立命館理工学部英語は一体何なんだ…

AGC020-B Ice Rink Game

僕に競プロを勧めてくれた方が「AGCに参加しては?」と言ってくれたので参加しました。そしてB問題が解けそうで解けなかったのです。悔しかったので解説読んでより詳細な説明を記事にまとめました。すると、atcoder社長の高橋さんにツイッターで言及されて少しバズりました。

skbtkey.hatenablog.com

ブログってバズるとめっちゃたくさんの人に読んでもらえるしすげえなぁと言うのが率直な感想です。

セミナー終了

数理論理学は完全性定理の途中まで終了した。これはかなりいい復習になった。学んだ内容を俯瞰すことができた。線形代数学は一回生とのセミナーだったので、ツッコミが厳しめだった。いい復習にはなったけれど、固有値の話までたどり着きたかったかな〜…

テスト勉強

大学生だし、ま、多少はね?

btc200万オーバーしたので利確した

儲けで舟木先生の『確率論』を購入しました。

確率論 講座数学の考え方 (20)

確率論 講座数学の考え方 (20)

ルベーグ積分を学んだ人ならサクサク読めると思います.私は大学の講義を聞いていても確率変数の概念がわけわかめだったのですが,この本を読んでばっちり理解しました.  

感想

なんだかんだ色々やってますね...

色々と運命の出会いが多いと感じました(小並感)

AGC020 B Ice Rink Game

skbtkey.hatenablog.com

↑こちらも読んでみてください.

AGC020 B問題について書きます.

目次!

B : Ice Rink Game

B - Ice Rink Game

問題概要

  • 子供がN人いる.
  • Kラウンドからなる「n人組作って~♪」ゲームをする.
  • 「n人組」を作ると中にはあぶれちゃう子も出てしまう.そのような子は脱落する.
  • Kラウンド終了したとき,残った子供は二人だったという.
  • あなたはこのゲームを傍から見ていたので,「このゲームが何ラウンド行われたか(Kの値)」と「各ラウンドにおいて作る『n人組』のnの値」を知っている
  • あなたはこの情報からもともといた子供の数を推測してみたくなった

答えるべきもの

  • Nの最小値と最大値
  • Nとして適切なものがない場合は-1と出力

制約

  • 1\leq K\leq 10^{5}
  • 2 \leq A_{i} \leq 10^{9} ただし,A_iとは第iラウンドにおいて作る『n人組』のnの値

解説

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

具体例で考える

まずこの問題文を読んだ時に思ったのが「よくわからん」だったので,例で確認してみました.

入力例1

  1. 4

  2. 3 4 3 2

全部で4ラウンドあり,『3人組』→『4人組』→『3人組』→『2人組』の順でグループを組んでいきます.

この時,出力が

出力

  1. 6 8

でした.実際に計算してみると,f:id:kebobokawawan:20180117145911p:plain となります.確かにあっていそうです.

求めるものはNなので今度はこの例を用いて6,8を出す作業をやってみようと思いました.

Nの最小値は6だったので,6を求める作業をしていきます.

この表は各ラウンドにおいて「ラウンド終了時の子供の人数」と「ラウンド開始時の子供人数」と「作る組の人数」を表にしたものです.

赤色の文字は与えられた数値です.ゲームを開始する前は第0ラウンドということにしました. f:id:kebobokawawan:20180116225242p:plain

最終ラウンドである4ラウンド終了時の子供の人数が2なので,4ラウンド開始時には子供は2人いるか3人います.

もし,4ラウンド開始時に子供が2人いたなら,それはすなわち3ラウンドの終了時に残った子供が2人ということです.

f:id:kebobokawawan:20180117145955p:plain

しかし,これはありえません.3ラウンド終了時に残った子供が2人だけという状況がありえないからです.

3ラウンドでは『3人組』を作れという指示だったので,少なくとも3人は子供が残ります.(後の重要な伏線)

では4ラウンド開始時に子供が3人いたとしましょう.

f:id:kebobokawawan:20180117150018p:plain

これは正しいです.

では次に3ラウンド開始時(2ラウンド終了時)の子供の人数を考えてみます.候補は3人,4人,5人のいずれかになります.

f:id:kebobokawawan:20180117150037p:plain

6人以上だとすると3ラウンド終了時に6人以上残ってしまいます.

6人以上はあり得ないf:id:kebobokawawan:20180117150057p:plain

今回の場合,4人の場合のみありえます.

2ラウンドでは『4人組』を作れという指示だったので,残る子供の数は4人以上ですし,必ず4の倍数になっていないといけません.

f:id:kebobokawawan:20180117150136p:plain

こんな感じで表の数字を埋めていくと次のようになりました.f:id:kebobokawawan:20180116231752p:plain

一般的に考えてみる

具体例でこの作業をしているとこのゲームの仕組みが分かってきました.一般的に論じてみます.

f:id:kebobokawawan:20180116232708p:plain

  • iラウンド終了時の子供の人数をx人とすれば,xA_iの倍数である
  • i-1ラウンド終了時における子供の人数はx+p人である
  • 0\leq p \leq A_i -1である.pとはx+pA_iで割ったときの余りである.
  • x+pA_{i-1}の倍数である

ここまで整理すると解法が浮かびました.

各第[text:i]ラウンドの子供の人数xA_iA_{i-1}からx+p^{(i)}として適切なp^{(i)}を全てリストアップして,その中でも最小のものをp_{min}^{(i)}として最終的には 2 + p_{min}^{(K)} + p_{min}^{(K-1)} + \cdots + p_{min}^{(1)}を計算すれば,もともといた子供の最小値が求められます.

最大値は適切なp^{(i)}のなかで最大なものを考えていくだけです.

ただし,この解法は正しい答えが出せても時間制限という壁にぶつかります.

この解法だと,プログラムは二重ループになってしまうため答えをだす制限時間である2秒をいとも簡単に超えてしまいます.

コンテストに参加しているときはこのあたりまでわかったところで時間切れになりました.

pをループ無しで求めるには

解説のpdfに書かれているのはここからの話です.しかし,式だけ書かれている感じなのでここではそれをさらに詳しく書こうと思います.

https://img.atcoder.jp/agc020/editorial.pdf

再び具体例で考える

iラウンド終了時における子供の数として考えられる値はいくつかあるはずです.そこで第iラウンド終了時における子供の数の最小値をX_iとし最大値をY_iとします

先ほどまでと文字の使い方は同じにして,X_{i}=4,Y_{i}=8,A_i = 4,A_{i-1}=2 としてみます.

L_{i}f:id:kebobokawawan:20180117150254p:plain R_{i}f:id:kebobokawawan:20180117150226p:plain

pの候補は0,1,2,3です.それぞれの場合においてX_{i}+pは4,5,6,7でありY_{i}+pは8,9,10,11です.よって,X_{i-1}は4でありY_{i-1}は10です.

具体例だと直観的にわかってしまいますがポイントは適切なpを考える前にまずはX_{i}+pおよびY_{i}+pのとりえる値を考えているということです.

X_{i}+pの最小値をL_{i-1}とし,Y_{i}+pの最大値をR_{i-1}と置きます.

区間[L_{i-1},R_{i-1}]というのはi-1ラウンド終了時においてあり得るかもしれない子供の数になります.この区間の値でA_{i-1}の倍数となっているものを見て,その中の最小のものと最大のものを選んでそれぞれX_{i-1}Y_{i-1}とするのです.

一般で議論する

iラウンド終了時において子供の数の最小値をX_{i},最大値をY_{i}とします.再び述べますが,組の数がA_{i}であるとき,第i-1ラウンドにおいてありえるかもしれない子供の数は区間[L_{i-1},R_{i-1}]で表されます.この区間A_{i-1}の倍数である最小の数と最大の数を見つけていきます.

したがって,区間[L_{i-1},R_{i-1}]内にA_{i-1}の倍数がなければ-1を出力しなければなりません.よって,まずはこれについて判定しなければならないのですがそれは後述します.

i-1ラウンドにおけるあり得るかもしれない子供の数は先ほどの議論より[L_{i-1},R_{i-1}]でした.この区間の中でA_{i-1}の倍数の最小値がX_{i-1}であり最大値がY_{i-1}になります.

すなわち,

\displaystyle X_{i-1} = \lceil\frac{L_{i-1}}{A_{i-1}}\rceil \times A_{i-1}

\displaystyle Y_{i-1} = \lfloor\frac{R_{i-1}}{A_{i-1}}\rfloor \times A_{i-1}

となります.

L_{i-1},R_{i-1}を構成した方法と同様にするとL_{i-2},R_{i-2}はそれぞれ,

L_{i-2} = X_{i-1}

R_{i-2} = Y_{i-1} + A_{i-1} -1

すなわち,

L_{i-2} = \lceil\frac{L_{i-1}}{A_{i-1}}\rceil \times A_{i-1}

R_{i-2} = \lfloor\frac{R_{i-1}}{A_{i-1}}\rfloor \times A_{i-1} + A_{i-1} -1

となり,添え字をずらせば,

L_{i-1} = \lceil\frac{L_{i}}{A_{i}}\rceil \times A_{i}

R_{i-1} = \lfloor\frac{R_{i}}{A_{i}}\rfloor \times A_{i} + A_{i} -1

となり,解説pdf通りの式が完成します.

ゲーム開始時,すなわち第0ラウンドにおける子供数の最小値,最大値であるX_{0}Y_{0}は必ずL_{0}R_{0}となります.

なぜなら,第0ラウンドではA_{0} =1とみることができるからです.

したがって,L_{i}R_{i}に関する漸化式を1からKまで回せばよいことになります.

また,Kラウンドからさかのぼっていくため,各ラウンドにおける組のデータを入れた配列は逆順にソートしておくと扱いやすいと思います.

区間[Li,Ri]内にAiの倍数があることを判定する方法

区間[L_{i},R_{i}]内のすべての数字についてA_{i}で割り切れるかどうかをチェックしていけばよい

というのが,最初に思いついた方法ですが,これもfor文でループを作らないといけないため結局全体として2重ループになります.

区間[L_{i},R_{i}]A_{i}が与えられた時,区間[L_{i},R_{i}]内のA_{i}の倍数の有無を判定する方法で繰り返し処理を用いないものを述べます.(自力で考え付いたので書きたい)

まず

L_{i} \verb|%| A_{i}\, != 0

であるかどうかを調べます.もし,上記Trueならば次に

L_{i} + (A_{i} - ( L_{i} \verb|%| A_{i} )) \in [L_{i},R_{i}]

になっているかどうか,すなわち

L_{i} +(A_{i} -  ( L_{i} \verb|%| A_{i} )) > R_{i}

になっているかどうかを調べます.もしこれがTrueならば,区間[L_{i},R_{i}]内にA_{i}の倍数はありません.

f:id:kebobokawawan:20180117150437p:plain

提出

紆余曲折ありましたが,以上のような議論を踏まえて私は次のようなコードを提出しました.

Submission #1983745 - AtCoder Grand Contest 020

こういうブログ書いてる暇があるならもっと他の問題を解いていきたいなって思いました.

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円前後)

 

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

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

 

 

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

 

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

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