koboriakira.com

AIZU ONLINE JUGDEというサイトで、諸先輩方のコードを拝見させてもらいながら勉強するエントリ。

今回の問題は「ザ・スクエアーズ/The Squares」というもの。

模範解答

以下、sawfishさんのコードより(前回と一緒だ!

なんて人なんだ)。コメントアウトは、コボリが勝手に付け足しています。

学習

おおまかな流れ

  1. フィールドと避難者を設定する。向きを示す文字列の配列と、向きによる「次に進む方向」の配列をつくっておく2. まず、避難者それぞれについて、進行方向の確定をさせる。とりあえず「今向いている方向が進めるかどうか」から考え、それが無理なら問題文の通りに次案を検討していく3. 全員の進行方向が確定したら移動フェーズに入る。優先度(prio)を使いながら、同じ場所に避難者が着かないように移動させる。このとき、移動前の場所を床(避難者のいない場所)にしておくことを忘れずに4. それぞれの避難者について、非常口に立っていたら迷路から取り除く。
  2. まだ避難者が残っていれば、残った避難者だけで上記の処理を繰り返し行う。180秒(180カウント)したら強制的に終了。

優先度の処理の仕方

今回は、複数の避難者が同じ場所に移動する場合の対処に唸らされた。簡略すれば、それは「予約システム」のようなものだ。

方向付けが確定したとき、次に進むであろう場所に自分の向きを数値として入れておく。そうすると、2人目以降の数値が入るとき、どちらの数値(予約)を優先すべきか決められるわけだ。

最初は「まとめて処理すればいいのに」と思っていたが、ここの処理を理解して、方向付けと移動を分けて処理する大切さを理解した。

ArreyDeque

これまでArrayListとHashMapしかコレクションフレームワーク(コレクション=オブジェクトの集合を操作するために用意されたJava標準のAPI。今知った・笑)を使っていなかったが、ArrayDequeというのもあるようだ。

ArrayDequeは、両端キューとも呼ばれ、先頭末尾の双方から要素を出し入れできるキューの実装です。ArrayDequeを利用することで、キュー(FIFO:First
In First Out)やスタック(LIFO:Last In First Out)といったデータ構造を表現できます。 ArrayDeque |
Javaコード入門

アナロジーとして、ロケットペンシルのようなものか。真ん中の処理はできないが、1個ずつ取り出しつつ、目的の番が来たらそれを処理して、もう一度戻したり(あるいは捨てたり)できるイメージ。

メソッドは、offer()で末尾に登録し、poll()で先頭を取得and削除する。

今回の例では、これで避難者の脱出処理を上手に行うことができる。たとえば、5人いる中の2人目が脱出した場合、次の処理からは4人で行える。これはメモリの観点からも良いのかもしれない。

ちなみに、TreeMapという、勝手にソートしてくれるHashMapもあることを知った。便利そう。


Javaについて、基礎中の基礎は終わったような感じがしてきた。 しかし、まだ自信というほどのものはない。それは主に、「知ってる技が少ない=メソッドやクラスに関する知識が足りない 」ことと「 アルゴリズムのパターンを知らない 」ことが原因かと思っている。

そう悩んでいたところ、 AIZU ONLINE JUGDEというサイトに当たった。このサイトでは、いろんな言語に関する練習問題を多く載せてくれている。

難度は「“Hello World”を出力しなさい」という簡単な問題から、よく練られたアルゴリズムが要求されるような問題まで、いろんなレベルの問題が揃い、独学の身にとっては嬉しい。

さらに、このサイトは他の人の書いた(正解の)コードも公開されているため、これが非常に勉強になる。

というわけで、諸先輩方のコードを拝見させてもらいながら勉強してみようと思う。今回の問題は「錬金マスター/Wrought Gold Master」というもの。

模範解答

以下、sawfishさんのコードより。コメントアウトは、コボリが勝手に付け足しています。

学習

おおまかな流れ

  1. アイテムのインスタンスを作り、そのインスタンスの中にレシピリストを作り、必要なアイテム(インスタンス)を登録する。
  2. 指定されたアイテムについて、「レシピが存在しなければ、購入金額が最低費用」、「存在するなら、素材ごとの最小費用の合計を最小値」とする非常にシンプルな処理。自分だったらItemクラスとRecipeクラスを作ってしまいそうだ。たしかに、必要な素材はアイテムの情報として登録すべきだろう。

インスタンスの作成方法

