diverta 2019 Programming Contest に参加しました

題名の通りです。戦績を綴っていきます。

問題文を落ち着いて読まなかったがために、AおよびBのACまでにそれぞれおよそ31分、47分もかけてしまいました(コンテスト開始からの経過時間)。なんと不甲斐ないことか・・・。不勉強が響き、結局ACを取れたのはこの2問だけでした。Cはもう少し落ち着いて考えれば時間内ACまで辿り着けたと確信しているので悔しい限りです。

 

ーーーーーーーーーーーーーーーーーーーーーーーーーー

Aの問題文を読む → 「選び出す組合せの数を求めるのね、nCrを実装すればOKか」 → 「何度見直してもコーディングに間違いがないのに出力例と一致しない、おかしいな」 → 「任意のk個じゃなくて連続するk個を選ぶんかい!」

 

Bの問題文を読む → 「N個を3つの異なるグループに分ける(0個になるグループの存在を許す)のね、(N+2)C2でいける」 → 「箱の数に注目しないとダメじゃん! ちゃんと問題文読めよ自分さあ・・・」

ーーーーーーーーーーーーーーーーーーーーーーーーーー

 

こんな間抜けなことをやらかしたせいでじっくりとCを考えられませんでした。二度と味わいたくないものです。はっきり言ってUnratedになってくれて本当に嬉しい限りです()コンテスト終了後、落ち着いて考えた末になんとかDまでACを取れました。

 

A:答えはN-(K-1)通りです。

B:上限が3000なので、愚直に二重ループを回して探索しました。

C:基本的に解説pdfと同じように考えました。文字列を4つに分類すると

  1. 先頭がB、末尾がA
  2. 先頭がB、末尾がA以外
  3. 先頭がB以外、末尾がA
  4. 先頭がB以外、末尾がA以外

このようになります。ただし、1.のタイプが存在する場合に関してのみ、解説pdfに載っていた実装と少しだけ異なります。以下のように並べれば、"AB"は新たにn-1個生じます。

B[any_1]A, B[any_2]A, B[any_3]A, ... , B[any_(n-1)]A, B[any_n]A

 

この条件の下で、2.のタイプしか存在しなければ、n番目のすぐ右にそのような文字列を置くことにより、さらに1個の"AB"が新しく生じます。3.のタイプしか存在しない場合も同様です。

 

2.のタイプと3.のタイプの両方が存在する場合、まず、1番目のすぐ左に3.のタイプを、n番目のすぐ右に2.のタイプを1つずつ置きます。これで新たに2個生じます。後は、まだ置かれていない2.のタイプと3.のタイプの文字列の数のうち、小さい方の数だけ新たに生じるのでこの数を加算すればそれが求めるべき答えです。

 

D:解説pdfにそのまま従ったので特筆すべきことはありません()

ただ、Nの約数を調べ上げる際に何故sqrt(N)以下までの探索で済むのかを今回でようやく理解できました。ε > 0 として、x * (sqrt(N) + ε) = N である時、必ずsqrt(N) - x > 0 すなわち x < sqrt(N) になるとわかることから来ていたのですね。また似たようなことを考えるべき問題が現れた際は、この学びを必ず活かしたいと思います。

"劇場版 響け!ユーフォニアム~誓いのフィナーレ~" を見てきました。

"劇場版 響け!ユーフォニアム~誓いのフィナーレ~" を見てきました。

.
.
.
(ネタバレ回避のための改行)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

(下から本編、まあそもそもアニメにも音楽にもさほど詳しくないので薄い内容ですが)

久美子と秀一の距離が縮まりつつある描写から始まり、
それでも彼女の不器用さが故に、彼との距離感がよく分からず
困惑するばかりの久美子が微笑ましかったですね。

新入部員が大勢入ってきて昨年度よりも明らかに吹奏楽部が賑やかになったものの、
低温パートに加わった奏、求、美玲、さつきの4人は何とも癖が強く、
自分の対人関係スキルが不十分と考えている久美子は
4人で下校している最中、駅で「一年生めんどくさいなあ」と愚痴をこぼします。

そんな風でありながらも、吹奏楽に真剣に取り組んでいる久美子は
始めは仕方がないから引き受けていた相談役というポジションを
積極的に受け入れこそしないものの、徐々に腰を軽くしていきました。
成長を見せる久美子から精神的な活力を分け与えてもらえたような感覚です。

 

