if(a == i || b == i || c == i){}
このような条件があった場合、簡略化できるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答9件
0
具体的に何を簡略化するかによります。また、変数の数にもよります。
単純にソースコードを打ち込むタイプ数であるならば、3つ程度なら元の形で十分でしょう。変化させる方がひどくなると思います。数が多いならば、配列に入れて検索が妥当です。ちなみに、左辺の方が整数定数ならこういう書き方もあります。
C/C++
1switch(i) 2{ 3case a: 4case b: 5case c: 6//条件合致時の処理 7break; 8default: 9}
そして、処理時間を短くするならば、変数の並びが影響します。iの可能性が高いものを優先的に判別することが望ましいです。整列済みならば二分探索が有効です。(ただし、整列をわざわざ前処理にするくらいなら全検索したほうが早い)
投稿2018/02/14 13:35
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
||
において、a==i
がtrue
のとき、後の式は評価されません。これを短絡評価といいます。
短絡評価の存在を加味すると、回りくどくてもそのままの書き方がいいような気がします。
(配列に入れて存在を確認する方法も短絡評価に似たような挙動かもしれませんが、「配列に入れる」という処理と、最後に評価する処理が追加で生じてしまいます。)
回答とは言えないかも…すみません。何か思いついたら追記しようと思います。
追記
処理が一つ増えますが、~~コードゴルフ的には、~~こんなのはどうでしょうか?
c
1if(!(a-i&&b-i&&c-i)) printf("true\n");
空白を除いた字数はc
までだと同じですが、変数の数が増えた場合は少しづつ減っていきます。
(ただあまりにも大量になった場合は配列や辞書に入れる、もとい配列や辞書で扱った方がいいですから、この方法は非推奨です。)
まぁ、i
を書く数は変わらないので、意味のない回答かもしれませんが。
投稿2018/02/14 09:33
編集2018/02/14 10:05総合スコア2043
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/14 09:46
2018/02/14 09:51
0
一部無駄な部分がありますが。
こっそりunordered_set
にすり替えておく…
c++
1#include <iostream> 2#include <algorithm> 3#include <unordered_set> 4 5int main() { 6 std::unordered_set<int> lookup = {1, 2, 3}; 7 int a; 8 std::cin >> a; 9 if (lookup.find(a) == lookup.end()) { 10 std::cout << "NOT FOUND" << std::endl; 11 } else { 12 std::cout << "FOUND" << std::endl; 13 } 14 return 0; 15}
投稿2018/02/14 08:49
編集2018/02/15 00:50総合スコア8560
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
テクニックとしては、他の方が書かれているように、色々あろうかと思います。
なので、ちょっと視点を変えて、簡略化の目的が何かということについて。
おそらくタイピング量を減らしたいということだろうかと思いますが、それによってロジックが判りにくいものになったら本末転倒です。
今のコンパイラは中々優秀なのと、PCも速度が速いので余程のことがない限り速度的なチューニングというのは、if文に関しては無いだろうと思います。
であるならば、見通しの良い、メンテナンスのし易い、誰が見てもわかりやすいコードを書くのが良いと私は思います。
投稿2018/02/20 08:17
総合スコア3579
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
簡略化の目的が推測になってしまうのですが、
(推測が外れていたらすみません。)
A)「3つの要素のいずれか」が「指定の数字」と同じか判断することが目的
B) 目的は1つなのに if で 条件式が 3つも必要。
という、A)という1つの目的に B)のように条件式が3要素になってしまうので簡略化できないか?
という意味で質問されているのであれば、
あまりお勧めの方法ではありませんが、マクロでどうでしょうか?
/// マクロ #define OR_EQUAL3( a, b, c, i, result ) if ( a == i || b == i || c == i ) { result = true; } else { result = false; } /// コード bool result = false; OR_EQUAL3( a, b, c, i, result ); if( true == result ) {}
投稿2018/02/17 05:12
総合スコア88
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/17 12:30
2018/02/18 04:00
0
簡略化をどう捕らえるかによりますが、別の書き方にするのであれば方法はいくつかあると思います。
言語によっても異なりますので、言語を特定したほうがより良い回答が得られると思います。
とりあえずC言語の場合を回答しておきます。
C言語の場合、言語的な制約が多いので、関数化してしまうのが手っ取り早く、また汎用的と思われます。
ですが、この場合main関数から見れば簡略化されていますが、内部的には圧倒的に処理量が増えています。
c
1#include <stdio.h> 2#include <stdarg.h> 3 4int find(int val, int argc, ...) 5{ 6 va_list arg; 7 int i; 8 int ret = 0; 9 va_start(arg, argc); 10 for(i = 0; i < argc; i++){ 11 if(val == va_arg(arg, int)){ 12 ret = 1; 13 break; 14 } 15 } 16 va_end(arg); 17 return ret; 18} 19int main(void){ 20 int i = 1; 21 int a = 2, b = 3, c = 4; 22 if(find(i, 3, a, b, c)){ 23 printf("found\n"); 24 } else { 25 printf("not found\n"); 26 } 27} 28
投稿2018/02/15 00:08
総合スコア16998
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C++
1#include <iostream> 2#include <algorithm> 3 4int main() { 5 using namespace std; 6 int a=1, b=2, c=3; 7 int i=2; 8 auto target = { a, b, c }; 9 if ( any_of(begin(target), end(target), [=](auto x) { return x == i;}) ) { 10 cout << "ok.\n"; 11 } 12}
簡略化されてない... orz
セールスポイントは
- 比較対象となるtargetの要素数がいくつでもok. 配列でもok. vector/list/setモロモロok.
- 条件式をlambdaで追い出してるので、==だけじゃなく!=だろが<だろが...
- 短絡評価もできてるよ♪
投稿2018/02/14 23:51
編集2018/02/15 00:17総合スコア16614
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。