まず気になったのが、下の箇所。

Item item = getItemInstance(br.readLine());itemTable.put(item.name, item);自分がインスタンスを作るときは、たいてい配列でインスタンスを作っていたのだが(item[0]みたいな)、模範解答では、

「itemインスタンスを生成する」→「マップにアイテムの名前とインスタンスを登録する」→「itemインスタンスを生成する」→「マップに登録」

の繰り返しでインスタンスを生成し、コントロールできるようにしている。これをすることで、(例えば今回のように)名前からあるインスタンスを持ってくることができるようになる。すごい。

また、2回目にitemインスタンスを生成するとき、1回目に生成したitemインスタンスを上書きするものだと思っていたが、どうやらそういう訳でもないらしい。

「new Item」とコードを書くぐらいだから、きっと新規作成なのだろう。

三項条件演算子

if文の省略について、そろそろ勉強してもよいだろう。単純な処理はこういった1行で済むコードで済ませておきたいところ。

条件式 ? 式1 : 式2 「式1」は、条件がtrue出会った場合。「式2」はfalseの場合。

StringTokenizerクラスについて

レシピをつくるときに、StringTokenizerクラスを使っているのも勉強になった。これは入力された文章を半角スペースごとに区切ってくれるクラスメソッド(?)だ。これまで、標準入力を読み取って、その文字列をsplitメソッドで分けて処理していたが、このような方法もある。

ちなみに、nextToken()で次の文字列(トークン)を取得し、countToken()で残りの文字列の数を取得できるよう。


来月6月10日、w-inds.のニューシングル「In Love With The Music」が発売されます。 友人がカラオケで歌っていた「LOVE IS THE GREATEST THING」で気になって、「HYBRID DREAM」あたりからドハマりした自分ですが、まさかこんなに熱心に追うことになるとは思ってもみませんでした。

そして、そんな感情を今まで以上に高ぶらせてくれるのが、今作「In Love With The Music」です。

「In Love With The Music」の感想

2種類の「音楽的な進化」

とにもかくにも、まず一聴していただければ「デビュー15年目に突入し、ますます音楽的な進化を見せつけるw-inds.」というオフィシャルのコメントが誤りでないことは自明かと思います。「2015年の音楽・ベスト10」に入るのは確実でしょう。

そして個人的には、彼らのいう「音楽的な進化」というのが2種類あるように思えました。

『Timeless』からの進化

ひとつは、前作『Timeless』からの進化です。とくに「Make You Mine」や「Good Time」あたりの、いわゆる「レトロモダン」路線を引き継いでいます。これ、w-inds.ファンの人で私みたいな性格なら絶対に押さえておきたいところですが、

世界のトレンドを取り入れながらも、いつまでも色褪せないという思いをタイトルに込めた”Timeless”(Timeless=時代を超越した、永遠)。そして
エレクトロダンスミュージックへの傾倒から2年を経て たどり着いた大人の心地良さの溢れるレトロモダンなアルバムが完成しました。
w-inds.tv|w-inds. 10th ALBUM「Timeless」収録曲&ジャケ写公開!
|INFORMATION

というコメントがオフィシャルで出ています。「『Another World』や『MOVE LIKE THIS』とはまた一味違いまっせ」ってことですね。その結果、ハウスやエレクトロのような楽曲からヒップホップ・R&B;への揺り戻しが起こり、「Make You Mine」はライムスター宇多丸というベテランラッパーが2014年のナンバーワン楽曲に上げることにもなりました。 宇多丸が選ぶ 2014年J-POP NO.1楽曲 w-inds.『Make you mine』

ここらへんの驚き・感動は、拙ブログ(?)をいくつか拾い読みしていただければ、少しご理解いただけるかもしれません。意外とたくさん書いています。「僕なんてまだファンじゃないよ〜」とか猫被ってましたが、もうファンかもしれない。

w-inds. | コボリアキラの要約と反復

