tooh’s diary

半角全角、常体敬体が入り乱れるカオス

チュウニズム Glorious Crown (tpz over-Over-OVERCUTE REMIX) 鳥支援解説

こんばんは。今日は新曲の追加日ですね。そろそろCHUNITHM AMAZONも終わり名前も変わるかというところで最後の曲追加?になるのでしょうか。追加される2曲とも13、13+と高難度で今からとても期待しています。ゲーセンに開凸したいので早く寝たい。

グロクラという名前でおなじみGlorious Crown(トパゾリミ)の鳥が取れました。わいわい。
f:id:saguh:20191010012307j:plain


やる前は1002500くらいだったのに突然5000点伸びて乗っちゃいました。あまりの伸びに自分でもびっくりです。

以下、気をつけたところを書いていきます。譜面研究した訳ではなく、今日二回目のプレイで出てしまったものなので、偶発性の高い運指もあるとは思うのですがそこは許してください。

※画像は全てCHUNITHM譜面保管所様よりお借りしました。ありがとうございました。
CHUNITHM譜面保管所





・17~19小節
f:id:saguh:20191010012531p:plain
気合いで真面目に押します(擦りでも普通に行けそう)。俯瞰的な意識を持って折り返しを意識するとうまくハマると思います。ここは勝率低かったのであんま言うことないんですけど一つ一つ丁寧に処理する意識を持つとよさそう。



・33~34小節
f:id:saguh:20191010012556p:plain
正攻法で取れる人はすごいと思う。僕はIQ30なのでわしゃわしゃって擦りました。適当に擦る場合は、直後に左手で取る赤+Exタップをタイミング通り取ることをしっかり意識するのが大切(巻き込みアタックが怖いので)。



・52~56小節
f:id:saguh:20191010012706p:plain
多分この曲の中で一番難しいところ。3鍵がたくさん来るんですけど、スライドを取ってる手で取る1つ+逆の手で擦って取る2つ、に分けて取ると勝率高めです。というか階段の一つ目のノーツをタイミング良く取る意識をするのが重要っぽい(ここは表拍に合ってると思うのでリズムよく取れると思う)。



・68~75小節
f:id:saguh:20191010012925p:plain
Exタップとフリックを分業するやり方もあると思うんですけど、それだと思うように取れなかったので見た通りに腕を動かして取りました。腕を交換する時は分割してあるExタップを巻き込むように取ると抜けが減って安定します。



・98~99小節
f:id:saguh:20191010013028p:plain
「指で押しなさい!」という強い意志を感じられる場所ですが、真面目に押すためには腕が四本生えてないと不可能です。ホールドの始点にくっついているExタップにリズムを合わせて、片手の人差し指、中指の二本だけで取る意識をすると普通に通過できます。



・139~140小節
f:id:saguh:20191010013126p:plain
ここまで鳥許容内で、1/16ノーツを普通に指押しできる人はめちゃくちゃ肝が座ってると思います。擦ったほうが安定するので擦りました(サンプル数1)。直後の「タタタタタンッ!」に合わせてタップを取れるようにそこにも注意を払っておくのがいいです。




以上になります。上に書いてない所は普通に目押しして取りましょう。

夏休み やったこと

やった

  • 理情内定
  • 帰省してバイト
  • ss販売


読んだ


観た

Pythonでスクレイピング 2-4,2-5/Web API,cron

2-2,2-3をなんで飛ばしたかというと、開発中止になったPhantomJSの話が割とメインだったからです。2-3,2-4でもPhantomJSを使わない部分をかいつまんでやっていきます。

2-4

OpenWeatherMapから天気の情報を取得するコード

import requests
import json

apikey = '(32桁のAPIキーを入れる)'

cities = ['Tokyo,jp', 'London,UK', 'New York,US']

#APIの雛形
api = 'https://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}'

#絶対温度を摂氏に変換
k2c = lambda k: k-273.15

for name in cities:
    url = api.format(city=name, key=apikey) #formatでcity,keyの部分を置換
    r = requests.get(url) #urlのデータをリクエストする
    data = json.loads(r.text) #JSON形式のデータをPythonのデータに変換する
    print('+ 都市=', data['name'])
    print('|  天気=', data['weather'][0]['description'])
    print('|  最低気温=', k2c(data['main']['temp_min']))
    print('|  最高気温=', k2c(data['main']['temp_max']))
    print('|  湿度=', data['main']['humidity'])
    print('|  気圧=', data['main']['pressure'])
    print('|  風向き=', data['wind']['deg'])
    print('|  風速度=', data['wind']['speed'])
    print('')
    print(data)

結果(一部)↓
f:id:saguh:20190919051159p:plain

多くのWeb APIの結果は、XMLJSON形式で返されるとのこと。


2-5

cron(クロン)は「定期的なデータのクローリング」を行うのに便利。一般に、①データ収集②バックアップ③システム動作監視に使われる。

