ご無沙汰しております。
Qiitaのこちらの記事を読んでAIZU ONLINE JUDGEを知りました。
早速Tryしてみてるんですがプログラミング初心者の自分には初級問題もなかなか手応えがあって頑張るはめになってる状況です。
なるべく自分で答えを作り出すようにしているのですが、しばらく考えてわからなかったらクリアーしてる人のソースコードを見て参考にさせてもらってます。
そんな感じでちょこちょこやって3日目、コードを見ても理解できずハマった問題がこちら。
以下のような、たてH cm よこ W cm のチェック柄の長方形を描くプログラムを作成して下さい。 #.#.#.#.#. .#.#.#.#.# #.#.#.#.#. .#.#.#.#.# #.#.#.#.#. .#.#.#.#.# 上図は、たて 6 cm よこ 10 cm の長方形を表しています。 長方形の左上が "#" となるように描いて下さい。
という問題。
理解するのに時間がかかったコードがこちら
while(h,w=gets.split.map(&:to_i))!=[0,0] h.times{|i|puts ((i&1==0?'#.':'.#')*w)[0,w]};puts end
わからなかったのがここ
((i&1==0?'#.':'.#')*w)[0,w]
奇数偶数判定を
i&1==0?
とやってるとこにアハ体験してしまいました。業界では常套手段なんですかね。
evenとかoddとか使うもんだと思っていました。
&&はあらゆるところでしつこく解説してますが&の解説はあまり見かけないのでIkura先生のこちらの解説を見て理解できました。
Ikura先生、ホント神。
で、最後の[0,w]が謎で悩んでしまいました。
何これ?なんで配列最後につけてんの?と。
わかったらなんてことはない、'#.‘や’.#‘を'w'個出したら出し過ぎなので[0,w]で範囲指定してただけなんですね。配列ではなくRangeってやつですね。
と、いうわけで理解できて良かったです。 こんな感じでまだまだ低いところをウロウロしてますが努力していきたいと思います。
ところでこのコード書いたleafmoonさんという方、非常に簡潔に書いていて勉強になります。 基礎本だとワンライナーでの書き方があまり載っていないので「こんな書き方あるのか!」と驚きの連続です。 しばらくはこの方を師匠にして頑張ります。