※ニクいのは、上記のような言い方は「エレクトロ期」の価値を下げてしまうことになりかねないのですが、「In Love With The Music」はエレクトロ期を歌詞で回収しているところです。誰かがツイッターで指摘していましたが(ご存知の方、教えていただけると嬉しいです)、ブリッジでは「Put Your Hands Up」、「FLY HIGH」、「New World」が引用されています。 (下の方です) > きっとバキバキに踊るであろう間奏の前の歌詞にput your hands upとかFLY HIGHとか新たな世界へとか入ってるのニクいー(´д`)

In Love With The Music_w-inds. http://t.co/NMHUjZBwq9

— 桂(けい) (@25kei25) 2015, 5月
16

「過去のw-inds.」からの進化

もうひとつは、エレクトロに傾向するより前の、過去のw-inds.からの進化です。「進化」というより 「アップデート」 と言ったほうが適切でしょうか。

たとえば「In Love With The Music」は、製作者の意図ではないと思いますがコボリが聴くかぎり、「Midnight Venus」や「song 4 U」の流れを汲んでいるように感じました。 これはコボリの勝手な見立てですが、

「レトロモダン」の萌芽はこの頃から、というよりデビュー時の「Forever Memories」から既にありました。 ですので、現在のw-inds.はこの15年の歴史をしっかりと踏まえた上で2015年という時代に合わせることができている、ものすごいユニットだと思っています。 以前日記に「今こそ過去曲のアップデートを 」と書いたことがありますが、そういう意味でTimelessツアーは本当に素晴らしかったですし(「Whose is that girl?」とかカッコ良すぎた)、「In Love With The Music」も新曲ながら物語を感じさせます。 ちなみにこのアップデートは、

Vo.の橘慶太の成長が無くして成立はしません。 ココらへんは素人なので勘弁ですが、緩急をつけた歌い方やリズムの取り方など、ボーカルの技術が格段に上がったことで、今回のような曲が出せていることは言うまでもありません。

※ダンスは本当にサッパリなのでアレですが、おそらくダンス・コーラスの緒方龍一、千葉涼平の2名も相当レベルアップしているんだと思います。今作だと、千葉涼平のラップパートの「音を上げて限界まで」の、すごいタメた最初の「お」が素晴らしいです。このテンポでこれだけタメをつくるのって結構難しいです。ぜひ試しに歌ってみてください。涼平くんより先に「お」って言ってしまうと思います。「お」のガマン比べですね(笑)。

期待されるカップリング曲と、ニューアルバム『Blue Blood』

という感じで、まだ発売前ですがザッと書いてみました。もう少し詳しく書きたいところもあるのですが、まだクリアな音源を聴けていないので、カップリング曲とともに楽しみに待つことにします(あと、「FANATSY」と同様、今回もリミックスやります!)

そして、7月はニューアルバム『Blue Blood』も発売になるということでして、こちらの内容も非常に気になります。「過去曲の再録」という_オッズ10万倍_ ぐらいの勝負に万札を放り投げつつ(笑)、レトロモダンをどこまで拡大していくかを期待したいと思います。

ちなみに、本当にちなみにですが、

「in love with 〜」という言葉遣いは、恋人との恋愛関係において使われるようです。今回みたいに比喩的な使い方は正しいんですかね(笑)。 I love youと I am in love with youのニュアンスの違い。 - 英語 |教えて!goo


※「つまらなくなるから、ネタバレは辞めてね」と最初に注意されたので、以下はネタバレを許容する人に向けて、ってことで一つよろしくお願いします。 > ―それにしても、監督たちの、下調べをしてこないっぷりが清々しいですよね。でも、その出たとこ勝負が映画全体の躍動感に繋がっていますね。

松尾:最後まで「ビズはさぁ~」って名前間違えてますから。でもよく知っている人が撮ったら「BiSはやっぱりすごい」で終わってしまったはずなんです。下調べなし、リスペクトのリの字も持たない人たちを彼女たちにブツけることに意義がありました。
[…]
松尾:渡辺君に限らず、『キャノンボール』シリーズって女性を相手にしているはずなのに、最終的には男の話になっちゃうんです。僕らはAV監督ですから男なんて撮りたくないんですが、このシリーズだけはどうしても男の話になってくる。今回も、BiSのドキュメンタリーなのに、BiSのことをほとんど紹介してませんからね。
AV監督VSアイドルの騙し合い 映画『BiSキャノンボール』の企み - 映画インタビュー :
CINRA.NET

というインタビュー記事を読み、「AVもBiSも、何もわからなくても観れるかな」と思って(BiSって、tengal6と一緒にラップしてなかったっけ?ぐらいの認識だったので、現状を知ってとても驚きました)、新宿テアトルで観てきました。

まあ、観たのは今日じゃなくてバレンタインなんですが、レビューを書いていたことを思い出しました。

映画の概要

本作は、昨年2014年に解散したBiSというアイドルグループの解散ライブ直前からその直後までを追ったドキュメンタリです。

ただひとつ特徴的なことは、メンバー6人を撮る 6人のカメラマンが全員「ハメ撮りを得意とするAV監督」である こと。映画のキャッチコピーの「アイドル vs AV監督」の文字通り、AV監督はアイドルをハメ撮りすることを目指して、密着取材を進めます。

という、概要だけでも賛否両論が出そうな内容ですが、実際の感想も様々。新宿テアトルのレイトショーの1週目興行収入の歴代1位を記録したように影響力が伺えます。

賛否両論【劇場版BiSキャノンボール】感想まとめ - Togetterまとめ

音楽のない映画、読み込めない<物語>

以降は、BiSのことも、この映画の前作にあたる『テレクラキャノンボール』のことも知らない、事前知識の無い人間から見た感想です。

まず、ものすごい単純に「解散ライブぐらい、最高の状態でやらせてあげなよ(苦笑)」という気持ち悪さ(怒り…かも)はエンディング後にもずっと残りました(今思い出しても同じ感覚です)。

映画に流れるBiSの音楽もあまり好きじゃなかったんですが、劇中で流れる曲のヒドさもあいまって、「 もしかして、音楽はどうでもいいのかな 」と。

※ちなみに、ここに並列することも失礼かとは思いますが、道重さゆみの卒業ライブがこの怒りを誘発したことは否めません。フクムラダッシュと同じぐらいのパフォーマンスを!

とは言わないけれど、いいパフォーマンスをしたい/見たいのは皆同じだと祈りたいところです。

もうひとつ、とくに感じたのは、この映画が<物語>を読み込むことを強く拒絶していたことです。つまり、この映画にカタルシスは訪れない。映画の中にいるのは、「一人のアイドルと、彼女を騙して良い画を撮ろうとする監督」であり、観客はそれをただ受け入れるだけでした。

多分「これは失敗についてのドキュメンタリーだ」とか言われてると思うんですが(監督が言ってました・笑)、まあそれもあまりポジティブには捉えられないですよね(笑)。

ヴェールに包まれた映画

というわけで、端的に「 つまらなかった 」ってことで終わってしまうんですが(苦笑)、それでもいくつか印象的なシーンが2つありました。

そのひとつは、「テンテンコ×ビーバップみのる」で、訳の分からない説得と相談を繰り返し、最終的にビーバップみのるは『プレイボーイ』に掲載されている彼女の写真の上に(自慰行為によって)顔射をするシーン。

そしてもうひとつは、「コショージメグミ×梁井一」で、ハメ撮りに失敗した悔しさから、撮影終了後に彼女の写真をサイドシートに貼り付けてドライブし、途中でナンパした素人女性にその写真をつけてハメ撮りをしたシーンです。こちらも最後は顔射でした。

この2つのシーンは、私には『ヴェールとファロス』を想起させるに十分すぎるものでした。 [amazonjs asin=“4434071858”locale=“JP” title=“ヴェール/ファロス―真理への欲望をめぐる物語”] 上の本は、コボリが大変お世話になった教授の著書です。

本書のポイントを簡潔にまとめると(すみません!!)、「真理があると想像=勘違いしているから、ヴェールを剥がし続ける=真理への探求を続けることになる。しかし、ヴェールを剥がしても中には何もない(orまた次のヴェールがある)ことに気づく」ことを説明しています。

もっと卑近に例えれば、「スカートをめくる前の興奮はものすごいが、実際にめくってパンティを観たときの興奮は大したことない。

われわれはスカートの外からしかパンティを見ることができないのだ 」という感じです(すみません!!!!!!!!!!)。

AV監督は、真理を追求する側として、アイドル(=偶像)にかかったヴェールを剥がそうとしました。しかし、剥がしたと思ったヴェールの中には、またヴェールがかかっていますし、そもそも中身など存在しません。

「わたしの精液は顔=《ファロス》には届かず、誌面や仮面=《ヴェール》に当たるしかない。」

誌面上/仮面上への射精は、このことをわかりやすく伝える映像だな、と感じました。


と、結論部を書けないまま忘れ去られていたテキストですが、とりあえず。


あらすじ

前回同様、下のサイトでゲーム作り。インベーダーゲームが完成した。 Javaでゲーム作りますが何か? -人工知能に関する断創録

引数にthisを使うことについて

今回のプログラミング作業の中で、ひとつ明確になったことがあった。それが「this」の使い方だ。

インスタンスを作成するとき、因数にthisを使うときがあった。たとえば、

Sample.java

class Sample {int x = 1;int y = 2;public static void main(String arg[]) {Hoge hoge = new Hoge( this );}}みたいなものだ。 このときのthisは、クラスSampleを指していて、より正確には「Sampleをインスタンス化したもの」らしい。

とりあえず、thisを因数として使うことで、“x”や”y”をインスタンスhogeでも使うことができる、と考えておけば良いように感じた。

コンストラクタのthisと勘違い(?)しないように

thisを使うので、まず思い出すのが、コンストラクタ内にあるthisだ。さきほどの例を引き継いだとすると、

Hoge.java

class Hoge {Sample sample;public Hoge(Sample sample) {super();this.sample = sample;}}というコードが書かれるはずだ。

ここで使われているthisは、さっきのthis(クラスSample)を表しているのではなく、クラスHogeを指している。つまり、上で定義した変数sampleに引数を代入している、ということだ。わかりやすいように色をつけて表そう。

Javaのとっつきにくい点として、上のような文章だと「Sampleとかsampleばかりで、何を言ってるのかサッパリ」みたいなところがある。でも、オブジェクトについて理解してくると、なるほど理にかなった言語なのかもしれない。

ただ、こういった記述をすることによる利点はまだよくわからない。普通に「Sample.x」とかでも良さそうなものだが…。もう少しコードを書くなかで理解できるのかな。


あらすじ

少しJavaのことが分かってきたので、下のサイトを参考にゲーム作りにも取り組んでみた。 Javaでゲーム作りますが何か? -人工知能に関する断創録

このサイトはかなりわかりやすく、とくにインスタンス化については一応の理解はできたような気がする。ブロック崩しは作れるようになった。

またその中で、一つ目の目標であった「キーパンチによって音が鳴る仕組み」をやっと作ることができた。いわゆる 簡易MPC だ。

最終的には、シーケンスみたいなのを組むことで、「Madeon’s Adventure Machine」みたいななアプリも作れるかもしれない。自作曲の宣伝にもなるし。

サンプルコード

SoundTest.java

import java.awt.Container;import javax.swing.JFrame;public class SoundTest extends JFrame {public SoundTest() {setTitle(“簡易MPC”);MainPanel panel = new MainPanel();Container contatePane = getContentPane();contatePane.add(panel);pack();}public static void main(String[] args) {SoundTest frame = new SoundTest();frame.setDefaultCloseOperation(EXIT_ON_CLOSE);frame.setVisible(true);}}#### MainPanel.java

import java.applet.Applet;import java.applet.AudioClip;import java.awt.Dimension;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.JPanel;public class MainPanel extends JPanel implements KeyListener {private static final int WIDTH = 240;private static final int HEIGHT = 240;//インスタンスの発生Sound kick = new Sound(“kick.wav”, true);Sound snare = new Sound(“snare.wav”, true);Sound hihat = new Sound(“hihat.wav”, true);public MainPanel() {setPreferredSize(new Dimension(WIDTH, HEIGHT));setSize(WIDTH, HEIGHT);this.setFocusable(true);addKeyListener(this);}@Override public void keyPressed(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_S:kick.play();break;case KeyEvent.VK_D:snare.play();break;case KeyEvent.VK_L:hihat.play();break;default:break;}}@Override public void keyTyped(KeyEvent e) {}@Override public void keyReleased(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_S:kick.stop();break;case KeyEvent.VK_D:snare.stop();break;case KeyEvent.VK_L:hihat.stop();break;default:break;}}}#### Sound.java

import java.applet.Applet;import java.applet.AudioClip;public class Sound {private String filename;private boolean attempt;private AudioClip audioClip;public Sound (String filename, boolean attempt) {this.filename = filename;this.attempt = attempt;audioClip = Applet.newAudioClip(getClass().getResource(filename));}public void play() {if (attempt) {audioClip.play();attempt = false;}}public void stop() {audioClip.stop();attempt = true;}}## 工夫したこと

「キーを押している間は音が鳴り、キーを話すと止まる」ようにすること。そして、「キーを押して音が鳴るのは1度(押していると、連続的にタイプしてると判断される?)」となるようにするのに苦労した。

自分の解答は、booleanをつくって処理するようにした。Soundクラスのplayメソッドとstopメソッドがそれ。