まあなんか設定すれば動きそうだねみたいな雰囲気を感じとって終了。

Pythonでスクレイピング 2-1/requestsモジュール

2-1

・HTTP通信
基本的に「要求に対して応答を返す」方式。ステートレス通信(同じURLのアクセスに対して、同じデータが返される通信)であり、前回どんなデータがやりとりされたかの情報を保持することはない。

・クッキー
WEBブラウザを通じてサイトの訪問者のコンピュータに一時的なデータを保存しておく仕組み。HTTP通信のヘッダーを介して入出力されることになっていて、訪問者(サイト閲覧者)が容易にデータの改変を行うことができる。

・セッション
クッキーを使ってデータを保存するのは同じだが、保存するデータは「訪問者に付与する固有ID」のみで、実際のデータはWebサーバ側に保存しておく。

セッションを利用することによって、データを保存することができるようになり、会員制サイトや通販サイトを実現できる。

requestsモジュール
本の内容と前後するけど......。

requestsモジュールでデータを取得できる。
f:id:saguh:20190918193814p:plain
出力の一行目は普通のテキスト、二行目はb'...'となっており、これはpythonでバイナリであることを示している。バイナリで受け取れると都合がいいのが画像データ。
f:id:saguh:20190918194010p:plain
これで得られる画像↓
f:id:saguh:20190918194050p:plain
.......。




⭐︎Webサイトにログインするプログラム(仮)

requestsモジュールを使うことで、ログインに必要な情報をポスト(入力)できたり、リンクをゲットできる。

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

USER = 'JS-TESTER'
PASS = 'ipCU12ySxI'

#sessionでログインを行う
session = requests.session()

#back,mml_idはログイン時に指定する値。username_mmlbbs6みたいなのは値を入れる場所につけられた名前(ソースを見ればわかる)
login_info = {
    'username_mmlbbs6': USER,
    'password_mmlbbs6': PASS,
    'back' : 'index.php',
    'mml_id' : '0'
}
url_login = 'https://uta.pw/sakusibbs/users.php?action=login&m=try' #本にはhttpとなっているがhttpsにしないとエラーが出る
res = session.post(url_login, data = login_info) #ログインを行う
res.raise_for_status() #エラーならここで例外を発生させる


soup = BeautifulSoup(res.text, 'html.parser')
a = soup.select_one('.islogin a') #isloginは1つしかないのでCSSセレクタで抽出
if a is None:
    print('マイページが取得できませんでした')
    quit()

url_mypage = urljoin(url_login, a.attrs['href'])
print('マイページ=', url_mypage)

res = session.get(url_mypage)
res.raise_for_status()

#お気に入りデータの表示
soup = BeautifulSoup(res.text, 'html.parser')
links = soup.select('#favlist li > a') #favlistの下の階層がliであることを表している(favlist > liでもいい)
for a in links:
    href = a.attrs['href']
    title = a.get_text()
    print('-', title, '>', href)

Pythonでスクレイピング 1-3,1-4/CSSセレクタ,再帰処理でリンク先を丸ごとダウンロード

1-3

DOM(Document Object Model)の話。正直HTMLとの違いがわかりません......。DOMの要素を引っ張ってくる為の話をしてました。

ブラウザを利用したセレクタの利用例(青空文庫で公開されている夏目漱石の作品一覧を取得するプログラム)

1:「ページのソースを表示」をクリック
f:id:saguh:20190917040750p:plain

2:「要素」をクリック→選択した部分の上で「要素の詳細を表示」をクリック
f:id:saguh:20190917040941p:plain

3:要素のCSSセレクタをコピー
f:id:saguh:20190917041321p:plain

このようにして得られたCSSセレクタの値は
body > ol:nth-child(8) > li:nth-child(1)
となる。これは、「HTMLで上から辿っていくと、<body>→8番目に出てくる<ol>タグ→1番目に出てくる<li>タグが指しているのが、今回の『イズムの功過』なんだよ」という意味。こんな感じで、このページのHTMLの構造を掴んだら、いよいよ作品一覧を取得するプログラムを書く。

from bs4 import BeautifulSoup
import urllib.request as req

url = 'https://www.aozora.gr.jp/index_pages/person148.html'
res = req.urlopen(url)
soup = BeautifulSoup(res, 'html.parser')

#select(セレクタ)はセレクタを複数取り出してリストの形で持つ
li_list = soup.select('ol > li')
for li in li_list: #ここのliは、<li><a href = ~~>(アンカーテキスト)</a>(アンカーテキスト)</li>という形をしている
    a = li.a #aは何も適当に決めたわけではなく、<li>の中の<a href = ~~>(アンカーテキスト)</a>を取ってきたものになる
    if a != None:
        name = a.string #aのアンカーテキストを取ってくる
        href = a.attrs['href'] #URL部分の取得
        print(name, '>', href)

