ふにふにぷろぐらみんぐ(もっちり)

プログラマー?いいえ、技術オタクです。

ダンジョンのデッドロック 1 Python3編

やや難解な問題文にひっかかってハマってしまったので、問題の意図するところを記述しておきます。
コード云々以前にアルゴリズムが組み立てられなかった人向けの記事です。

ダンジョンのデッドロック 1 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】



【問題文】

あなたは RPG のダンジョンの設計をしています。

そのダンジョンには N 個の部屋が用意されており、それぞれの部屋は 1, 2, ..., N で表されます。このダンジョンでは 1 部屋に 1 プレイヤーしか滞在できません。

また、プレイヤーは M 人いて、現在 i (1 ≦ i ≦ M) 番目のプレイヤーは部屋 S_i (1 ≦ S_i ≦ N) に滞在しています。

ダンジョンをクリアするには、プレイヤーはそれぞれ、部屋を移動する必要があります。

しかし、部屋を移動しようと思ってもその部屋はまだ別のプレイヤーが滞在しているかもしれません。その場合はプレイヤーは部屋を移動することができません。

(参考図)

そこで、それぞれのプレイヤーが部屋を移動できるか事前に判定することにしました。

あなたの仕事は、各 i (1 ≦ i ≦ Q) について、現在の状況から E_i 番目のプレイヤーが部屋 T_i に移動できるか判定することです。

ただし、滞在している部屋と移動先の部屋が同じ場合、つまり S_i = T_i (1 ≦ i ≦ M) の場合、そのプレイヤーは移動ができることとします。

また各 i (1 ≦ i ≦ Q) について、部屋を移動できると判定された場合でも、実際に移動はしないものとします。



◆入力される値
N M Q
S_1
S_2
...
S_M
E_1 T_1
E_2 T_2
...
E_Q T_Q

・1 行目には、ダンジョンの部屋の数 N ,プレイヤー数 M, 判定する回数 Q がこの順で半角スペース区切りで与えられます。
・続く M 行のうちの i 行目 (1 ≦ i ≦ M) には、i 人目のプレイヤーの現在滞在している部屋 S_i が与えられます。
・続く Q 行のうちの i 行目 (1 ≦ i ≦ Q) には、部屋の移動をするプレイヤーの番号 E_i, 移動先の部屋 T_i がこの順で半角スペース区切りで与えられます。
・入力は合計で M + Q + 1 行となり、 入力値最終行の末尾に改行が 1 つ入ります。



◆期待する出力
・合計 Q 行出力してください。各行の末尾に改行を入れ、余計な文字、空行を含んではいけません。
・i 行目 (1 ≦ i ≦ Q) には、現在の状況から E_i 番目のプレイヤーが部屋 T_i に移動することができる場合は "Yes" を、できない場合は "No" を出力してください。



◆問題文の整理
・ダンジョンの部屋は N 個
・プレイヤー数は M 人
・現在 i 番目のプレイヤーは、現在入力値 S 行 i 番目の部屋に滞在している
・このとき、現在入力値 E 行 i 番目のプレイヤーが入力値 T 行 i 番目の部屋に移動できるか(行き先が空室かどうか)を調べる
・ただし、滞在先と行き先が同じ部屋番号であった場合には、そのプレイヤーは移動できるものとする
・また各 i 番目のプレイヤーについて、部屋を移動できると判定された場合でも、実際に移動はしないものとする


◆入力される値の内容
N(ダンジョン部屋数) M(プレイヤー数) Q(判定する回数)
-
プレイヤーの現在滞在している部屋 S_i
-
部屋の移動をするプレイヤーの番号 E_i, 移動先の部屋 T_i

以上の形式で構成されます。


◆入力例2
15 10 10  N(ダンジョン部屋数) M(プレイヤー数) Q(判定する回数)
-
1      S 行目 *それぞれ i 番目のプレイヤーが現在滞在している部屋の番号
2
3
4
5
11
12
13
14
15
-
1 6     E 行目 *プレイヤー番号 i と、そのプレイヤーが行きたい部屋の番号
5 6
6 6
8 6
5 11
6 11
9 11
10 11
6 2
8 3

◆出力例2
Yes
Yes
Yes
Yes
No
Yes
No
No
No
No



◆この問題のポイント
i という数値がそれぞれの入力される値の箇所において何なのかを理解すること。これに尽きると思います。

