甘くてさくさく?んなわきゃない

N予備校日記、その他雑記、備忘録

Paiza の プログラミング練習問題「多重ループ」を考える過程メモ(JavaScript) その1

(まだ解けてません)

練習問題に関しては問題やコードについて語っても良いという事で。

これですね。

paiza.jp

for文を使った初心者向け問題の中の一つ。

問題を簡単に噛み砕くと、入力されたある言葉にある文字が入っていれば「YES」、入っていなければ「NO」と出力するという問題。

入出力例1では

入力例1

1
a
2
paiza
kyoko

出力例1

YES
NO

例2では

入力例2

2
c
d
2
cat
dog

出力例2

YES
NO
NO
YES

のように、言葉と文字の組み合わせ分、出力が増えていく処理を考えていく。

また出力の順番も重要で例2の場合

  1. cはcatに含まれている?→「YES」
  2. cはdogに含まれている?→「NO」
  3. dはcatに含まれている?→「NO」
  4. dはdogに含まれている?→「YES」

という順番で処理されてることが分かる。

PaizaのJavaScriptは標準入力の形がちょっと分かりづらいのだが

let lines = ["1","a","2","paiza","kyoko"];

という感じで、linesという変数に配列で格納されて用意されてるのでこれを使うことになる。

必要そうな変数の準備。

(最初に全部用意したわけでなく、考えながら増やしてます)

        let m = parseInt(lines[0]); //文字の数
        let n = parseInt(lines[m + 1]); //言葉の数
        let mN = parseInt(lines[1]); //最初の文字が格納されている配列番号
        let nN = m + n; //最初の言葉が格納されている配列番号
        let c = ; //文字を入れる空の配列
        let s = ; //言葉を入れるからの配列

PaizaでJavaScriptをやってて最初に詰みそうなポイント。

標準入力で渡された1とか2とかの数字はおそらく?文字列の型になっているので、

parseInt()やNumber()などのメソッドで数値に型変換しないと使えない時があるぞ!

for (let i = 1; i <= m; i++) {
            c += lines[i] + " ";
        }

        c = c.split(` `);
       
for (let i = nN; i <= lines.length - 1; i++) {
            s += lines[i] + " ";
        }
       
        s = s.split(` `);

文字と言葉の文字列を変数cとsそれぞれに配列で格納するための処理。

まずはfor文で空白が入るように文字列連結してからsplit(` `)で分割して配列にしてますね。

sの方のfor文は前提が独特だな・・・。

例1でいうとnNは3、lines.lengthは配列の中の数5を-1で4となり

3スタート4以下までのループでpaizaとkyotoの2回分回るということになります。

最初のループで"paiza"と" "が連結した"paiza "がsに入り、

2回目のループで"paiza "の後ろに"kyoto "が連結して"paiza kyoto "がsに入ってます。

それをs.split(` `)して空白部分で文字列分割し、sの中身は["paiza","kyoto"]となります。

 

ここからが多重ループになるんだろうなーと感づいたものの

考えようとすると頭が爆発しそうになり・・・

少し間が空いたのですがとりあえず肝となる文字が入ってるか判定して出力する部分から書いてみよう!

として書いたのが

for(let i = 0;i < n;i++){
            let sSplit = lines[nN + i].split(``);
            for(let i = 0;i < sSplit.length;i++){
            if(sSplit[i] === lines[m]){
                console.log("YES")
                break;
            }else if(i === sSplit.length - 1){
                console.log("NO");
            }
        }
}
 

解説に飽きてきたので簡単に

一番外側のfor文は言葉の数分だけループします、この例では2回。

sSpilitは言葉、例えば"kyoto"なら["k","y","o","t","o",]と一文字ずつ格納する変数。

その内側のfor文はsSpilitの文字数の回だけループします、この例では5回。

if文、["k","y","o","t","o",]のそれぞれと、この場合はaを比較して同じだったら「YES」と出力してbreakでループも終了します。

文字数回ループしても同じではなかったらelse ifに分岐して「NO」が出力されます。

この条件を書かずにelseで処理をすると同じではなかった文字数分だけ「NO」が出力されることになるので重要。

 

出来た!と思ったのだが

これだと例2のような文字が2つ(cとd)用意されてる場合でも1度しか判定出来ない!

ので!

その機能は明日に追加したい!のだが忘れてしまいそうな為のメモでした。

(if文の外側にもう一個ループ作ったらできそうじゃね?)

プログラミング再開の目標メモ【3年半ぶり?】

 

ということでプログラミングをしてる。