上の例では、セレクタを'ol > li'としていた。これは、「<ol>の直下に<li>がありますよ(そこからliの要素を取ってきてねん)」という意味だった。
CSSセレクタはこの他にも色々な書き方がある。(ここでは割愛)


1-4

相対パス絶対パスの違いの話。
https://webliker.info/78726/

<a>タグのリンク先が外部サイトであれば、絶対パスにしなければならない。(相対パスは、あくまで同じサーバー内での話)というわけで、相対パス絶対パスに直すための工夫をする。

相対パス絶対パスに直すには、urllibのparse.urljoin()を使う。urljoin(基本となるURL,解決したいパス)と入れる。


・リンク先を丸ごとダウンロードするために、途中でぶった切られないようにウェブページを再帰的にダウンロードすることが必要。

(最後に書いてあったコードは長いのでパス。まあそのうち向き合うっしょ!w)



余談:はてな記法で書いてると、<a>とかって書いた時に普通にリンク見たいな感じになってウケる
こんな感じ

Pythonでスクレイピング 1-2/BeautifulSoup

1-2

Pythonスクレイピング(HTMLやXMLから情報を抽出)をするときの便利なライブラリにBeautifulSoup(綺麗なスープ!!!!???????!?!?!!??!!??!?!)がある。
※「データ抽出」のみの機能であり、ダウンロードの機能はないので、そこはurllibを使って自分で組む必要がある。

BeautifulSoup使い方その1(HTMLの文字列からデータを取得する)

ア:HTMLから情報を抽出(基本ver)

from bs4 import BeautifulSoup

#解析したいHTMLの例
html = '''
<html><body>
  <h1>スクレイピングとは?</h1>
  <p>Webページを解析すること。</p>
  <p>任意の情報を抽出すること。</p>
</body><html>
'''

#HTMLの解析。第一引数にhtml(上の文章)、第二引数に文を解析するもの(パーサー)を入れる。今回はHTMLなのでhtml.parserを入れる
soup = BeautifulSoup(html, 'html.parser')

#HTMLと同じようにアクセスできる。例えば、h1は<html><body><h1>にある要素なので、それをドットでつないでアクセス
h1 = soup.html.body.h1
p1 = soup.html.body.p
p2 = p1.next_sibling.next_sibling 
#pタグは二つあり、後ろの方(「任意の情報を抽出すること。」の一文)にアクセスするには「p1の次」というアクセスの仕方をする。1つ目のnext_siblingはp1直後の改行、スペースを得る。

#出力
print('h1 = ' + h1.string)
print('p = ' + p1.string)
print('p = ' + p2.string)

ア':find()を使って、任意のidで探す(アのように、ルートから一つずつ辿るのは面倒なので)

from bs4 import BeautifulSoup

html = '''
<html><body>
  <h1 id = 'title'>スクレイピングとは?</h1>
  <p id = 'body'>ページから任意のデータを抽出すること。</p>
</body></html>
'''

soup = BeautifulSoup(html, 'html.parser')

title = soup.find(id = 'title')
body = soup.find(id = 'body')

print('#title=' + title.string)
print('#body=' + body.string)

ア'':find_all()を使って複数要素を取得

from bs4 import BeautifulSoup

#ulは順序のないリストを指す。a hrefはリンクを指すタグ。
html = '''
<html><body>
    <ul>
        <li><a href='http://uta.pw'>uta</a></li>
        <li><a href='http://oto.chu.jp'>oto</a></li>
    </ul>
</body></html>
'''

soup = BeautifulSoup(html, 'html.parser')

#flnd_all()メソッドでaタグ(リンク)を全て取り出す
links = soup.find_all('a')

#リンク一覧を表示。href属性(リンクの部分)はattrs['href']のようなattrsプロパティで取得できる。textはstringから。
for a in links:
    href = a.attrs['href']
    text = a.string
    print(text, '>', href)

BeautifulSoup使い方その2(urlopen()を使ってリンク先を持ってくる)

郵便番号検索APIにアクセスして、郵便番号の「県」「市」「町」を表示させる

from bs4 import BeautifulSoup
import urllib.request as req

#ここの数字の部分を変えれば任意の住所が検索できる
url = 'http://api.aoikujira.com/zip/xml/1500042'

#urlopenでデータ取得
res = req.urlopen(url)

#データ解析(なんでXML読んでんのにパーサーがhtmlなのかは分からん)
soup = BeautifulSoup(res, 'html.parser')

#soup(XMLとして読んだ情報)の中から、find('ken')なら<ken>東京都</ken>となっているところを文字列として取り出す
ken = soup.find('ken').string
shi = soup.find('shi').string
cho = soup.find('cho').string
print(ken,shi,cho)

BeautifulSoupの使い方その3(CSSセレクタを使う)