結論から言ってしまえば、数値 i はプレイヤーにそれぞれ与えられる固有の番号です。前から順番に+1ずつ振り分けられるIDのようなものです。

しかしその認識だけでは、プログラミングに詳しくない人にとって「部屋 S_i 」という記述では理解するのが難しいでしょう。

これは、入力される値 S ブロックの i 番目の数値という意味です。私もこの問題で初めて読み解けるようになりました!

つまり・・・S が記述されているブロックの6番目の入力される数値は 11 ですが、これは「 11 番目の部屋にプレイヤー番号 6 番の人がいる」という意味になります。ややこしいですね~

S のブロックに書かれる 1 つの数字には二つの情報が込められているわけですね。



続く E の値が記述されているブロックでは、<部屋の移動をするプレイヤーの番号 E_i, 移動先の部屋 T_i >が与えられます。

つまり・・・ E が記述されているブロックの 6 番目の入力される数値は< 6, 11 >ですが、これは「S ブロックの 6 番目のプレイヤー(現在11番目の部屋にいる)が、次に部屋番号11番に行きたい」という意味になります。


これでおおかたの難所は越えたのですが、実はもう一つ落とし穴があります。笑


このダンジョンは、ワープで移動するというところです。

普通のローグライクなどRPGのダンジョンマップを想像するとうまくいきません

たとえば、ホワイトボードに1~9の部屋を書いて、そこに各種プレーヤー番号を書いたマグネットを置くことでプレイヤーの有無を表現するようなイメージで考えてください。

部屋と部屋同士が道で繋がっている必要はないので、マップを書いて部屋の配置を考える必要はありません。

<あなたはRPGダンジョンの設計をしています>と冒頭で言ってしまっているあたり、ややいじわるな問題だなと感じます。笑



私が提出したコード。

info = input().split()
room_num = int(info[0])
player_num = int(info[1])
times = int(info[2])
player_point_array = [0 for i in range(room_num)]
player_num_array = []

#make player point list
for i in range(player_num):
    a = int(input())
    player_point_array[a - 1] = a
    player_num_array.append(a)
#print(player_point_array)
#print(player_num_array)

#get player_num & where will it want to go
for i in range(times):
    info_move = input().split()
    player_list_num = int(info_move[0])
    move_for = int(info_move[1])
    
#    print(player_list_num)
#    print(str(i + 1) + ":", end = "")
#    print(player_num_array[player_list_num - 1])
    if player_num_array[player_list_num - 1] == move_for:
 
        print("Yes")
    elif player_point_array[move_for- 1] == 0:
        print("Yes")
    else:
        print("No")

【出力幅を指定して出力】N 個の数値を M けた半角スペース埋めで出力 (paizaランク D 相当) Python

質問の意図が分からず数時間右往左往したので次に取り組む人への注意点をと思い記事を書くことにしました。


【出力形式を指定して出力】ペアの数値の入った表を罫線入りで出力 2 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】


問題文
自然数 H, W, A, B が与えられます。縦に H 行、横に W 行で計 H * W 個の (A, B) という形式で文字列を出力してください。ただし、横は | (半角スペース 2 つとバーティカルライン) 区切りで、縦は = で区切って出力してください。また、縦の文字列間で = を出力する際は、その上の行と文字数がそろうように出力します。また、A と B は 9 けたになるように半角スペースを数値の前(右詰め)に埋めて出力してください。


注意点
①期待する出力の値が正しくないので、問題文をしっかり読み込む

②>横は | (半角スペース 2 つとバーティカルライン) 区切りで、縦は = で区切って出力してください。
これは半角スペース1つずつ、計2つをバーティカルラインの左右に置くという意味。

③この問題の難所。
>また、A と B は 9 けたになるように半角スペースを数値の前(右詰め)に埋めて出力してください。
これは(*A,*B) *=9スペース という意味ではない。
なぜならコンマの後ろに半角スペースを入れるよう、> (A, B) という形式で文字列を出力してください。 という指示が冒頭にあるため。
つまりコンマを出力する時に後ろに半角スペース1つも一緒に出力しておく必要があり、最終的に期待されている値は(*A,_*B) *=9, _=1スペース ということ。



コードはもう消してしまって残ってないのですが、一応twitterに上げてるコード画像。

何か参考になればうれしいです!

例外処理のタブーサーチ (paizaランク B 相当) Python

例外処理のタブーサーチ | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

いつもお世話になってるpaizaさんの問題集をがんばって解いたので、コードを残しておきます。

