【JKI】028_Left_Triangle_Star_Pattern
【JKI_028】課題を確認
Just KNIME It! (JKI)
今回の挑戦はこちら
問題文をGoogle翻訳し少し加筆して以下に
星を並べて三角形を作ると言うことですが、表題のLeft TriangleのLeftって本来はRightではとも思いつつスタートです。
【ハードコーディング】
実はハードコーディングしてよかったら1ノードで解けますよね。
まあ結果までは示さないです。これを上記の制限条件下で解くとなんか大ごとになりました。
上記のWFのいい点といえば星の数の設定を変えるだけで、1から99までは星の三角形を数秒で出力できます。欲しくなりましたか?
結果例:
冗談はともかく以下解説に進みます。
【初期データテーブル作成】
今回は入力データファイルが指定されていないので、自分で設定しなくてはなりません。
ハードコーディングしないように、行数だけ決めて空テーブルを作り、作業用の一時利用カラムも追加するので4つもノードを使ってみました。以下設定を列記します。
設定:
結果: 初期値の入ったデータテーブル
【Recursive Loop】
今回の設計は、星の目標数のカラム(i_Star_Num)の数に達するまで各行一つずつ星を足していくループ処理をします。
こういう時はRecursive Loop一択かなと思います。
まっきーさんの記事が非常にわかりやすいのでお勧めします。
ああ、無限列車ももう懐かしい響きに。
本題に戻ります。
上図で流れは説明してあるので、各ノードの設定を紹介していきます。
設定:
Recursive Loop Start: デフォルトのまま
String Manipulation: Count関数で特定の文字(*)の数え上げ
Math Formula: 星の目標数に達していない列はTRUEすなわち「1」
Row Splitter: 星の目標数に達したかどうかで分岐処理
String Manipulation (星の目標数に達していない行のみが対象) :
Starsカラムに「*」を一つ足す
Recursive Loop End: 目標未達行が無くなるか、100回ループするまで繰り返し
上の入力ポート(ポート 0)は目標達成
下の入力ポート(ポート 1)は目標未達なので
ポート 1 のデータは Recursive Loop Start ノードに戻されます。
反復処理を続けるために必要なポート 1の最小行数を1
ループ実行する反復回数の最大値が100
と設定してあります。
最大数を増やせば原理上は無限に増やし続けられます。
結果:
ループがIteration = 0~5 の6回繰り返され、上から順に完了していってすべてが
i_Star_Numに定義された目標数だけのStarsになりました。
【解答完了】
設定:
結果:
なんか頑張っちゃったなぁと言う気分です。スクリプト ノードなしで公式解答がどう効率よく解くのか楽しみです。
あるいはJava Snippet
とかだと1つで何でもできそうですもんね。その解答例も見てみたいと思ったり。
KNIME Hubに解答は上げています。
おまけ:
【JKI_027 感想戦】
私の解答
と比較して、公式解答はすっきりしていました。
Regex Splitが効率よかったですね。
まあ、正規表現での設定ってこれぐらい凝りだすとノーコードではないと思ってしまいます。
JKI_013であれこれ悩んだのを思い出しました。
当時参考にしたのはこちら
上記記事での説明におけるバックスラッシュ「\」は上記ノードの「¥」と読み替えるとわかった気にはなりました。
Infocomが日本語化してくれたディスクリプションを引用すると
( )でグループ化された部分のみを抜き出してくる仕組みのようです。
ですから、
と3つの括弧でグループ化してみると
Addressから指定した情報を3種切り取ってくれますね。これは便利。
一つ賢くなった気がしました。
記事を読んでいただきありがとうございます。 先人の智慧をお借りしつつ、みなさんに役立つ情報が届けられたらと願っています。 もしサポートいただけるなら、そのお金はKNIMEの無料勉強会の開催資金に充てようと思います。