HomeRPAブログページ活動ブログプログラミングの練習課題をBizRobo!で解いてみた

BizRobo!ブログ

こんにちは!

RPA新人開発者の戸波です。

 先日、私のプロジェクトチーム内でこのようなプログラミングの練習問題が話題にのぼりました。
「00:00~23:59までの1分刻みの「ゼロ埋めの」時刻を、PHPを使って1つずつ改行して出力してください」
他の方はPHPを使っていろいろな解答をされていたのですが、私はプログラミングの経験が浅く、解答を作り上げるのに時間がかかりうまくできずにいました。
ですが、私が今まで勉強してきたBizRobo!のロボットを使えば、プログラミング経験が浅くても問題の解答はできるのではないかと思いました。
また、いろいろな課題についてロボットを作りながら考えることで、業務に合わせたロボットを開発する時にも活かせるのではないかと考えました。

七夕ぴょこ 

 今回は、自分のスキルアップや学習も兼ねて「プログラミングの練習課題をBizRobo!で解いてみた」ことについてお話しします。
最後までお読みいただけますととてもうれしいです。
よろしくお願いいたします!

 

問題の説明


 改めて、今回の問題はこちらです。
「00:00~23:59までの1分刻みの「ゼロ埋めの」時刻を、PHPを使って1つずつ改行して出力してください」

 「ゼロ埋め」とは、指定された桁数を満たすまで、指定された方向に対して桁を0で埋めるということです。
5桁の桁埋めであれば00010といった、前方を0埋めする方法がよく利用されています。
会員番号表記などで見かけることが多いですね。
例えば、0時9分であれば00:09のような表記になります。
つまり、出力時は以下のように表示させる必要があります。

時刻表示例

 

作成した解答


 私が作成した解答は以下の通りです。
他にもたくさん答えはありますので、ぜひみなさまも考えてみてください!

全体フロー


このロボットを動かすために利用した変数は以下の4つです。

使用変数2.png


「minute」に、取得した「分」の値を保存します。
「hour」に、取得した「時」の値を保存します。
「時刻」に、0埋めや:を入れるなどで表記を整えて「hh:mm」の形式にした時刻を保存します。
「ログ出力用時刻」に、ループごとに「時刻」の値を追記していく形で値をとり、最終的に出力します。
「minute」「hour」「ログ出力用時刻」の3つはグローバル変数にし、ループをまたいでも値がリセットされないようにします。

 全体の流れとしては、以下のようになっています。

  1. 「hour」の値によって条件分岐、必要であればゼロ埋めし、「hh:」の形式で変数「時刻」に保存する
  2. 「minute」の値によって条件分岐、必要であればゼロ埋めし、1. で保存した変数「時刻」に「mm」の形式で追記する
    この時、「時刻」には「hh:mm」の形式で値が入っている
  3. 「minute」の値に1を足し、2. で加工した変数「時刻」を変数「ログ出力用時刻」に追記する
    ループ2周目以降は変数「ログ出力用時刻」はhh:mm hh:mm…の形式となる
  4. 1. ~3. までを繰り返す
  5. 「minute」が60になるまで繰り返したら「hour」の値に1を足し、「minute」の値を0にして、4. に戻る
  6. 「23:59」まで「ログ出力用時刻」への値の保存ができたら、ログ出力する

 

 1. 「時」部分のループ

 まず、フローの前半部分について説明します。
変数「hour」と「minute」にそれぞれ0を保存します。
「hour」の値が1桁(0時~9時)かどうかの条件分岐を作ります。
「hour」の値によって条件分岐し、「hh:」の形に表記を整えてから「時刻」に値を保存します。

フロー前半


「変数の割当」ステップで、「hour」の値が1桁の場合はゼロ埋めし、そうでない場合はそのままの状態で変数「時刻」に「hour」の値と:を保存します。

hourの値

 

 2. 「分」部分のループ

 次に、フローの後半部分の変数「minute」の値の条件分岐について説明します。
「minute」の値によって条件分岐し、「hh:mm」に表記を整えて「時刻」に値を上書きした後、「ログ出力用時刻」に値を保存します。

フロー後半


「minute」が1桁(0分~9分)であるかについて、当てはまる場合はゼロ埋めし「時刻」に「minute」の値を追記します。
このとき、「時刻」にはhh:mmという形で値が保存されています。

minuteの値1