お手本コードは15行、ネットで検索したら8行で実現されているコードがありました。怖いね

私はまだまだ初心者なので、今回のはPythonのスーパーコードを使わずに基本を重ねて地道に書いた、計26行のコードです。

私と同じ初心者さんには参考になるかも?

数年後には笑って読めるようになってたいな~

info = input().split()
command_num = int(info[0])
parameter_array_num = int(info[1])
time_data_lengs = int(info[2])

parameter_list = [[0 for _ in range(parameter_array_num)] for _ in range(command_num)]
command_amount_list = [i + 1 for i in range(command_num)]
time_data_list = [[0 for _ in range(parameter_array_num)] for _ in range(time_data_lengs)]
answer_list = [[0 for _ in range(parameter_array_num)] for _ in range(time_data_lengs - 1)]

#make parameter information dictionary
for i in range(command_num):
    parameter_list[i] = input()
command_dictionary = dict(zip(parameter_list, command_amount_list))
#print(command_dictionary)

#make time data two-dimensional list
for i in range(time_data_lengs):
    time_data_list[i] = input().split()
#print(time_data_list)

#cleate answer_list calculate n + 1 and n line difference from time_data_list
for i in range(time_data_lengs - 1):
    for j in range(parameter_array_num):
        difference = int(time_data_list[i + 1][j]) - int(time_data_list[i][j])
        answer_list[i][j] = difference
#print(answer_list)

#comparing with dictionary
s = ""
for i in answer_list:
    for j in range(parameter_array_num):
        if j == parameter_array_num -1:
            s = s + str(i[j])
        else:
            s = s + str(i[j]) + " "
#    print(s)
    print(command_dictionary[s])
    s = ""

1 行目で与えられる N 個の実数の入力(Python, paizaレベルアップ問題集標準入力メニュー)

◆入力文末のスペースを削除して、出力最終行にスペースを出力させない方法

paizaの問題集をといてたら、テストケース通過率が66%になる問題に遭遇してしまったのでメモ書きです。

問題としては標準入力をマスターするためのもので、特別難しいわけではありません。


11行目で与えられる N 個の実数の入力
paiza.jp


初めに書いたコード

line = input().split()
n = int(line[0])
for i in range(n):
    print(line[i + 1])

ここまでの問題で、.split()は引数を指定しなくても空白で分割してくれることに気が付いてしまった私は、しっかり手を抜いたのでした。

いまなおしたテストケース6個を3回試しましたが、特にエラーはでなかったので空白分割に関しては引数がいらないのかな?

厳密には書いたほうがいいのかな・・・と調べてみると

>空白で文字数を区切るには指定する必要はありません。 split()関数を呼び出すことで空白で自動的に空白で区切られます。 また空白を2つ開けた場合もで綺麗に区切ることができます。 このように区切る文字を設定しないでsplit()関数を呼び出すと、全角、半角の空白で区切ることができます。

とのことで、さすがぱいちょん、やっぱり君はできる子だね!



さて、上記プログラムを提出してみると、同じコードのはずなのにテストケース通過率が66%になるときと、100%になるときとがあり、プチパニックでした。

原因としてはおそらく「一行で受け取ったスペース区切りの数値群の行末にスペースが挿入されているテストケースがあり、その場合最終行の出力時に数値と一緒にスペースを出力してしまっている」のだと仮説を立てて、あれこれ試しました。


最終的に100%動くようになったコードがこれ。

line = input().rstrip().split()
n = int(line[0])
for i in range(n):
    print(line[i + 1])


ここにたどりつくまでの学び

●.splitはint型には使えない
●.rstripは右側のスペースのみを消す
●ただし.rstripは配列(リスト化)してしまったらもう使えないので、一行目の取得時に消しておく
●.rstrip()と.split()は併用できるが、順番を間違えると動かない
●空白区切りの文字列を分割する際には、.split()に引数は必要ない


たしか.rstripは場合によっては使えないみたいなこと言ってたな・・・と思ってカンペを見たら

forループの一行目ではrstripを実行できないため、forループ内で実行するとありました。

for line in sys.stdin.readlines():
     print(line.rstrip())

print内でも文末の改行や空白は消すことができるみたいです。


おまけ。

.split().rstrip()の順ではランタイムエラーになる

 

.rstrip().split()の順ならOK

シミュレータに表示される(アプリ名) keeps stopping(Android Studio)

