プログラミングの練習課題を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つです。
「minute」に、取得した「分」の値を保存します。
「hour」に、取得した「時」の値を保存します。
「時刻」に、0埋めや:を入れるなどで表記を整えて「hh:mm」の形式にした時刻を保存します。
「ログ出力用時刻」に、ループごとに「時刻」の値を追記していく形で値をとり、最終的に出力します。
「minute」「hour」「ログ出力用時刻」の3つはグローバル変数にし、ループをまたいでも値がリセットされないようにします。
全体の流れとしては、以下のようになっています。
- 「hour」の値によって条件分岐、必要であればゼロ埋めし、「hh:」の形式で変数「時刻」に保存する
- 「minute」の値によって条件分岐、必要であればゼロ埋めし、1. で保存した変数「時刻」に「mm」の形式で追記する
この時、「時刻」には「hh:mm」の形式で値が入っている - 「minute」の値に1を足し、2. で加工した変数「時刻」を変数「ログ出力用時刻」に追記する
ループ2周目以降は変数「ログ出力用時刻」はhh:mm hh:mm…の形式となる - 1. ~3. までを繰り返す
- 「minute」が60になるまで繰り返したら「hour」の値に1を足し、「minute」の値を0にして、4. に戻る
- 「23:59」まで「ログ出力用時刻」への値の保存ができたら、ログ出力する
1. 「時」部分のループ
まず、フローの前半部分について説明します。
変数「hour」と「minute」にそれぞれ0を保存します。
「hour」の値が1桁(0時~9時)かどうかの条件分岐を作ります。
「hour」の値によって条件分岐し、「hh:」の形に表記を整えてから「時刻」に値を保存します。
「変数の割当」ステップで、「hour」の値が1桁の場合はゼロ埋めし、そうでない場合はそのままの状態で変数「時刻」に「hour」の値と:を保存します。
2. 「分」部分のループ
次に、フローの後半部分の変数「minute」の値の条件分岐について説明します。
「minute」の値によって条件分岐し、「hh:mm」に表記を整えて「時刻」に値を上書きした後、「ログ出力用時刻」に値を保存します。
「minute」が1桁(0分~9分)であるかについて、当てはまる場合はゼロ埋めし「時刻」に「minute」の値を追記します。
このとき、「時刻」にはhh:mmという形で値が保存されています。
当てはまらない場合は、「minute」が60の場合と「minute」が10~59の場合の条件分岐に進みます。
「minute」が60の場合は「hour」に1を足し、「hour」の値が24でない場合、つまり0時から24時までの時刻表示ループがまだ終了していない場合は「minute」に0を保存して、次の1時間分のループをできるようにします。
「minute」が10~59の場合は、「時刻」に「minute」の値をそのまま追記します。
このとき、「時刻」にはhh:mmという形で値が保存されています。
「時刻」の値を、「出力用の変数作成」ステップで「ログ出力用時刻」に保存します。
「評価:ログ用出力時刻 == "" ? INPUT : ログ出力用時刻 + "\n" + 時刻」では、「ログ出力用時刻」の値が空であれば「時刻」の値を保存し、空でなければログ出力用時刻の値の後ろに改行と「時刻」の値を追記します。
なお「hour」が23、「minute」が60の状態の時には日付が変わり表示条件(00:00~23:59)を満たさなくなるためループを終了し、変数「ログ出力用時刻」をログ出力します。
私の作ったロボットを動かしたとき、ログには以下のように出力されます。
上司が作ったロボット
今回の練習問題に対して、私の上司は以下のようなロボットを作成していました。
このロボットを動かすために利用した変数は以下の通りです。
このロボットの全体の流れを説明します。
「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分進めます。
「Test Value」の条件分岐では、「時刻」とnow関数で取得した日付が一致しているかを調べます。
同じ場合はループを続行し、異なる場合、つまり00:00~23:59までをすべて出力し日付が翌日まで進んだ状態の時は、処理が終了した旨をログ出力し、ループを終了します。
感想
上司が作成したロボットを見て改めて自分のロボットを見直してみたのですが、私が作成したロボットでは「時」の部分を毎分毎分ループしている部分があり、そこが無駄な動きだなと感じました。
上司が作成したロボットのように現在日時を利用することで、1分足し続けて1時間進むときも特に変数の操作は必要なく「時」の部分が1時間分進んでくれるようになっているのは、ステップ数の削減にもなるので良いアイデアだと思いました。
また私が作ったロボットのように、時刻を出力するためだけの変数を用意しなくても、上司が作成したロボットのようにログ出力ステップのエクスプレッション等を利用して、変数を指定の形で出力されるようにするやり方をとることで、出力用に変数を用意しなくてもよくなり扱いが楽になるな、と思います。
問題を解くという観点においては、正しい結果が得られればよいので私の解答でも十分かもしれませんが、できることなら無駄なく早く最低限のステップ数で動くロボットの方が間違いなくよいはずです。
ブランチやループ、イテレーションなど、何度使っていても苦手意識が残ってしまっているので、プログラミングの練習課題をBizRobo!で解ける限り解いて、処理が早く無駄のないロボットの開発につなげていきたいと思います。
不定期にはなりますが、いろいろなプログラミングの練習問題をBizRobo!で解くブログは続けていく予定です。
みなさまもぜひチャレンジしてみてくださいね!
今回も、最後までお読みいただきありがとうございました!
<RPAの導入につきまして>
本Blogは、お役に立ちましたでしょうか?
RPAは、一般的な業務システムとは異なり、PoCを実施し、導入・運用開始で終わりでははありません。
導入時点からようやくスタートです。
業務効率化、人員最適化等の目標に応じた計画策定や人員配置、自動化ロボットの開発・運用といったPDCAサイクルが必要です。
弊社では、貴社の課題に適した自動化プランのご提案や開発者育成研修も実施し、貴社と並走したサポートをご提供いたします。
お気軽にお問い合わせください。
BizRobo!や弊社サポートについて詳しくはこちら >>> サービス紹介 - BizRobo! (自動化ツール)
■その他のBlog
- BizRobo! CAMPUS!!第11回~DA編~に参加しました!
- 【11.1】MCのメールトリガーを試してみました
- BizRobo! CAMPUS!!第7回~Chromium編~に参加しました!
- BizRobo!CAMPUS!!第9回~正規表現編~に参加しました!
- 【Robot-Hub】2段階認証ツールを公開しました
- AWSでBizRobo!Basicが動く環境を構築してみた
- 【Tips】ZIPファイルをコマンドライン実行で展開する
- BizRobo!からBoxにファイルをアップロードしよう 〜概要編〜
- 【続】AWSでBizRobo!Basicが動く環境を構築してみた
- Webページの情報を抽出し、CSVファイル出力するロボットを作ってみた