当てはまらない場合は、「minute」が60の場合と「minute」が10~59の場合の条件分岐に進みます。
「minute」が60の場合は「hour」に1を足し、「hour」の値が24でない場合、つまり0時から24時までの時刻表示ループがまだ終了していない場合は「minute」に0を保存して、次の1時間分のループをできるようにします。

minute6


「minute」が10~59の場合は、「時刻」に「minute」の値をそのまま追記します。
このとき、「時刻」にはhh:mmという形で値が保存されています。

minuteの値3


 「時刻」の値を、「出力用の変数作成」ステップで「ログ出力用時刻」に保存します。
「評価:ログ用出力時刻 == "" ? INPUT : ログ出力用時刻 + "\n" + 時刻」では、「ログ出力用時刻」の値が空であれば「時刻」の値を保存し、空でなければログ出力用時刻の値の後ろに改行と「時刻」の値を追記します。

ログ出力用時刻割当


なお「hour」が23、「minute」が60の状態の時には日付が変わり表示条件(00:00~23:59)を満たさなくなるためループを終了し、変数「ログ出力用時刻」をログ出力します。
私の作ったロボットを動かしたとき、ログには以下のように出力されます。

ログ出力

 

上司が作ったロボット


 今回の練習問題に対して、私の上司は以下のようなロボットを作成していました。

プログラミング BizRobo模範解答


このロボットを動かすために利用した変数は以下の通りです。

模範解答 変数


このロボットの全体の流れを説明します。
「Assign 時刻」で現在日時を「yyyy-MM-dd 00:00:00」の形で取得して「時刻」に保存した後、「Repeat」でループに入ります。
現在日時をそのまま取得するのではなく、「00:00:00」で取得しておくことがポイントです。

時刻取得


「Write Log」で「時刻」を出力時に、エクスプレッションで「hh:mm」の形になるようにしてからログ出力します。
ここでは、先ほど「yyyy-MM-dd 00:00:00」の形式で取得した「時刻」の値を、shortTime関数で「hh:mm:ss」という値に置き換え、さらにsubstring関数を使って最初の文字から5文字分、「hh:mm」の部分だけを取得し、出力する処理となっています。
つまり、shortTime関数で「00:00:00」の形式に置き換えた後、substring関数で最初の文字から5文字分だけを取得し「00:00」の形にして出力しています。
なお、この時「時刻」に保存されている値の形式は変化しておらず、出力時の値の形式だけが変化している点がポイントです。

模範解答 ログ出力


「Assign 時刻」で「時刻」の「分」を1分進めます。

模範解答 1min


「Test Value」の条件分岐では、「時刻」とnow関数で取得した日付が一致しているかを調べます。
同じ場合はループを続行し、異なる場合、つまり00:00~23:59までをすべて出力し日付が翌日まで進んだ状態の時は、処理が終了した旨をログ出力し、ループを終了します。

模範解答 条件分岐

 

感想


 上司が作成したロボットを見て改めて自分のロボットを見直してみたのですが、私が作成したロボットでは「時」の部分を毎分毎分ループしている部分があり、そこが無駄な動きだなと感じました。
上司が作成したロボットのように現在日時を利用することで、1分足し続けて1時間進むときも特に変数の操作は必要なく「時」の部分が1時間分進んでくれるようになっているのは、ステップ数の削減にもなるので良いアイデアだと思いました。
また私が作ったロボットのように、時刻を出力するためだけの変数を用意しなくても、上司が作成したロボットのようにログ出力ステップのエクスプレッション等を利用して、変数を指定の形で出力されるようにするやり方をとることで、出力用に変数を用意しなくてもよくなり扱いが楽になるな、と思います。

問題を解くという観点においては、正しい結果が得られればよいので私の解答でも十分かもしれませんが、できることなら無駄なく早く最低限のステップ数で動くロボットの方が間違いなくよいはずです。
ブランチやループ、イテレーションなど、何度使っていても苦手意識が残ってしまっているので、プログラミングの練習課題をBizRobo!で解ける限り解いて、処理が早く無駄のないロボットの開発につなげていきたいと思います。

不定期にはなりますが、いろいろなプログラミングの練習問題をBizRobo!で解くブログは続けていく予定です。
みなさまもぜひチャレンジしてみてくださいね!

今回も、最後までお読みいただきありがとうございました!

大阪本社
〒541-0056
大阪市中央区久太郎町2-2-7 山口興産堺筋ビル3階  アクセスマップ
TEL:06-6266-0440   FAX:06-6266-0450