(アプリ名) keeps stoppingてシミュレータにエラーが出て、なんだ~?なにがいけないんだあ~~てネットをさまよってたらid定義で「text」と入れるべきところが「tent」になってた…
そらコンパイラエラーはでなくても出力時に困りますわな。
誤字ミスには気をつけよう!!

AVDにPATHが通っていないエラー(Android Studio)

久しぶりにAndroid Studioを立ち上げたらエラーの嵐でデフォルトソースのHello world!を表示するまでに3時間以上かかったので、そのエラー内容と対策を書き残しておきます。

Android Studioを使ったアプリ制作の教本を見ながら動かしてもエラーが出て、ネットで調べて調べてようやくなんとか動いてくれました。ここで折れてしまう初心者は多いのでは。かくいう私もかれこれn回目の出戻りです笑

***


Emulator PANIC cannnot find AVD system path.
(AVDシステムパスが見つかりません。 ANDROID_SDK_ROOTを定義してください)


これはAVDデバイスのデータがどのフォルダに入っているのか、という情報が抜け落ちている状態です。
なので、PATHを通してあげればよいわけですね。
え?どうやって通すんだよ…Android Studioにそんな設定あったっけ?

www.javadrive.jp

こちらを参考に、Windows側でシステム環境変数ANDROID_AVD_HOMEを新規追加し、普段使っているEドライバに新しくavdフォルダを作ってそこのPATHを設定してみます。

実行するも特に変化なし。(このエラーはとれていたかもしれない)
とりあえず次。

***


Error running 'app': No Target Device Found
( ターゲットデバイスが見つかりませんでした)


これはこちらのサイトが詳しく、わかりやすかったです

qiita.com

なるほど仮想デバイスが設定されていないんだね!設定してあげよう!
たしかに右上appの横はNo devicesとなっているので、Open AVD managerからAVDを新規追加してみる。


error Creating AVD