CSS(Cascading Style Sheets:要はHTMLみたいなのでできた文章のレイアウトを指定するヤツ)を指定して、その要素を抽出するみたいなことを行う。

from bs4 import BeautifulSoup

#divはその部分をくくってひとまとめのグループにする意味。ulは順序のないリスト。
html = '''
<html><body>
<div id='meigen'>
    <h1>トルストイの名言</h1>
    <ul class='items'>
        <li>汝の心に教えよ、心に学ぶな。</li>
        <li>謙虚な人は誰からも好かれる。</li>
        <li>強い人々は、いつも気取らない。</li>
    </ul>
</div>
</body></html>
'''

soup = BeautifulSoup(html, 'html.parser')

#select_one(セレクタ)でCSSセレクタで要素を一つ取り出す。div#meigen > h1はHTMLの木構造をイメージ。「meigenっていう名前のついたdivタグの中にあるh1」みたいな
h1 = soup.select_one('div#meigen > h1').string
print('h1 =', h1)

#リスト部分を取得。select(セレクタ)でCSSセレクタで複数要素取り出し、リスト型で返す。
li_list = soup.select('div#meigen > ul.items > li')
for li in li_list:
    print('li =', li.string)

まとめ

Yahoo!ファイナンスの為替情報(USD/JPY)をスクレイピングしてみる。

from bs4 import BeautifulSoup
import urllib.request as req

url = 'https://stocks.finance.yahoo.co.jp/stocks/detail/?code=USDJPY=X'
res = req.urlopen(url)

soup = BeautifulSoup(res, 'html.parser')

#なぜかわからないがここのstoksprice、stocks(株式)じゃなくてstoksになってる むずむずするわね
price = soup.select_one('.stoksPrice').string
print('usd/jpy=', price)

f:id:saguh:20190917021731p:plain
実行結果(+soupの中身)はこんな感じ。

Pythonでスクレイピング 0-1,1-1/urllib

https://www.amazon.co.jp/Pythonによるスクレイピング-開発テクニック-BeautifulSoup-scikit-learn-TensorFlowを使ってみよう/dp/4802610793

コマンドラインから実行してるけど普通にjupyter notebook入れた方が早いと思いました。まる。


0-1

スクレイピング:Webサイトの情報を抽出すること。HTML形式で作られているWebの情報を抽出するための工夫や、広告などの不要な情報を除くためのサイトの構造解析、それに、ログイン必要なサイトの情報を抽出するための工夫などが必要。
・クローリング:プログラムがWebサイトを巡回して、情報をダウンロードすること。

機械学習ではデータを収集、抽出することが大事。その上で、これらの技術が必要。


1-1

PythonでWebサイトのデータを取得するために「urllib」を使う(urllibライブラリと書いてあったけどlibがライブラリじゃね?)

・ウェブサイトからファイルをダウンロードする方法×2

[手法1] urllib.requestモジュールの中のurlretrieve()を使う。urlretrieve(第一引数, 第二引数)の第一引数は取得したいファイルのurlを、第二引数はセーブ先ファイルの名前をつけてあげる。

import urllib.request as req #いちいちurllib.requestとか書いてるのは面倒なのでreqにする

url = '(ここにファイルのurlが入る)'
savename = '(適当な名前をつけて保存)'

req.urlretrieve(url, savename)

[手法2] urllib.requestモジュールの中のurlopen()を使う。直接ファイルに保存するのではなく、データがPythonのメモリ上に保存される。メモリ上に保存→明示的にファイルに保存、という2ステップを踏まないとファイルに保存できない。
⭐︎with構文:開始と終了時にしなければならない作業を実行する(e.g.ファイルのオープン、クローズ/通信開始、終了)。例えば、with open〜と書けば、close()と明示的に書かなくてもclose()の処理も行ってくれる。

import urllib.request as req

url = '(ここにファイルのurlが入る)'
savename = '(適当な名前)'

#ダウンロード、urlopen()でURLリソースを開き、read()で読み取る
mem = req.urlopen(url).read()

#fはセーブしたファイルを「w:書き込み」「b:バイナリ」で開いたもの。fにmem(メモリー上に保存されたファイル)を書き込む
with open(savename, mode='wb') as f:
  f.write(mem)


・ウェブサイトからデータを取得(XML、HTML)

・IP確認APIにアクセスして情報を取得

import urllib.request as req

#データ取得
url = "http://api.aoikujira.com/ip/ini"
data = req.urlopen(url).read()

#取得データをUTF-8(ぱっと見読める形)に変換
text = data.decode('utf-8')
print(text) #表示

・任意のパラメータをつけてリクエストを送信、それに対する情報を受け取る

ア:郵便番号をパラメータとして送り、それに対応する住所を得る

import urllib.request as req
import urllib.parse as parse #parseは「解析」の意、これからparserなどが出てくる

API = 'http://api.aoikujira.com/zip/xml/get.php' #このAPIにアクセス予定

