質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

9回答

2855閲覧

適切な分岐処理について

ssbb0212

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

3グッド

7クリップ

投稿2017/07/19 02:10

###前提・実現したいこと
以下のような簡単な図の分岐処理のスマートな書き方について

AB重要度
××低い
×普通
×やや高い
高い

###該当のソースコード

C#

1 2if(A == "×" && B == "×"){ 3 4 Console.WriteLine("低い"); 5 6}else if(A == "×" && B == "○"){ 7 8 Console.WriteLine("普通"); 9 10}else if(A == "○" && B == "×"){ 11 12 Console.WriteLine("やや高い"); 13 14}else if(A == "○" && B == "○"){ 15 16 Console.WriteLine("高い"); 17 18} 19 20 21

###試したこと
図に従ってコーディングしますと、すぐに思いついたのが上記のような書き方になります。

ただ、簡単なものであればこのような書き方をしてしまっても良いと思うのですが、
より複雑になった場合は、ただ分岐が増える事になり、あまりスマートな書き方ではないと思ってしまいました。

何か他に良い書き方はありますでしょうか。

よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
言語は問いませんが、出来ればPowerShellであると助かります。

takotakot, r_ym, shimizukawa👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmp

2017/07/19 03:41

複雑になった場合とは、どのようことを想定していますか?
think49

2017/07/19 11:28

「複雑になった場合」は「2次元構造から3次元構造->4次元構造と増えた場合」を想定しましたが、それで良いのでしょうか。
tmp

2017/07/24 03:50

ありがとうございます。いっぱい回答でて、もう回答するほどのものはもってないです。
guest

回答9

0

Javaで回答します。
まず、以下のような列挙型クラスを作成します。

Java