なぜ(∵`)???

idea.logを参照しろとのこと。


同じエラーが出た質問が知恵袋にありました。
detail.chiebukuro.yahoo.co.jp

idea.logの場所は、
C:\Users\<ユーザー名>\.AndroidStudioX.X\system\log\idea.log
にあるとのこと。


ふーん、見てみるか…
と、Cドライブを見に行くと、C:\Users\<ユーザー名>\.Android内にavdフォルダを発見。
開いてみると確かに以前落としたシミュレータ設定が格納されている。。。ごん、お前だったのか。

そこで先ほど設定してみたシステム環境変数ANDROID_AVD_HOMEにこのavdフォルダのPATH(C:\Users\<ユーザー名>\.Android\avd)を通してみる。

う、動いた~!やった~!夢にまで見たHello worldだ~~!!最高~~~!!!(死んだ目)


どうも元あったAVD格納ディレクトリに(中途半端に?)PATHが通っていないためのエラーだったらしい。
新しくフォルダを作ってそのPATHを定義してみたけど無視され(AVDデバイスの新規追加もできない)、今までのディレクトリのPATHを指定してみたら動くのは本当になんなんだ。
覚えてないだけで導入したときにavdフォルダのPATHでも通してたのかな…


***

この他にもAndroid Studioのバージョンアップに伴って3.2から3.5へ移行したように見えたので、3.2のフォルダを削除してみるとAndroid Studioが起動しないこともありました。
もはやAndroid Studioに関連するファイルは触らない方がいいですね。
開発専用のノートPCでも買おうかなあ。

あと、薄々感じてはいたけどAndroid Studioの日本語化はやめた方がいいだろうなあ。。。
エラーが出たときに日本語のサイト、しかも日本語化して使っているユーザーの記事しかヒットしないのはかなり手痛いです。
日本語化して使っているユーザーがAndroid Studioユーザー全体の何割いるのか?って話で、プログラムをバリバリ組んでる人ほどそのまま使うだろうから、初心者ほど日本語化せずに使う方が良さそうですね。

Android Studioに泣かされることも多いけど、鋼の意志をもってめげずにやっていきましょう!笑

メソッドの書きかたのメソッド

 スッキリわかるJava入門 第2版で、独学をしているめいなです。こんにちは!
 毎週1章、土曜の23:59までに終える!と自分で目標を立てているんですが、第5章の章末まで一度もサボらずにこれましたー。えへへ

 でも、書けば書くほどどうすればいいのか頭がこんがらがってくるので、はてなちゃん(ブログ記事編集画面)に話しながら考えてみたいと思いまーす
 数ヶ月後、あるいは数年後に読み返したときにツッコミができるようになってますよーに!


 今回の5章はメソッドについての章だったんだけど、基礎から応用まで一気に駆け抜けていて、「本当にこの書き方で理解できるの?正しく動くの?負荷はどうなの?」と思えるソースコードがよく出てきたし、ぼくの頭では完全には追いきれなかった…。
 1章30ページ程度という制約を設けていて、その中になんとか収めたんだろうな、という感じ。

 あとは自分で補完するしかない!と思ってはいたけど、章末問題を解いてみたら、ことごとく解答例と違うコードを錬成してしまった(笑)
 他にも「これって運用するにはどっちの方が便利なの?」とか「他のプログラマにとって読みやすい(間違いにくい)のはどっち?」とか「ぼくのコードの何がいけないの?(解答例として取り扱われなかった理由)」とか、まーいろいろ気になったので書き残しておきます。
 博識なIT系はてなー様方の忌憚なきご意見もいただけたら嬉しいです。それではいってみよう!

問題内容:メソッド「email」を定義し、以下の形式で画面に表示する
戻り値の型:なし
引数リスト:タイトル、アドレス、本文の3つ
処理内容:「アドレス」にメールを送信しました
     件名:「タイトル」
     本文:「本文」
以上3行を、それぞれの引数を使用して出力する

 はじめに書いたコードがこれ。

public class Main {
 public static void main(String[] args) {
  email();
 }
 public static void email() {
  String title = "メールのタイトル";
  String address = "メールの宛先アドレス";
  String text = "メールの本文";
  System.out.println("「" + address + "」に、以下のメールを送信しました");
  System.out.println("件名:「" + title + "」");
  System.out.println("本文:「" + text + "」");
 }
}

 引数リストはメソッドの後ろの()内に記述するというのを完全に忘れていて(ぼくには難しすぎた)、メソッドの中身で変数を宣言しまくって、出力内容まですべてメソッドまかせにしているコード。
 これでもちゃんと動くんですよね…引数リストを渡さなくても。
 ぼく的にはこういうコードが一番分かりやすくて好きです。


 続きましてー、解答例を見て「そういえば、引数リストはメソッドの後ろに書くんだった!!そうだった!」と叫んで、書き直したコードがこれ。

public class Main {
 public static void main(String[] args) {
  email("メールのタイトル", "メールの宛先アドレス", "メールの本文");
 }
 public static void email(String title, String address, String text) {
  System.out.println("「" + address + "」に、以下のメールを送信しました");
  System.out.println("件名:「" + title + "」");
  System.out.println("本文:「" + text + "」");
 }
}

 いちおう、教本に乗っていた「複数の引数を渡す例」の部分を参考に書いたものです。というか成分的にはわりとそそのままです。
 変数の後ろの()内に直接データをぶち込むやつ。ぶち込む個数と受け取り側の個数、またその順番が必ず正しくなければならないという制約が怖い。
 めちゃくちゃ長いコードを書くとき、対応箇所を探すだけで一苦労になりそうなのに大丈夫なのかな?というのがぼくの所感です。


 ここまで書いてて思ったことがあるので聞いてください。
 ぼくは今まで「[email]だけがメソッド名で、それを呼び出せれば引数リストとかどーでもいーじゃん…と思っていたけど、実際には引数まで含めて初めて本当のメソッド名になるのでは?
 「email」だけだと複数のケースの想定ができなくて不便だから、メソッドの中身を引数として()内に記述し、名前の一部としているのでは?
 この考えが正しいとすれば、mainでemail();だけを呼び出すプログラムはやっぱり不親切な設計ということになるよねー。


 それでもデータをぶち込むのはやっぱり抵抗があるな…と思いながらチェックした解答内容がこちら。

public class Main {
 public static void main(String[] args) {
  String title = "メールのタイトル";
  String address = "メールの宛先アドレス";
  String text = "メールの本文";
  email(title, address, text);
 }
 public static void email(String title, String address, String text) {
  System.out.println("「" + address + "」に、以下のメールを送信しました");
  System.out.println("件名:「" + title + "」");
  System.out.println("本文:「" + text + "」");
 }
}

 mainの中で変数を宣言するんかい!
 確かにmain中でうっかりした事故は起こりにくそうだけど、その代償に使える変数がどんどん減っていく気がする…。
 メソッドは他のメソッドに対してスコープの影響をかけずにあれこれできて、そのわりにメソッド名を呼び出すだけで実行が実現できる!という便利機能のはずなのに、なんとなく本末転倒なような。
 でも、メソッドに引数を指定してしまうとmainメソッドにも引数を指定する必要があって、そのためにはmainメソッド内で変数を宣言しなくちゃいけないので、これも仕方がなさそう。

 でも、個人的に引数リストは極力使いたくない(笑)
 メソッドAの中に複数の値を宣言しておいて、メソッドAを取り出すときに指定した値だけとりだしてくれる感じだと神!だと思う。
 メソッドAに入ってる変数と値の一覧が参照できるコマンドとかあればなおいいなー。リファレンスすれば変数名を間違うこともないし。


 なんとなーく、じわじわーと、Javaちゃんの意思の強さが露見してきたような気がする。
 Javaちゃん、おしとやかで万能なクラス委員長タイプかと思ってたけど、意外にも芯の部分はしっかりしていて簡単には意見を曲げなそう。笑
 Javaちゃん完全攻略に向けて頑張ろー。


 えー、続きまして追加問題です

問題内容:先ほどのコードにメソッド「email」をオーバーロードしてmainメソッドから呼び出す
戻り値の型:なし
引数リスト:アドレス、本文
処理内容:「アドレス」にメールを送信しました
     件名:無題(※引数を使用しない)
     本文:「本文」
以上3行を、それぞれの引数を使用して出力する

 「こんなの、オーバーロードなんかしなくてもさっきのmailメソッドを書き換えたらええやん!」とドヤ顔していたぼく(アホなので)。
 引数の数が違うから、オーバーロードしてできないことはないけど…
 やっぱり、オーバーロードも極力使いたくない(笑)
 ここまでブログを書きながらいろいろ考えてきたけど、1つのメソッドに対して複数のケースを持たせたいなら、いっそのことメソッド名を変えた方が安心できる…気がする。
 emailメソッドを親として、そこにすべての要素を書き込んでおいて実際に使用するのはemailの子メソッドとか。
 今回の問題だったら、

public class Main {
 public static void main(String[] args) {
  email101();
 }
/* public static void email() {
  String title = "メールのタイトル";
  String address = "メールの宛先アドレス";
  String text = "メールの本文";
  System.out.println("「" + address + "」に、以下のメールを送信しました");
  System.out.println("件名:「" + title + "」");
  System.out.println("本文:「" + text + "」");
 }*/
 public static void email101() {
  String address = "メールの宛先アドレス";
  String text = "メールの本文";
  System.out.println("「" + address + "」に、以下のメールを送信しました");
  System.out.println("件名:無題");
  System.out.println("本文:「" + text + "」");
 }
}

 こんな感じかな。
 親メソッド(email)は資料用で、メソッドとしては使用してません。
 まあ邪魔な情報になってしまうけど、いろいろと正しいかどうかを精査する必要のある引数ぶち込みよりはいいんじゃないかな…。
 コードの邪魔になるようなら別ファイルにメソッドリファレンス(人間用)を作って参照しながら進めたらいいかも。
 子メソッドの命名法としては、2進数でやれば単純明解で良さそう。
 親メソッドで宣言してる変数が5つなら0が5つから出発して、実際に使用する変数がある場所を1に書き換える感じで。
 こんな独自ルールでやってたら会社に入ってから大変なことになりそうだけど…笑


 本当はもう1題、章末問題 of 章末問題があるんだけど、解答例のコードがよく分からない(笑)し、頭が疲れた(笑)し、たぶんめちゃくちゃ長くなる…のでまた今度にしまーす。
 こんなぼくが書いたコードでもちゃんと意図通りに動かせたので、プログラミングって奥深いなーと思います。
 ラクをするための努力は惜しまない、なかなかアレな姿勢でこれからも頑張るぞぃ。

      • -

はてなブログについて:

 ソース埋め込み術を、しかもシンタックスハイライトつきのやつを会得しました!やったー!
 といってもめちゃ簡単ですよね。さすがはてなブログ
 でもその機能を使うためにまさか「はてな記法モード」にしなきゃいけないとか思いもよりませんでした(笑)
 確かに普通の人には不要な機能だもんなあ。
 URLを埋め込むのもできるようになったし、なんとなくおしゃれなブログっぽくなってて、すげえ!と言うより他ないです。
 めいなは はてなーマスターに 一歩近づいた!▼