3年半前にプログラミングをやらなくなってしまった理由については

正直、何も覚えてないしブログにくらい書き残しておけよと思ったので

今回は目標くらいはメモっておこう、ということで・・・。

 

今は復学として「Progate」の有料プランに入って「WEB開発コース(Node.JS)」を進めている。

プログラミングのことなんてすっかり忘れていたので何も覚えていないと思いきや

手を動かしてみると意外と覚えてることもあって楽しいね。

 

「WEB開発コース(Node.JS)」を完走したら

penpen-dev.com

の記事を参考にしながら「N予備校」に復帰して「プログラミング入門コース」を走り切りたいなー!

とりあえずセール中だったのでUdemyの「【JS】ガチで学びたい人のためのJavaScriptカニズム」

は購入済みである。

www.udemy.com

 

復帰しようと思った理由は

前から「Processing」がやってみたくて

それをふと思い出したのと、

体調がずっと良くなくてそれがプログラミングを辞めた時期と重なってるのだけど

最近ちょっと安定してきたのが大きい、かな?

 

目標としては

一応「作曲」は出来るので

Processingと音楽データを連携させて遊びたいというのがある。

www.youtube.com

 

もうひとつは

最近切り絵をやっていて下絵も自分で描くようになったのだが、

アナログな手書きよりもデジタルのほうが向いてるような気がしていて、

幾何学模様を自分で生み出してそれを切り絵にしたら面白いかなと思っていて。

Adobe系のクリエイティブツールでも良いんだけどプログラミングを介してやってみたいんだよね~。

 

そんな感じです(完)

 

ちなみに

このブログを読み返してたら「Processing」に興味があるということが書いてあって

そこはブレてないなーと思った!

25~27日目

やったこと

2章09.HTTP通信

2章10.通信をするボットの開発

2章11.GitHubでWebサイト公開

2章12.イシュー管理とWikiによるドキュメント作成

2章13.Git と GitHubの連携

↑の解説動画を見た

 

感想

Web公開きたね!

前回、乗り気に慣れないと言ってから更新出来なかったからさぼってる感出てるけど、まあちゃんとやってます。

今更だが、2章のテーマが準備しよう!だからさっさと進めるべきだったな(反省)

 

24日目

やったこと

2章05.vi

2章06.シェルプログラミング

2章07.通信とネットワーク

↑全部の解説動画試聴

感想

ちょっと乗り気になれないので、面白そうなことが出てくるまでとりあえず動画を見てみよう、という。

通信とネットワーク の話は面白かったな。

パケットの仕組みとか、別にどうも思ってなかったけど少し興味が沸いたかな。

2章で何をやるのか未だ不明だけれど、まあネット上に自分の場所を作る感じなのかな~。

viと見てまずVoが思い浮かんだ。某委員長関連のね。あれ好き。

23日目

やったこと

2章04.標準出力

感想

まあなんというか面白くはないかな。

コマンドだけの操作を信用してないというのが大きいだろうか?

現代っ子だからGUIに頼り過ぎ~とか思ってみたり…。

下書きのままだったので公開遅れ

22日目

やったこと

戦闘力メーターの開発(復習というより遊び)

感想

1章を終えた時に言っていた、戦闘力メーターのプログラムをこねくり回している。

1章で作った診断メーカーは、入力された名前が同じならば結果も同じだったのに、戦闘力メーターはランダムな数値が吐き出される仕様でいいのか?という疑問。

色々考えた結果、基礎戦闘力は名前で固定、覚醒戦闘力はランダムという仕様なら面白いのではないのか!?と思いついた。

そうなると将来的には対戦モードの実装もあるな~とか、TwitterのIDを入力したらTwitterのニックネームを取得してきて測定、みたいなことも出来るんだろうか?みたいな夢がひろがりんぐ。

まだ全然途中なのだが、やはりプログラムを考えるのは楽しく感じる。

HTML・CSSのガワはある程度作ったが今は全く機能せず、その横のchromeのconsoleでしか結果が見れない感じも楽しい。

さて、本日はN予備校分が0だったので解説動画をかけながら寝ます!

21日目

やったこと

2章03.ファイル操作

感想

ubuntu内でのディレクトリ(フォルダ)関係の操作。

GUIがなく、コマンドで動かすパソコンという楽しみもあるにはあるが…。

何をするかまだ見えてこないのもあって正直、退屈だな。

そういえば、2章から授業動画だけじゃなくて解説動画っていうのも増えてるな。

解説動画は後から見る自分的には授業よりもいい!