#変数設定
values = {
    'fmt': 'xml', #ここではxmlに指定、他にもhtmlとかいろいろできる
    'zn':  '1100001' #検索したい郵便番号を入れる
}
params = parse.urlencode(values) #変数をURLに登場する形に成形(e.g.「fmt=xml」)

url = API + '?' + params #URLの形はAPIで指定したアドレス+はてな+変数
print('url=', url)

#データダウンロード
data = req.urlopen(url).read()
text = data.decode('utf-8')
print(text) #表示

イ:文字を入力して、それが入ってる百人一首の句を探す

import sys
import urllib.request as req
import urllib.parse as parse

#sys.argv変数でコマンドラインから単語を読む。sys.argv[0]はスクリプト名、sys.argv[1]にコマンドライン引数が入る。入力として何もなければ(len(sys.argv)<1)USAGE(使い方)を表示
keyword = sys.argv[1]
if len(sys.argv) <= 1:
    print('USAGE: hyakunin.py (keyword)')
    sys.exit()

#パラメータをURLエンコード。コマンドラインじゃなくてもここのkeyword弄れば適当に検索はできる
API = 'http://api.aoikujira.com/hyakunin/get.php'
query = {
    'fmt': 'ini',
    'key': 'keyword'
}
params = parse.urlencode(query)
url = API + '?' + params
print('url=', url)

#データをダウンロードして表示
with req.urlopen(url) as r:
    b = r.read()
    data = b.decode('utf-8')
    print(data)

チュウニズム 定数13.7の比較的やりやすい曲で鳥を取るために意識すること

9/8~9/10の間で定数13.7の曲を5曲鳥のせてきました。(なにがあった)
f:id:saguh:20190910210008j:plain
ぱっと見難しいけどコツが掴めると案外イケるlarva


そこで意識したことを自分用のメモ的な感じで書いておきます。
※画像は全てCHUNITHM譜面保管所様よりお借りしました。ありがとうございました。
https://sdvx.in/chunithm/03/03089mst.htm

お品書き
CITRUS MONSTER
・VERTeX
・larva
・ouroboros -twin stroke of the end-
初音ミクの激唱




CITRUS MONSTER

・18~32小節
巻き込みがヤバイので、3鍵階段よりかは2分割タップの方を意識して取っていく。階段を気持ち遅めにとる。

・90~97小節
タップスライドはちゃんと目で見て速さを確認。左始動が厳しい場合は、一旦ミラーをかけて右始動にしてからタイミングを掴む練習をして、それから改めてやるといい。



VERTeX

・8~9小節
フリックは両手で分割して取る。手がガッツリぶつかるくらいでちょうどいい。始点を意識する。

・47~50小節
リズムが難しいところ。右手側を意識する。(50小節あたりの左手の赤タップで早アタが出てしまうのを防止する)

・73小節
スライド終点にちゃんと手を置いておく。(ここに限った話ではないけどここは左手が右レーンに入るくらいなので......)

・90~106小節
乱打。左手を意識。ゆっくり目で丁寧に一つ一つ処理する。

・127~128小節
3鍵が恐ろしく早いので、右手で擦って階段を取り、それからその手を折り返して巻き込むように右側のタップを取る。厳しかったら分業してもいい。
f:id:saguh:20190910210346p:plain



larva

・15~16小節
腕交差が厳しければ、真ん中を中心に2レーンずつ分けた単純な左右交互として捉えて、多少大げさにエアーを取るみたいなのでもいける。
f:id:saguh:20190910210425p:plain

・17~24小節
乱打はひたすら「遅め」に叩くことを意識。早すぎるとミス出がち。23~24小節は擦りで通る。

・54~55小節
最初の「タン/タン/タカタン」の「タカタン」からのスライド移行がしんどいので「タカタン」は右手で擦る。(できる人はそんなことしなくていいです)

・63~69小節
ここも「遅め」を意識。

・80小節
手をわしゃわしゃやるとスライド終点が抜けて悲しくなっちゃう。

・81~82小節
Exタップとった手をいつまでもそこに置いとかないですぐ傍に避けてスライドをとる。

・90~95小節
「タタタ/タン(Ex)/タカタン」が難しい。ここも「遅め」を意識しつつ、「タタタ」はゆっくりこすって「タカタン」はガチ押し。地力の勝負。

・100~101、102~103小節
フリックは両手で分業。

・105~108小節
左右交互8回+3鍵階段2回+4鍵階段1回と見る。「遅め」意識。

・109~111小節
擦り。

・111~115小節
一番忙しいところ。しっかり見切ってガチ押し。

・116~117小節
遅め意識の餡蜜。



ouroboros -twin stroke of the end-