奏が心に抱えていた闇を久美子が浄化するシーンは圧巻です。
年上よりも技能が優れていたが故に発生した事件により
奏は周りに配慮していると過剰にアピールするような
行動パターンに変えてしまいました。

オーディションの際にも自らの行動原理にしたがった奏は夏紀先輩の逆鱗に触れてしまいます。
そこから自らの考えを打ち明け、それでも彼女の演奏を磨く努力を認めた久美子と
夏紀先輩に救われる様を見ていると、現世では決して味わうことのできないであろう
カタルシスを感じられました、彼女にも救いが齎されて心の底から喜びを覚えます。

全国大会での"リズと青い鳥"の演奏はやはり劇場の素晴らしい音響で聞いてこそです。
小説版を読んで予習しておいたのでストーリーだけは知っていましたが
曲自体は一度も聞いたことがなかったため、それによってこの映画での演奏を
最も新鮮な気持ちで味わえた私はこの上なく幸運でした。

みぞれと希美による、オーボエとフルートのソロという形で象徴された
二人の掛け合いは、私の胸を大いに打ちました。
共に生きていきたいけれど、お互いがもう一人の幸せを心の底から望んでいる。
望んでいるからこそ、愛故に別れという決断を選択する。
二人の愛情の深さを何よりも美しい音色で表現した素晴らしい演奏でした。

最後のシーンでは部長になった久美子が映りましたが、原作もまだ続くんですかね?
もし続くのであれば、是非とも追いたいものです。


総括として、やはりこの映画を劇場で見るという選択をしたのは大正解でした。
現在ではAmazonPrimeやNetflixなどでいつでもどこでも見られはしますが、
吹奏楽に真剣に取り組む高校生たちの物語という設定上、
劇場の上質な音響で楽しんでこそ、最高の状態で味わえるものでしょう。
確かに昨今のオンラインサービスの月額料金と比較すれば、
入場料は割に合わないと感じられるものではあります。
しかし、良い響きの状態でこの作品を味わうためだけでも払う価値は十分にあります。

小説版からは削られた、あるいはタイミングの差し替えられたイベントもありますが、
二時間という短い間でしか表現できないため、まあ映画はそういうものだとして
考えるのが合理的でしょう。エッセンスのみを集約したバージョンだと考えるべきですね。

(求が緑の弟子になるまでのエピソードがバッサリ落とされているし、
美玲が精神的に追い詰められ、抱えていたものを久美子に吐露するシーンの
タイミングが違っているし、そもそも夢や梨々花あたりの新入部員が描かれていない、など)

そういうわけですから、小説版も是非購入して、読みましょう!

最後に、”響け!ユーフォニアム”は神アニメだということをもう一度。
「最近のアニメはメインカルチャーになったため粗製乱造がはなはだしい。
見る価値のない作品ばかり現れている。」といったことばかり考えている
老害と化した私が勧めるような神アニメです。是非見ましょう!
小説版も買って読みましょう!絶対です!

Javaでpackageを使うとclassを実行できない現象およびその解決策

例:以下の"Calc.java"および"CalcLogic.java"

 

f:id:JunKobayashi:20190217042513p:plain

Calc.java

f:id:JunKobayashi:20190217042608p:plain

CalcLogic.java



 

これらを通常のコマンドで実行しようとするとエラーが発生

f:id:JunKobayashi:20190217020031p:plain

エラーメッセージ

 

"Calc.java"の1行目でpackageを使っているため正確なクラス名は

calcapp.main.Calcになる。

 

エラー解決策:以下のコマンドで実行

f:id:JunKobayashi:20190217042718p:plain

実行成功画面(64bit Windows 10)

 

javac -d . Calc.java CalcLogic.java:カレントディレクトリ直下に(クラスパスを指定している場合は指定されたディレクトリ直下に)パッケージ名と同名のディレクトリを生成、およびそこにclassファイル格納

 

実行する際は正確なクラス名を使った以下のコマンドを使用

java calcapp.main.Calc

Java 開発基礎事項メモ(配列補足・多次元配列)

f:id:JunKobayashi:20190212013543p:plain

Array2.javaソースコード

 

f:id:JunKobayashi:20190212013634p:plain

Array2.javaの実行結果

(1024が出力される理由)

  • y_array = x_array; により、配列変数y_arrayに、配列変数x_arrayに与えられた配列の実体(要素の集合)の先頭要素のアドレスが代入される
  • これにより、y_arrayはx_arrayと同じ実体を参照する
  • y_array[0] = 1024; によりy_arrayが参照する実体(x_arrayのそれに同じ)の先頭のアドレスにあるデータに1024が代入される

 

