見出し画像

【JKI】028_Left_Triangle_Star_Pattern

【JKI_028】課題を確認

Just KNIME It! (JKI)

今回の挑戦はこちら

問題文をGoogle翻訳し少し加筆して以下に

課題28:左の三角形の星のパターン
レベル: 簡単
説明: この課題では、ちょっとしたロジックを組み立てて、下に示すように星を並べた三角形を作成します。出力は、パターンの各行が表の対応する行に入るようなものになります。
PS パターンをハードコーディングしないでください。
*
**
***
****
*****
******
 
ボーナス チャレンジ: スクリプト ノードまたはコンポーネントを使用しないでください。

星を並べて三角形を作ると言うことですが、表題の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の無料勉強会の開催資金に充てようと思います。