・6~7小節
抜けが発生する場合は、「ホールドを早く離しすぎてないか」、「Exタップまでちゃんと擦れているか」、「フリックをとる速さが適切か」をちゃんと確認する。だいたいExタップまでちゃんと擦れていれば抜けはないと思うけど......。

・10~11小節
外始動だし指押しイケるやろ(適当)丁寧に見切ること。餡蜜は非推奨。

・24~25小節
交互トリルが死ぬほどアタックが出やすいので指先でちょんちょん触る感じでとる。

・26~27小節
擦り。

・30~31、34~35小節
速い階段なので左右分業してこすったほうがいい。終点まで擦るのはもちろんだが、始点のタイミングがずれるとすぐミスが出たり、適当にこすったりすると簡単にアタックが出てしまうので慎重に。

・59~61小節
右1回と左2回が右2回と左1回に入れ替わる地味に難しいところ。指先で突くようにとると安定する。

・78~79小節
内側始動の24分。何回もやってちゃんと譜面を見ながらタイミングよく擦るくらいしか対策がありません......。

・116~117小節
6~7小節と同じ。



初音ミクの激唱

・66~69小節
右手の赤タップは二本の指でガチ押し、左手の方は擦り。

・83小節以降
ゆっくり!!!!!!!!!!!!を意識。ミスは大体タイミングが早すぎるせい。

・87~89小節
交互の直前の階段がうまく入れなかったら擦る。
f:id:saguh:20190910210537p:plain

・95~99小節
98小節までは丁寧に見切りながら乱打。それ以降は擦り。

・107~111小節
「タタタタン」はゆっくり目+ノーツの切れ目を意識してとる。

・113~116小節
乱打はゆっくり!!!!!!!!!!丁寧に。

チュウニズム Caliburne ~Story of the Legendary sword~ 鳥支援解説

こんにちは(午前三時)

昨日やっとこさカリバーンを鳥乗せてきました。うれしいね。わいわい。
f:id:saguh:20190907034915j:plain
1006100くらいで停滞してたのを頑張って乗せました。1日で30連奏くらいしたかも。7000以上の鳥寸も5回くらい踏んだけどなんとか。

以下、やっていくうちに気をつけなきゃいけないなと思ったところを書いていきます。こういうの書いてもどうせやるときになったらいちいち思い出していられないと思うので、こんなところを気をつけるのか程度に思っておいて、あとは自分の体に覚え込ませていくのがいいと思います。

※画像は全てCHUNITHM譜面保管所様よりお借りしました。ありがとうございました。
https://sdvx.in/chunithm/03/03089mst.htm



<序盤>

・16~17小節

いきなりのくの字+両手トリル。対処法としては
①見たまま押す
②くの字は擦り、両手トリルだけ真面目にとる
③全部擦り
くらいだと思いますが(僕は③はやったことがない)、①も②も上手にやれば全ピカすると思います。

ただ僕はいつまでたっても安定せず、アタが1~2個くらいここで出ていました。全部光らせるという観点から言えば①がオススメですが、くの字がうまく押せない(僕もそうです)場合は②で妥協するのもいいんじゃないでしょうか。鳥とった時は②でやってました。

①の運指
f:id:saguh:20190907033337p:plain

②の運指
f:id:saguh:20190907033418p:plain


・57~58小節

f:id:saguh:20190907033908p:plain
右利きで左手のトリルがうまくできない場合は擦りで対処しましょう。左右反転したものがもう一度出てきますがそれも同様。


・66~70、74~78小節

f:id:saguh:20190907033506p:plain
僕個人的には一番難しいと思う場所です。何回かやってみましたが安定するやり方が見つからず、合計で3~5個くらいのアタが割と出てました。
身もふたもないですが、何度もやってリズムを覚えていくしかないと思います。「タン/シャシャシャ タン/シャシャシャ タン タン タン」のリズム、わかっていてもうまく捌けないと思うのですが、もうこれは何回もやって腕に染み込ませてください。

注意することは、
①「Exタップ」と「普通のタップ+フリック×2」の間隔は無視できないので、なんとかリズム通りにとりましょう。Exタップをとってから一回手を離して無理やり空白状態を作り、赤タップを改めて取るというイメージがいいと思います。

②フリックはゆっくりめで取りましょう。Vallistaのイントロ直後のフリックの柱や、8-EMのイントロで出てくる5重フリックでも同じことですが、詰まってないフリックは「回数分だけ」「最後までしっかり」擦るのが鉄則です。

③スライドは終点までしっかり押さえましょう。判定が最後まで付いているので離すのが早すぎるとアタックが出ます。



<中盤>

・90~93小節

f:id:saguh:20190907033550p:plain
最初の二つのフリック、抜けるとムカついて筐体爆破したくなりますよね。

抜ける原因はおそらく擦るのが早すぎる、もしくは遅すぎる(自分は遅すぎた)です。直前のExタップについたエアーを振り下ろしでとり、両手でフリックをわしゃわしゃすると抜けなくなります。その際にスライドが抜けないようにしましょう。


