Paizaラーニング レベルアップ問題「要素の種類数」
Paizaラーニングのレベルアップ問題に挑戦。言語はJSです。
ユーザー同士で解答を教え合ったりコードを公開してみようと書いてあるのでコード公開します。
問題の内容は「配列 A の要素数 N と配列 A の各要素 A_1, A_2, ..., A_N が与えられるので、配列 A には何種類の値が含まれているかを求めてください。」というもの。
例えば
5
1
2
3
2
1
が入力されたとする。5つの要素が入力されるので、その要素が何種類の値で構成されているかを調べるわけね。
自分のコードはこちら
空の配列arrに各要素をpushして配列を作る
そしてその配列の中で重複する値を消して配列arrayを作る。
lengthメソッドでarrayの要素数を表示させるというわけ。
しかし各要素を一つ一つチェックしてその値が初めて出現したかどうかをカウントしていくというロジックが王道なのかな。
重複に関しては苦手なのでもっと勉強したい。ただ単に重複しているかいないかのチェックとか、値がいくつ含まれているかをオブジェクトリテラルに収めるなど。
重複があるかどうかをチェックするにはSetオブジェクトを使った方法が簡単そうです。
JavaScript重複についての参考ページ
JSのオブジェクトリテラル(自分用メモ)
JSのオブジェクトリテラルでキーの名前を指定する方法はドットで繋げるか、[](ブラケット)で指定するかの2種類。
例えばなんですが、
という連想配列があったとして、titleの値を引っ張りたい時は
blog.title
又は
blog["title"]
で記載するわけですが、これ、キーが変数だった場合はブラケット表記じゃないと正しく引っ張れないという事を知りました。
ブラケット表記の場合ってクオーテーションで囲うじゃないですか。だから変数はクオーテーションで囲わないからドットで表記するものだと思い込んでおりました。
こんな感じですかね。
変数(又は定数)testにtitleというワードを代入して変数testをキーとして呼び出す。
blog.testだとundefinedになります。
これは知らなかったので良かった。勉強になりました。
試してみて知る事が沢山あります。まさしく「実験」ですね。
JSのDateクラス
let d = new Date(); ←引数を指定しない場合は変数dに現在の日時が代入される。
注意点としては「月」は0~11の数字が返される。つまり、1月だったら0、9月だったら8が返される。これがややこしく感じてたまりません。
その理屈だと2020年9月2日を表したい際は「new Date(2020, 10, 2);」としなければならない。と思ったのですが、直接引数に値を入力してgetMonth()で月の値を引っ張るとちゃんと9が返ってくるんですよね。
う~~~~ん、わからない。
直接数値で入れた場合はその値が返るのでしょうか・・・
indexも0から始まるけど、そもそも何でもカウントは1から始まるものだと思って生きてきた人間にとってはあるあるですよね(笑)
こればかりは慣れるしかないし慣れるまでは仕方がないのだろう。
でもだったら年や日も0から始めればいいのに、そして他の言語だったら月も1から始まる値が返されたりするのに~と、不満タラタラです(笑)
16進数とかも正直難しく感じます。16進数を使う機会は今のところないんですけどね、CSSの色指定だってカラーパレットを使えば済む話だし。
そして、Dateクラスのオブジェクトから値を得るメソッドについて、
getFullYearとか、getFullMonthは読んで字のごとく年なのねとか月なのねとわかるのですが、
日はgetDateで、getDayは曜日を取得します。私は日を取得するのはgetDateだと思い込んでいました。こういうのは慣れるしかないしそもそもググりながらコードは書くものだからそこまで気にしなくてもいいのか。
問題は直接値を入力してgetMonth()で月の値を取得した時に0~11の値で返ってこない問題です。マジで腑に落ちないです・・・
学習用メモ
今日の習得(TEXT関数)
本日習得した関数はエクセルのTEXT関数です。
参考にしたのはこちらのサイト
一つのセルのなかに文字列と合計値の計算式の入っているセルの値を組み合わせたかったんです。
文字列をダブルクォーテーションで囲って&とセル番号を組み合わせれば出来るんだけど、それだとカンマが入らない。
どうしたものかと悩んでいたところこの関数に助けてもらいました。
TEXT(値,"表示形式")
1つ目の引数には値や値の入っているセル番号を、二つ目の引数には表示形式をダブルクォーテーションで囲って渡してあげます。
だから前に¥マークをつけたいだとか、後ろに円という文字をつけたいだとか、間にカンマを入れたいだとか思い通りの値を返してもらえます。
金額だけではなくて日付も加工できるようです。助かった~!
今日は仕事で見積書の作成を依頼されたので適当に作っていました。
うちの職場はなかなかパンチが効いていて、エクセルなのに計算式を使わずに単価×個数の売価とか合計値を電卓で計算してその値を入力しているのですwwww
そのテンプレートを見てあまりにも酷いと思ったのでとりあえず掛け算や縦計算などは計算式を入れた。
あとは数値を入れない(金額を入れない)ところは0という値が入ってしまうので空白にするためにIF関数で個数が空白だったら空欄を、そうでなければ計算後の値を入れた。
こういうのは関数の勉強をしてから入れるようになった事。以前はわざわざ手入力で0を消していた。
IF関数を大分扱えるようになったなと驚いた。ワークシート関数を勉強し始めた頃、IF関数なんて苦手中の苦手でさっぱり理解出来なかった。今でもネストしまくっているとわけが分からなくなるけれど基本的には理解出来る。
VBAや他のプログラミング言語学習の中でIFは使うというか使いまくるので嫌でも概念を理解出来るようになったのだなとつくづく感じた。
プログラミング言語を学んでいるとIFどころかswitchやらcaseやら色んな条件分岐を使えなければならなくなる。学習の奥深さを感じたし、やはり続けて頑張ってやっていると色んな事が身に付くのだなと実体験として感じてすごく嬉しくなりました。
積み上げの大切さを感じました。
成長
Paizaラーニングのスキルチェック演習の問題からして理解出来なかったという話のその後ですが(しかも私がチャレンジしようとしていたのはスキルチェック問題ではなくて「レベルアップ問題」だったという大間違い)
無事に標準入力の何たるかも理解してDランクのレベルアップ問題は正解できるようになりました!!
これだけでも私にとっては物凄い進歩なんですよ~~~~~!
で、満を持して先日本当のスキルチェック問題にチャレンジしてみたところ、またまた問題の意図を読み誤ってなかなか正解に辿り着けなかったものの、どうにか制限時間内に正解することが出来て、一応ランクDを取得できました!(拍手!!)
本当にね、小さな小さな成長を少しずつ積み重ねる事でしか私には達成出来ないのです。
もともとのセンスのある人や自頭の良い人だったらさらっと動画を見ただけで全部理解してもっともっと上のランクの問題も正解を出せてしまうんでしょうけれど、
私はそうではない。「そんな事で足止め喰らってるの???」みたいな内容でも本当に分からなくてどうしても理解出来なくてそこに何時間も何十時間も費やしたりしている状態です。
でもそれは仕方が無い。それで諦めてやめてしまえばその時点で一生涯前に進むことは無いし、理解が深まる事もない。
今理解出来ずに悩んであれこれ調べている内容が小さな努力の積み重ねでもしかしたら腹落ちする日が来るかもしれない。何もしなかったらそんな日は絶対に来ないわけですから。
ゆっくりでもかまわないから、どんなに時間がかかってもかまわないから。
これからもっともっと成長出来ることを目標に、どうせなら目標は大きくSランク取得位で!もちろん今の目標はCランクの取得です。
今の自分にはCランクは激ムズです。でもCランクを普通に解けるレベルまで引き続き学習を続けるつもりでおります。
Ruby学習 メモ書き
今日知った事。
条件部分(while~~~など条件を記す部分)にchompメソッドは使えない!!!
なんだよ~
使えたら楽で便利なのに~←
つまりは複数行に渡る文字列を配列に取り込みたいとして、
複数行に渡っているから末尾の改行は削除したいわけ。
だからchompメソッドを使いたい・・・。
ついつい
while comand = gets.chomp
puts comand
end
とやりたいんですが、条件部分にchompメソッドが入っているとエラーになる。
横着したらダメですね。
条件はgetsで取り込んで終わり、
その後条件式終了後の部分で変数.chompで改行を取り除きましょう
そして、whileのようにループさせている場合はchompのあとにエクスクラメーションをつけて壊滅的に改行削除メソッドを実行させる必要があるようです・・・
そうしないと繰り返した時にまた改行が含まれてしまうから・・?かな?正直よくわかっておりません。
ちょっとここはループさせないバージョンと比べて実験してみるしかなさそうですね・・・