チャレンジ #280: シーケンシャルロジック
- RSS フィードを購読する
- トピックを新着としてマーク
- トピックを既読としてマーク
- このトピックを現在のユーザーにフロートします
- ブックマーク
- 購読
- ミュート
- 印刷用ページ
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- モデレーターに通知する
こんにちは、Maveryx
先週の課題の解決策はここで見つけることができます。
Patrick Digan (@patrick_digan) さんがあなたの論理スキルをテストする今週のチャレンジを送っていただきました。素晴らしいチャレンジを送っていただきありがとうございます、Patrickさん!
あなたは以下のようなデータセットを持っています。
Record |
A |
B |
C |
1 |
1.0 |
0.0 |
0.0 |
2 |
1.0 |
0.0 |
0.0 |
3 |
2.0 |
1.0 |
0.0 |
4 |
? |
? |
? |
あなたのタスクは、レコード4から25までの行を生成することで(1から3はこのままです)、それぞれの行に対してA、B、Cの値を計算しなければなりません。
カラムA、B、Cのレコード4から25の値を決めるロジックは以下のとおりです。
- カラムA:前の行のすべての数値を合計します
- カラムB:前の行のAからBを引き算します
- カラムC:前の行のAからBとCを引き算します
ヒント:レコードごとに値を計算する必要があります
レコード4の例:
A=2+1+0=3
B=2-1=1
C=2-1-0=1
レコード5の例:
A=3+1+1=5
B=3-1=2
C=3-1-1=1
復習が必要ですか? アカデミーで次のレッスンを復習してください。
健闘を祈ります!
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- モデレーターに通知する
できました。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- モデレーターに通知する
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- モデレーターに通知する
あまり美しくないですが、マクロなしでもやってみました。
Formula Tool
ABC = ToString([A]) + " " + ToString([B]) + " " + ToString([C])
Multi-Row Formula
IF [Record] <= 3
THEN [ABC]
ELSE
ToString( ToNumber(GetWord([Row-1:ABC], 0)) + ToNumber(GetWord([Row-1:ABC], 1)) + ToNumber(GetWord([Row-1:ABC], 2)) )
+ " " +
ToString( ToNumber(GetWord([Row-1:ABC], 0)) - ToNumber(GetWord([Row-1:ABC], 1)) )
+ " " +
ToString( ToNumber(GetWord([Row-1:ABC], 0)) - ToNumber(GetWord([Row-1:ABC], 1)) - ToNumber(GetWord([Row-1:ABC], 2)) )
ENDIF
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- モデレーターに通知する
できました!
横持ちのままやるのは、、、かなりおすすめできないですね、、、(Advent of Codeの時に何度かこの方法で処理しています)。
横持ちのままやる場合は、
ToString([A])+":"+ToString([B])+":"+ToString([C])
で3つの値を一つのフィールドに結合して放り込んで、
IF [ABC]="::" THEN
ToString(
ToNumber(GetLeft([Row-1:ABC], ":"))+
ToNumber(GetPart([Row-1:ABC], ":",1))+
ToNumber(GetPart([Row-1:ABC], ":",2))
)+":"+
ToString(
ToNumber(GetLeft([Row-1:ABC], ":"))-
ToNumber(GetPart([Row-1:ABC], ":",1))
)+":"+
ToString(
ToNumber(GetLeft([Row-1:ABC], ":"))-
ToNumber(GetPart([Row-1:ABC], ":",1))-
ToNumber(GetPart([Row-1:ABC], ":",2))
)
ELSE [ABC] ENDIF
といった感じで値を分解しながら処理を行っています・・・。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- モデレーターに通知する
できました。
英語版の回答をそのまま使っていますが、処理がうまくいかなかった記憶あり。お二人のWFを勉強してみます。
ただ株が下がってそれどこじゃないですね。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- モデレーターに通知する
できました。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- モデレーターに通知する
Designer Cloud (Trifacta)でやってみました。さすがに無理やりになりました・・・。
美しくないのですが、マクロを使ってみました。繰り返しマクロはたぶんできないと思うので、マクロを繰り返し答えが出るまでコピペしています。
マクロの中身:
ポイントは、RANGE関数で行生成みたいなことができることでしょうか。ただ、複数行フォーミュラが新規列の過去の行を参照できない(っぽい)ので今回のように1行ずつ作っていく形になりました。惜しいなぁ・・・。
Designer Cloud(Designer Experience)でもガリガリツール置いていけばできそうですね・・・。
Designer Cloud(Designer Experience)版です。力技でもやれば答えは出せます!