1

以下のロジックについて入力が必要です。

これは一種の請求システムで、入力を受け取り、それに関連付けられた値を持ちます。

A = 2 , 3A = 5
B = 3
C = 1 , 4C = 3

私のコードは、 ABCCBAACCA を取るようなものでなければならず、出力は16の値でなければなりません。

現在の私の解決策は、文字列内のすべての要素を数えることを考えており、それらは A の場合は 3 、 C の場合は 4 で mod(modulus) されます (上記の場合と同様に、 B の場合は必要ありません)。結果を取得します。

そのようなシステムを実装するためにどのデータ構造を使用する必要があるのか​​ 混乱しています。

4

4 に答える 4

1
class CharBucket
  attr_accessor :count

  def initialize(thresholds)
    @thresholds = thresholds
    @count = 0
  end

  def total
    @thresholds.inject([0, @count]) do |sum_left, a|
      sum = sum_left[0]
      left = sum_left[1]
      sum += (left / a[0]) * a[1]
      left %= a[0]
      [sum, left]
    end[0]
  end
end

a = CharBucket.new({3 => 5, 1 => 2})
b = CharBucket.new({1 => 3})
c = CharBucket.new({4 => 3, 1 => 1})
buckets = {'A' => a, 'B' => b, 'C' => c}

"ABCCBAACCA".each_char{|c| buckets[c].count += 1 }
total = buckets.values.inject(0){|sum, b| sum += b.total} # => 16
于 2012-05-11T17:09:30.723 に答える
1

まあ、評価している文字に応じて、毎回0が3または5の倍数になるため、モジュラス演算子は役に立ちません(それがあなたが説明しようとしているものである場合、間違っていたらごめんなさい)。

最も簡単な方法は、文字列をスキャンして値を追加することだと思います。

3 番目の A に遭遇したときは、2 の代わりに 1 を追加します (4 を引いてから 5 を追加する必要があるため)。同様に C の場合、4 番目の C に遭遇したときに、1 の代わりに 0 を追加するだけです。

A と C のインスタンスを保持するには 2 つの追加の変数が必要です。はい、モジュラス演算子を使用して、場合に応じて 1 または 0 を追加する必要がある倍数に到達したかどうかを知ることができます。

これが少し役立つことを願っています。

編集:ここでは、簡単な実装を行いました。本当に必要な場合は、自由に最適化してください ;)

    String value = "ABCCBAACCA";
    int numA =0;
    int numC =0;
    int endResult = 0;

    for (int x = 0; x < value.length(); x++)
    {
        if (value.charAt(x) =='A')
        {
            numA = numA +1;

           endResult = endResult + ((numA%3 == 0)?1:2);
        }
        else if (value.charAt(x) =='B')
        {
            endResult = endResult +3;
        }
        else if (value.charAt(x) =='C')
        {
            numC = numC +1;
            endResult = endResult + ((numC%4 == 0)?0:1);
        }
    }

    System.out.println(endResult);  //16 as expected
于 2012-05-11T15:37:06.227 に答える
1

疑似コードでは、次のようになると思います。

すべての A、B、C を数える

  1. A を 3 で割り、5 を掛けます。

  2. モジュロ A を 3 倍し、2 倍します。

  3. B を 3 倍する

  4. C を 4 で割って 3 を掛ける

  5. モジュロ C による 4

5 つの結果を合計します。

Ruby では、次のようになります。

input = "ABCCBAACCA"
letters = ["A", "B", "C"]
total = 0

def score(letter,count)
  if letter == "A"
    ((count/3)*5)+((count%3)*2)
  elsif letter == "B"  
    count*3
  else letter == "C"  
    ((count/4)*3)+(count%4)
  end  
end 

letters.each do |letter|   
  puts "#{letter}: #{score(letter, input.count(letter))}"
  total += score(letter, input.count(letter))
end

puts "Total: #{total}"

生成するもの:

A: 7
B: 6
C: 3
Total: 16
于 2012-05-11T15:44:23.157 に答える