f:id:JunKobayashi:20190212015018p:plain

x_arrayの参照する実体の先頭アドレス5678が配列変数y_arrayにもコピーされ同じ配列実体を参照

 

f:id:JunKobayashi:20190212015659p:plain

サンプルコード

f:id:JunKobayashi:20190212015733p:plain

サンプルコード実行結果

5行目の

    x_array = null;

により配列変数x_arrayにnullが代入され、x_arrayはメモリ上のどの領域も参照しなくなるため、6行目の出力命令実行は不可能

 

f:id:JunKobayashi:20190212020345p:plain

2次元配列サンプルコード

f:id:JunKobayashi:20190212020425p:plain

2次元配列サンプルコード実行結果

3行目

    int _array = new int [2][3];

により、2行3列(縦2横3)のint型配列宣言

(正しくは要素数3のint型配列2つをその要素とする配列の宣言)

 

f:id:JunKobayashi:20190212022117p:plain

2次元配列の参照概念図

 

 

Java 開発基礎事項メモ(配列)

int x_array; // int型データを格納する配列x_arrayの宣言

 

x_array = new int [5]; // int型データの要素を5個作り配列変数x_arrayに代入

 

/* int x_array = new int [5]; と書けば上の2行と同じ*/

 /* intなどの数値を格納する型の配列は宣言されると各要素が0で初期化*/

 /* boolean型の配列は宣言されると各要素がfalseで初期化*/

 /* String型の配列は宣言されると各要素がnullで初期化*/

int x_array_length = x_array.length; // 配列x_arrayの要素数を取得(この場合は5)

 

f:id:JunKobayashi:20190212011335p:plain

サンプルコード

f:id:JunKobayashi:20190212011418p:plain

サンプルコード実行結果

 

int x_array1 = new int { 2, 3, 5, 7, 11 }; // 要素数5のint型配列x_array1の宣言および初期化

int [] x_array2 = { 13, 17, 19, 23, 29 } // 要素数5のint型配列x_array2の宣言および初期化

 

for (int i = 0; i < x_array1.length; i++){

    System.out.println("x_array1[" + i + "] = " + x_array1[i]);

}

/*通常for文。x_array1の全5要素を改行つき出力*/

 

for (int x_array2_output : x_array2){

    System.out.println(x_array2_output);

}

/*拡張for文。x_array2_outputに毎ループで1つずつx_array2の要素が入る*/

 

f:id:JunKobayashi:20190212012858p:plain

サンプルコード2

f:id:JunKobayashi:20190212012930p:plain

サンプルコード2実行結果

 

Java 開発基礎事項メモ(文字列連結・文字列→整数値)

実行させる命令

 

int x_int = 5;

String Str_test = "Number" + x_int + ',' + " John Smith";

System.out.println(Str_test);

 

Str_test: "Number", x_int, ',', " John Smith" の4つをこの順に連結させた文字列

 

f:id:JunKobayashi:20190209052322p:plain

実行結果

 

実行させる命令

 

String xString = new java.util.Scanner(System.in).nextLine();

int x = Integer.parseInt(xString);

System.out.println("x = " + (x));

 

x は文字列である xString を整数値データとして受け取る

 

f:id:JunKobayashi:20190209054206p:plain

実行結果

 

Java 開発基礎事項メモ(入力・擬似乱数・Max)

ファイル名:"Random.java"

 

public class Random {

public static void main(String[] args){

int r = new java.util.Random().nextInt(100);

System.out.print("Input an integer: ");

int num_input = new java.util.Scanner(System.in).nextInt();

System.out.println("RN = " + (r) + ", bigger one = " + (Math.max(r, num_input)));

System.out.print("Input an any String: );

String Str_input = new java.util.Scanner(System.in).nextLine();

System.out.println("Inputted String = " + (Str_input));

}

}

 

  • System.out.print(Str_out): Str_out を出力(末尾改行文字無し)
  • new java.util.Random().nextInt(M): [0, M - 1] の範囲における整数値乱数を取得
  • Math.max(x, y): 2つの数値 x, y のうち大きい方を取得
  • new java.util.Scanner(System.in).nextInt(): 1つの整数を入力より受け取る
  • new java.util.Scanner(System.in).nextLine(): 1つの文字列を入力より受け取る

 

f:id:JunKobayashi:20190209045921p:plain

Random.java の実行結果