1public enum Judge { 2 LOW("×","×","低い"), 3 NORMAL("×","○","普通"), 4 SLIGHTLY_HIGH("○","×","やや高い"), 5 HIGH("○","○","高い"), 6 UNKNOWN("-","-",""); 7 8 private final String a; 9 private final String b; 10 private final String message; 11 12 private Judge(String a,String b ,String message){ 13 this.a = a; 14 this.b = b; 15 this.message = message; 16 } 17 18 public static String getMessage(String a,String b){ 19 return Stream.of(Judge.values()) 20 .filter(j -> j.a.equals(a) && j.b.equals(b)) 21 .findAny() 22 .orElse(UNKNOWN) 23 .message; 24}

これを使用する場合は以下のようになります。

Java

1Judge.getMessage("×","○"); // 「普通」が出力

投稿2017/07/19 02:56

編集2017/07/19 04:13
mr-hisa-child

総合スコア294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kurokoba

2017/07/19 03:28

if文(switch文)をオブジェクトのポルモーフィズムで置き換えるというのはオブジェクト指向の基本的な考え方であり、M.ファウラーの「リファクタリング」でも最初の方でとりあげられています。 ssbb0212さんが該当ソースコードに"不吉な匂い"(※技術用語)を感じたなら健全で良い事だと思います。 なお状態定数自身に自身のやることを知ってるようなクラス設計というのはGoFのデザインパターンの一つstateパターンとして知られています。 Javaのenumはstateパターン書きやすいのだけど(他の言語と比べ特殊すぎますが)、他のOOP言語でもstateパターンは有効です。
swordone

2017/07/19 04:05

gerMessageの返り値は、orElseを使えば3項演算子いらずになります。
mr-hisa-child

2017/07/19 04:12

ご指摘ありがとうございます。ソースを修正致しました。
swordone

2017/07/31 16:24

すごい今更ですが、mapメソッドを使えばUNKNOWN要らずでは? findAny().map(x -> x.message).orElse("");
guest

0

選択肢に○でも×でもない場合があることを考慮する必要がありますか?
PowerShellの仕様はよくわかりませんが、もし配列がつかえるなら
全ての組み合わせを配列化しておけばよいと思います。

sample

せっかく何でサンプル

javascript

1var table = [ 2 {A:'×',B:'×','text':'低い'}, 3 {A:'○',B:'×','text':'普通'}, 4 {A:'×',B:'○','text':'やや高い'}, 5 {A:'○',B:'○','text':'高い'}, 6 ] 7function getText(a,b){ 8 var t=(t=table.filter(function(i){return i.A==a && i.B==b;})).length>0?t[0]:{"text":"不明"}; 9 return t; 10} 11console.log(getText('○','×').text); 12console.log(getText('○','□').text); 13

投稿2017/07/19 02:15

編集2017/07/19 02:52
yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2017/07/19 03:29

質問文の通りのif-else連鎖か、このテーブルを使った方法が多くの場合最良かと思います。 点数化して足し算する方法だと、行数は減らせるのですが今後の仕様変更に弱いです。
yambejp

2017/07/19 03:59

よくよく考えたらユーザー関数名getTextはゼンゼンダメですね textをとらずにobjectをとっているので 流用するならgetObject的な名称にするか、戻り値をtextにしてあげて下さい
think49

2017/07/19 04:14

「普通」と「やや高い」の設定が逆転していませんか。
guest

0

まず、〇か×かの判定は、避けたいです。
というのも、文字列なので実際には〇、×、それ以外を考慮する必要があるため
提示されたものでは、なにも表示されないことがあります。(まぁ、それもアリですが)
あとは、よくあるフラグ管理でswitch使います。
Aの重み付けは1、Bは2、Cができたら4というやつね

あ、重みづけまちがってました・・表ベースなので、Aの方が2でBが1です。

AB重要度合計
--低い0
-普通1
-やや高い2
高い3

Java

1String A = "x"; 2String B = "〇"; 3 4int pt = 0; 5pt += A.equals("〇") ? 2 : 0; 6pt += B.equals("〇") ? 1 : 0; 7 8String result; 9switch (pt) { 10 case 0: 11 result = "低い"; 12 break; 13 case 1: 14 result = "普通"; 15 break; 16 case 2: 17 result = "やや高い"; 18 break; 19 case 3: 20 result = "高い"; 21 break; 22 default: 23 result = ""; // 表示しない or 低い 24 break; 25 } 26 27 System.out.println(result);

配列使う場合は、こんな感じ。
ソースはスッキリしますが、配列の修正がめんどいです。excelマクロとかで生成する感じかなぁ。

java

1int APos = A.equals("〇") ? 1 : 0; 2int BPos = B.equals("〇") ? 1 : 0; 3 4String[][] results = { 5 {"低い", "普通"}, // ×× , ×〇 6 {"やや高い", "普通"} // 〇× , 〇〇 7 }; 8 9System.out.println(results[APos][BPos]);

か、最初のやつのswitch使うのやだなぁ。ならこれ。
非表示が実現できず、デフォルトが”低い”になっちゃいますが。

java

1 String[] result = {"低い","普通","やや高い","高い"}; 2 System.out.println(result[pt]);

投稿2017/07/19 03:03

編集2017/07/19 03:17
momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

複雑になった場合を考えているようですので、拡張可能な方法で考えていきたいと思います。

より複雑になるのは次のような物だと思います。

  • A、Bだけではなく、C、D、E、... と増えていく可能性がある。
  • ○、×だけではなく、△、□、◎、... と増えていく可能性がある。
  • 低い、普通、やや高い、高いだけではなく、やや低い、極めて高い、... と増えていく可能性がある。

これらを全て想定して条件分岐を考えた場合、すぐに破綻するのは目に見えています。ですので、今回は得点方式を採用します。

今回の問題は、それぞれの状態によって、最終的な評価が決まるという物です。そして、Aが○である場合と、Bが○である場合では、最終的な評価の重みが異なります。その重みを得点にし、それぞれの状態による得点を加算し、合計値からその評価を判定することにします。

状態×
A20
B10
得点結果
0低い
1普通
2やや高い
3高い

これをコードにすると、下記のような感じになります。(コードはRuby 2.4です。結構突貫で書いたので所々は怪しいです。大目に見てやってください。)

Ruby

1# frozen_string_literal: true 2 3class Judgement 4 def initialize(score, result) 5 @score_table = ScoreTable.new(score) 6 @result_table = ResultTable.new(result) 7 end 8 9 def judge(list) 10 score = list.to_h 11 .map { |name, value| @score_table.score(name, value) } 12 .sum 13 @result_table.score_to_result(score) 14 end 15 16 class ScoreTable 17 def initialize(score) 18 @score_map = score 19 end 20 21 def score(name, value) 22 raise ArgumentError, "#{name} not found" unless @score_map.key?(name) 23 name_map = @score_map[name] 24 raise ArgumentError, "#{value} not found" unless name_map.key?(value) 25 name_map[value] 26 end 27 end 28 29 class ResultTable 30 def initialize(result_map, compare = :more, out_of_range = true) 31 @score_list, @result_list = result_map.to_a 32 .map { |s, r| [s.to_i, r.to_s] } 33 .sort_by { |s, _r| s } 34 .transpose 35 @compare = compare 36 @out_of_range = out_of_range 37 end 38 39 def score_to_result(score) 40 case @compare 41 when :exact 42 idx = @score_list.find_index(score) 43 return @result_list[idx] if idx 44 raise ArgumentError, "#{socre} not included in score list" 45 when :more 46 ridx = @score_list.reverse_each.with_object(score).find_index(&:<=) 47 return @result_list[- 1 - ridx] if ridx 48 return @result_list.first if @out_of_range 49 raise RangeError, "#{socre} out of score range" 50 when :less 51 idx = @score_list.with_object(score).find_index(&:>=) 52 return @result_list[idx] if idx 53 return @result_list.last if @out_of_range 54 raise RangeError, "#{socre} out of score range" 55 else 56 raise Argumenterror, "#{@compare} invalid compare" 57 end 58 end 59 end 60end 61 62if $0 == __FILE__ 63 require 'yaml' 64 65 data_yaml = <<~EndOfLine 66 score: 67 A: 68: 2 69 ×: 0 70 B: 71: 1 72 ×: 0 73 result: 74 0: 低い 75 1: 普通 76 2: やや高い 77 3: 高い 78 EndOfLine 79 80 data = YAML.load(data_yaml) 81 jm = Judgement.new(data['score'], data['result']) 82 puts jm.judge({'A' => '○', 'B' => '×'}) 83 84 data2_yaml = <<~EndOfLine 85 score: 86 A: 87: 2 88: 1 89 ×: 0 90 B: 91: 1 92: 0 93 ×: 0 94 C: 95: 4 96: 2 97 ×: -1 98 result: 99 0: 低い 100 1: 普通 101 2: やや高い 102 3: 高い 103 4: 極めて高い 104 EndOfLine 105 106 data2 = YAML.load(data2_yaml) 107 jm2 = Judgement.new(data2['score'], data2['result']) 108 puts jm2.judge({'A' => '×', 'B' => '○', 'C' => '△'}) 109 puts jm2.judge({'A' => '×', 'B' => '×', 'C' => '×'}) 110 puts jm2.judge({'A' => '○', 'B' => '○', 'C' => '○'}) 111end

data2_yaml以降を見てください。Cや△を追加したパターンを書いてみました。このように、見るべき状態が増えたり、結果が変わったとしても、柔軟に対応できるのがこの書き方の良いところです。データの持ち方や、クラスの作り方はまだまだ工夫の余地があるのですが、考え方としては、

  1. 各状態について、得点を求める。
  2. 得点を合計する。
  3. 合計得点から、評価を得る。

と言うものになります。

さて、この方法には二つ問題があります。一つは、状態がどんどん増えていくと、どのように得点を配分すべきかが難しくなります。もう一つは「XとYの両方が○のときは高評価だが片方だけ○の場合は価値がない」のような状態の相互作用については考慮していません。あくまで、各状態が独立しているときでないとこの方式は無理です。

そのような、より多くの条件、かつ、それぞれの状態が絡み合って評価が変わるとなると違う分野に手を出す必要があります。そう、AIと言われる分野です。

※ ここから先は私もあまり詳しくは無いので、間違いがあればご指摘下さい。

例えば、囲碁というのは、361(19x19)のマスに「無」「白」「黒」の三状態、白黒双方のアゲハマに入る数値、白か黒の手番、コウになっているマス、という状態で盤面を表せます。上の話をより複雑にしただけに過ぎません。ですが、それぞれの状態で、白勝ち、白良し、互角、黒良し、黒勝ち、といった結果が存在します。これを条件分岐だけで作って行くことは不可能です。とはいえ、先ほどの単純な得点方式も限界があります。囲碁のルールにそって、複雑に絡み合った石の繋がりを見なければならないからです。

古典的なAIと言われたものは、この複合条件も一つ一つ得点化していくことで、総合評価を図ろうとしました。コンピューター将棋のメイン部分は今でもこの方式です。Bonanzaによって広まった3駒関係を得点化するというものです。この方式の問題は二つです。ひとつはある関係についてどれだけの得点を付ければ良いのかです。これについては強化学習の手法が広まり、かなり高い精度を誇れるようになりました。もう一つの問題は、どういった関係を得点にすれば良いかです。現在広く使われている3駒関係ですら、完全では無いと言われています。コンピューター将棋では(すでにトップレベルが人間の名人に勝てるほどの実力がありながら)まだまだ未知の部分であると言われています。

それに対して、コンピューター囲碁の分野では、衝撃的なデビューを果たしたAlphaGoがやってのけてしまいました。そもそも、どのような関係を得点にすべきかと言うことを人間が考えないという手法です。現代的なAIと言われるニューラルネットワークを利用したものがそれです。関係やその得点を人が作るのでは無く、自動的に学習していくという手法です。それは、人間の脳が少しずつ学習していくのを模倣する仕組みになっており、先入観にとらわれない、汎用性が高い手法です。この方法であれば、人では見逃していた関係も考慮に入れることもできますし、状態が増えたりしても(計算量は増えますが)より柔軟に対応可能です。

ということで、より複雑な状態についても評価を得られるような仕組みを作るには、ニューラルネットワークなどの最新のAI技術を使うしか無いでしょう。ぜひ、挑戦してみてください。

投稿2017/07/19 13:27

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

JavaScript で回答します。

二次元配列

「〇×」を Boolean 型の変数として作ってみました。
二次元配列を使った簡単なコードなので、他の言語にも応用できると思います。

JavaScript

1'use strict'; 2function getImportance1 (a, b) { // 仮引数 a, b は Boolean 型の値をとるものとする 3 return [['低い', '普通'], ['やや高い', '高い']][Number(Boolean(a))][Number(Boolean(b))]; 4} 5 6console.log(getImportance1(false, false)); // "低い" 7console.log(getImportance1(false, true)); // "普通" 8console.log(getImportance1(true, false)); // "やや高い" 9console.log(getImportance1(true, true)); // "高い"

二次元配列 + オブジェクト初期化子

設定の可読性とパフォーマンスの両立を目指しました。

JavaScript

1'use strict'; 2var getImportance2 = (function () { 3 var rules = [ 4 [{a: false, b: false}, '低い'], 5 [{a: false, b: true}, '普通'], 6 [{a: true, b: false}, 'やや高い'], 7 [{a: true, b: true}, '高い'] 8 ], 9 array = [[],[]]; 10 11 for (var i = 0, len = rules.length, rule; i < len; ++i) { 12 rule = rules[i]; 13 14 array[Number(rule[0].a)][Number(rule[0].b)] = rule[1]; 15 } 16 17 return function getImportance2 (a, b) { 18 return array[Number(Boolean(a))][Number(Boolean(b))]; 19 }; 20}()); 21 22console.log(getImportance2(false, false)); // "低い" 23console.log(getImportance2(false, true)); // "普通" 24console.log(getImportance2(true, false)); // "やや高い" 25console.log(getImportance2(true, true)); // "高い"

多次元 Map

配列の代わりに Map を使用してみました。

JavaScript

1var map = createMultidimensionalMap([ 2 [[false, false], '低い'], 3 [[false, true], '普通'], 4 [[true, false], 'やや高い'], 5 [[true, true], '高い'] 6 ]); 7 8console.log(map); 9console.log(map.get(false).get(false)); // "低い" 10console.log(map.get(false).get(true)); // "普通" 11console.log(map.get(true).get(false)); // "やや高い" 12console.log(map.get(true).get(true)); // "高い"

以下、オブジェクト初期化子でルールを渡せるようにしたコード。

JavaScript

1'use strict'; 2function createFunction (rules) { 3 var keys = [...rules[0][0].keys()], 4 hasOwnProperty = Object.prototype.hasOwnProperty; 5 6 for (var i = 0, len = rules.length, rule; i < len; ++i) { 7 rule = rules[i]; 8 rule[0] = [...rule[0].values()]; 9 } 10 11 rules = createMultidimensionalMap(rules); 12 13 return function getImportance3 (conditions) { 14 var map = rules; 15 16 for (var i = 0, len = keys.length, key; i < len; ++i) { 17 key = keys[i]; 18 19 if (!hasOwnProperty.call(conditions, key)) { 20 throw new ReferenceError; 21 } 22 23 map = map.get(conditions[key]); 24 } 25 26 return map; 27 }; 28} 29 30var rules = [ 31 [new Map([['A', false], ['B', false]]), '低い'], 32 [new Map([['A', false], ['B', true]]), '普通'], 33 [new Map([['A', true], ['B', false]]), 'やや高い'], 34 [new Map([['A', true], ['B', true]]), '高い'] 35 ]; 36var getImportance3 = createFunction(rules); 37 38console.log(getImportance3({A: false, B: false})); // "低い" 39console.log(getImportance3({A: false, B: true})); // "普通" 40console.log(getImportance3({A: true, B: false})); // "やや高い" 41console.log(getImportance3({A: true, B: true})); // "高い"

条件が増えた場合、ルールの数を増やすだけで対応可能です。

JavaScript

1var rules = [ 2 [new Map([['A', false], ['B', false], ['C', false]]), 'XXX'], 3 [new Map([['A', false], ['B', true], ['C', true]]), 'XYY'], 4 [new Map([['A', true], ['B', false], ['C', false]]), 'YXX'], 5 [new Map([['A', true], ['B', true], ['C', true]]), 'YYY'] 6 ]; 7var getImportance3 = createFunction(rules); 8 9console.log(getImportance3({A: false, B: false, C: false})); // "XXX" 10console.log(getImportance3({A: false, B: true, C: true})); // "XYY" 11console.log(getImportance3({A: true, B: false, C: false})); // "YXX" 12console.log(getImportance3({A: true, B: true, C: true})); // "YYY"

2進数のビットマップ

もし、2進数に馴染み深いのであれば、基数変換するのも手です。

ABC合計
0000
0011
0102
0113
1004
1015
1106

2進数なので2パターンしか対応できませんが、コードは大分シンプルで条件が増えても対応可能です。
ただし、条件が増えると左端に "D -> A -> B - > C" になってしまいます。
「C -> B -> A」のように降順で定義しておけば解決しますが、反面、読みづらくなるので、機械的に処理する工夫が必要かもしれません。

JavaScript

1function getValue (a, b, c) { 2 return ['000','001','010','011','100','101','110'][parseInt('' + Number(c) + Number(b) + Number(a), 2)]; 3} 4 5console.log(getValue(false, false, false)); // "000" 6console.log(getValue(false, false, true)); // "001" 7console.log(getValue(false, true, false)); // "010" 8console.log(getValue(false, true, true)); // "011" 9console.log(getValue(true, false, false)); // "100" 10console.log(getValue(true, false, true)); // "101" 11console.log(getValue(true, true, false)); // "110"

更新履歴

  • 2017/07/19 17:40 「多次元 Map」を追記
  • 2017/07/19 18:14 「2進数のビットマップ」を追記
  • 2017/07/19 18:21 多次元 Map で条件が増えた場合のコードを追記

Re: ssbb0212 さん

投稿2017/07/19 03:31

編集2017/07/19 11:07
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2017/07/19 09:23

多次元Map, ビットマップのコードを追記しました。
think49

2017/07/19 10:49 編集

ビットマップのコードは、2進数から3進数、4進数と増やしていけば、値のパターンを増やせます。 ただし、2進数のビットマップから後で思い立って3進数に変更しようとすると一から配列を作り直さなければなりません。 汎用性においては、多次元Mapが一番使いやすい感じです。
guest

0

javascript

1['低い', '普通', 'やや高い', '高い'][ (B === '○') + (A === '○') * 2 ];

回答しておいてなんですが、可読性が悪化するので、if文列挙の方がマシだと思います。

回答かぶったので別解

javascript

1['低い', '普通', 'やや高い', undefined, '高い'][ '××○×○○'.indexOf(A+B) ];

×○以外の値があった場合はundefinedを返します。
可読性は最悪ですね。

投稿2017/07/19 02:31

編集2017/07/19 04:17
Lhankor_Mhy

総合スコア36074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4 5class Program 6{ 7 static void Main(string[] args) 8 { 9 List<List<string>> ans = new List<List<string>>() 10 { 11 new List<string>(){ "×", "×" }, 12 new List<string>(){ "×", "○" }, 13 new List<string>(){ "○", "×" }, 14 new List<string>(){ "○", "○" } 15 }; 16 17 string check(List<string> input) 18 { 19 string data = string.Join("", input); 20 21 switch (data) 22 { 23 case "××": return "低い"; 24 case "×○": return "普通"; 25 case "○×": return "やや高い"; 26 case "○○": return "高い"; 27 } 28 29 return "エラー"; 30 } 31 32 foreach (List<string> e in ans.OrderBy(i => Guid.NewGuid())) 33 { 34 Console.WriteLine($"回答[{string.Join(" ", e)}] : {check(e)}"); 35 } 36 37 Console.ReadKey(); 38 } 39}

Ruby

1# encoding : utf-8 2 3ans = [['×', '×'], ['×', '○'], ['○', '×'], ['○', '○']] 4 5def check(input) 6 case input 7 when %w[× ×] then '低い' 8 when %w[× ○] then '普通' 9 when %w[○ ×] then 'やや高い' 10 when %w[○ ○] then '高い' 11 else 'エラー' 12 end 13end 14 15ans.shuffle.each do |e| 16 puts "回答[#{e.join(' ')}] : #{check(e)}" 17end 18

回答には〇×が1つずつ書かれているという設定で
Joinを使ってリストを結合、比較、判定するという方法を
考えました。

投稿2017/07/19 11:25

編集2017/07/19 11:31
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

javascript

1function moji_kaesu(A,B){ 2 return ["低い","普通","やや高い","高い"][(A == "○")*2 + (B == "○")]; 3}

分岐の結果を数字に変えて、点数計算するって感じ。
未定義が多少発生してもある程度動いてくれるチャランポランな言語ならではのやり方かもしれません。

投稿2017/07/19 02:32

zohnam

総合スコア1441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Powershellではなく、JavaScriptでの回答となりますが、テーブルのような形で持ってしまうとかどうでしょうか?

javascript

1var table = { 2 '×': { 3 '×': '低い', 4 '○': '普通' 5 }, 6 '○': { 7 '×': 'やや高い', 8 '○': '高い' 9 } 10}; 11 12alert(table['×']['×']); 13alert(table['×']['○']); 14alert(table['○']['×']); 15alert(table['○']['○']);

投稿2017/07/19 02:27

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問