f:id:saguh:20190907033628p:plain
後半の折り返しフリックは「端から端までゆっくりと」を意識してください。Halcyonに登場する折り返しフリック同様、多少手を広げて取ると安定感は増すと思います。


・96~98小節

f:id:saguh:20190907033650p:plain
ジングルベル地帯。前半3つと後半3つで、くの字の幅が違います。それに留意しながら、しっかり譜面を見て取りましょう。ちゃんと見る以外の対処法がありません......。


・107~108小節

f:id:saguh:20190907033714p:plain
108小節のところ、左手で取る赤タップ+Exタップが重なっていて非常に抜けやすいです。僕は107~108小節の部分を気持ち遅めにとって、赤タップを取った手で巻き込むようにExタップを取るように意識していました。


・118~119小節

f:id:saguh:20190907033731p:plain
ジングルベル地帯にも言えることですが、タップスライドは気持ち遅めを意識して取りましょう。あとは中指+薬指の指先で取ることを意識します。<終盤>

・121~122、123~124小節

f:id:saguh:20190907033758p:plain

①フリックを早くとりすぎるとホールドの始点でアタックが出てしまう
②一分割Exタップ×2はエアーがくっついていて、気を抜いてるとアタックが出てしまう
この二点に留意しましょう。単純なようで案外難しいです。


・134~136小節

f:id:saguh:20190907033832p:plain

右手で8分、左手で4分みたいな感じで取るのが想定解っぽいんですが、切れ目が非常に抜けやすくなかなかしんどいです。僕は鳥取った時も8分全押し+全エアーをしてました。慣れれば安定します。

コツとしては、意外と遅い(初音ミクの消失のラストほどではない)ので、手首で取ろうとするのではなくしっかり手のひらをセンサーに反応させる意識でエアーを取りながら全押しすることです。
必然的に台パンになるので周りの迷惑にならないようにしましょう。

一応想定解の運指
f:id:saguh:20190907034004p:plain


・136~138小節

f:id:saguh:20190907034042p:plain

ラストの発狂です。右手始動の16分交互12回+端から端までのタップスライド×4。普通にやるとしんどいですが、幸い(?)タップスライドは餡蜜することが可能です。

YouTubeの動画コメント欄とかに「普通に交互するとアタックが出て崩壊する」みたいなことが書いてあったりするんですけど、「多分そのまま餡蜜すると、右手でとる方の8分割タップの一番左側の赤タップを反応させるのが早すぎて、緑が確定で出てしまうみたいなことを言ってるんだろうな〜」みたいな気持ちにプレイしながらなっていました。

正直餡蜜の勝率は低くて、全部光るのは3割くらい、あとは1、2アタで抜けられたら御の字くらいでしょうか。

餡蜜の運指
f:id:saguh:20190907034114p:plain

とりあえず光らせるためのコツとしては、最初の16分交互×12の時点からすでに遅めに入っておくことです。具体的に言えばJUSTICEのうちでもSLOWの判定が出るくらいでしょうか。
気持ち遅めなのはもちろん、判定として遅いとわかってるくらいで入れば、餡蜜もそこそこうまくいくとは思います。鳥許容超えて適当に餡蜜やったらハマったみたいなこともあったので、餡蜜がうまくいかない(ATTACKが出てしまう)原因は「入りが早すぎる」一択だと思います。

あとは抜けないように、ちゃんと両手でスライダー全体をカバーできるくらいに広げておくくらいでしょうか。どうしても134~136小節を全押しでとってしまうと気持ちが焦って16分交互も早く入ってしまいがちです。ラストでも落ち着いていきましょう。鳥取った時の話ですが、すでに鳥許容の6-2だったのに落ち着いて遅めに餡蜜したら全部光ってくれました。



こんなところでしょうか。まあとにかく回数積めばなんとかなるので頑張ってください。

Python3でまったり競技プログラミング 3日目(二分探索)

続かね〜〜〜〜〜〜wwwwwwwwwwwwwww

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_4_D&lang=jp

n,k = map(int,input().split())
W = []
for i in range(n):
    W.append(int(input()))
l = max(W)-1
#トラックの積載容量は少なくとも「荷物の中で一番重いもの」を乗せられなければならない
#二分探索では、lは「これを下回ってはいけない」値に相当するので、-1しておく
#(↑一つの荷物がバカ重い場合とかは、答えがmax(W)になることは当然ある)
W.append(10**13) #1つのトラックで10**6の重さを10**6個積まないといけない場合を想定
h = sum(W)
while l+1 < h:
    ok = (l+h)//2
    track = 0
    cur = 0
    for i in range(n+1):
        cur += W[i]
        if cur > ok:
            track += 1
            cur = W[i]
        elif cur == ok:
            if i != n-1: #最後は番兵で絶対に数える事になるから、i == n-1の場合だけは数えないでおく
                track += 1
                cur = 0
    if track > k:
        l = ok
    else:
        h = ok
print(h)

Python3でまったり競技プログラミング 2日目(DP)

はわわ〜〜〜〜〜〜〜〜。


今日はDP。


Edit Distance (Levenshtein Distance) | Aizu Online Judge

レーベンシュタイン距離(編集距離)は何回の操作である文字列を別の文字列に変形できるか、を表したもの。
qiita.com
詳しい説明と実装方法は上に載ってる。

s = input()
t = input()
w = len(s)+1
h = len(t)+1
dp = []
for i in range(h):
    L = [0]*w
    dp.append(L)
for i in range(w):
    dp[0][i] = i
for i in range(h):
    dp[i][0] = i
for i in range(h-1):
    for j in range(w-1):
        if t[i] == s[j]:
            dp[i+1][j+1] = min(dp[i][j],dp[i][j+1]+1,dp[i+1][j]+1)
        else:
            dp[i+1][j+1] = min(dp[i][j]+1,dp[i][j+1]+1,dp[i+1][j]+1)
print(dp[h-1][w-1])

最長増加部分列 | 動的計画法 | Aizu Online Judge

最長部分増加列(LIS)の問題。いつかに解説を書いてたのでそれ参照。





C - BBuBBBlesort!

DPじゃないけど。
n個の数字を与えられるので、それを座標圧縮(大小関係を保ったまま0~n-1に直す)して、偶奇が同じであれば1つ飛ばしのソートで適切な場所に戻せるので、偶奇が異なる部分がいくつあるかを数えればいい。

例えば、
1 3 2 4 5 7 6
は、
1 2 3 4 5 6 7
と4箇所違うので、2回の入れ替え(4÷2)が必要になる、みたいな。

Python3でまったり競技プログラミング 1日目(貪欲法)

プログラミング最近全然やってなかったのでリハビリ。1週間続くかな。続くといいな。

実践的プログラミングの資料から適当に抜粋してやっていこうと思う。

Make Purse Light | Aizu Online Judge

coin = [10,50,100,500,999999]
J = True
while True:
    n = int(input())
    if n == 0:
        break
    else:
        if not J:
            print()
        else:
            J = False
        L = list(map(int,input().split()))
        S = 10*L[0]+50*L[1]+100*L[2]+500*L[3]
        res = S-n #とりあえず硬貨を全部使ったものと仮定する
        change = [res%coin[i+1]//coin[i] for i in range(4)] #ここでお釣りとしてどの硬貨が何枚戻ってくるかを計算している
        
        for i in range(4):
            if change[i] < L[i]: #お釣りとして戻ってくる枚数の方が少なければ採用
                print(coin[i],L[i]-change[I])

最初、各硬貨は20枚までと決まってるし全探索すれば(1ケースあたり20**4通り)まあいけるやろ〜〜〜なんて安易に考えてたら普通に通りませんでした。

というか普通に発想自体難しくてワロタよ
日本の硬貨は、それより小さい金額のお金が大きい金額を割り切るという特質があるため、「大きい金額で払えるならばできるだけ支払った方が得(枚数が少なくて済む)」という戦略が取れます。そうでない場合は違う戦略をとる必要が出てくる。







※通らなかったコード 供養

while True:
    n = int(input())
    if n == 0:
        break
    else:
        L = list(map(int,input().split()))
        S = sum(L)
        ans = float('inf')
        coin = [10,50,100,500]
        for i in range(21):
            for j in range(21):
                for k in range(21):
                    for l in range(21):
                        if i <= L[0] and j <= L[1] and k <= L[2] and l <= L[3]:
                            t = i*10+j*50+k*100+l*500
                            if n-t > 0:
                                None
                            elif n-t == 0:
                                ans = S-(i+j+k+l)
                                p = [i,j,k,l]
                            else:
                                cur = S-(i+j+k+l)
                                z = t-n
                                cur += z//500
                                z = z-(z//500)*500
                                cur += z//100
                                z = z-(z//100)*100
                                cur += z//50
                                z = z-(z//50)*50
                                cur += z//10
                                if cur < ans:
                                    ans = cur
                                    p = [i,j,k,l]
        for a in range(4):
            if p[a] != 0:
                print(coin[a],p[a])
        print()

東京大学理学部情報科学科に内定しました

こんにちは。とーです。

タイトル通りです。第一段階で決まってよかったなあという気持ちです。

思えば、自信満々で大学初の成績表をもらった時に、数理科学演習「可」の文字に驚愕してから一年と二ヶ月。あれから割と頑張ってきたんじゃないのかな、なんて思います。平均点も82.02点まで持ってくることができました。

これからの道のりは絶対にこの比ではないほど厳しいと思いますが、なんとかドロップアウトしない程度には頑張っていきたいと思います。それでは。