面白いパズル「アンラッキーチケット」

画像 子供の頃から誰もがハッピーチケットの問題を知っていると思います。 ただし、多くの場合、バスに乗る時間は最初と最後の3桁を合計するのにかかる時間よりはるかに長くなります。



そして、旅行の終わりまで自分自身を楽しませるために、私は「不運なチケット」の概念を発明しました。 最初の3桁を使用して取得した値のセットから番号がないチケットは、最後の3桁を使用して取得した値のセットからの番号と一致しません。 問題文の詳細。



タスク条件



最初の3桁から取得したセットの値が最後の3桁からのセットの値と一致しない6桁のすべての値を検索します。



各トライアドの値のセットを取得する必要があります。





チケット:983060



トライアドの多くの値:983 [96、33、2、3、35、99、4、69、5、75、11、45、14、15、48、51、19、20、216、24]

トライアドの多くの値:060 [0、6]



一般的な意味はありません-これは不運なチケットです。



PS負の値にはすべて同じ正の値があるため、負の値は省略します


したがって、旅行の終わりまでに、条件のアクションを使用して、最初と最後の3桁の合計数を見つけることができなかった場合、不運なチケットを手に入れました! または、あなたはあまり数学を持っていません。



問題に対する私の解決策
すべてのコードを広めることには意味がありません。主なことを説明しようと思います。



3つの数字のすべての組み合わせのリスト-1000個。 見つかったチケットが追加されるセット。



List<Combination> combinations = new ArrayList<>(1000); Set<String> tickets = new HashSet<>();
      
      





ある組み合わせの値のセットからの各番号について、別の組み合わせの値のセットにそのような番号があるかどうかを確認します。



共通の値が見つかるまで、セットにチケットを意味する行を追加します。

値が見つかったらすぐに、セットからチケットを削除し、次の比較に進みます。



 for (Combination comb1 : combinations) { for (Combination comb2 : combinations) { for (Integer x : comb1.getValues()) { if (comb2.getValues().contains(x)) { tickets.remove(comb1.toString() + comb2.toString()); break; } else { tickets.add(comb1.toString() + comb2.toString()); } } } }
      
      





各組み合わせの値のセットを計算する方法を示します。

(メソッドは、組み合わせの3桁の順列ごとに実行されます)



  private void countValues(int a, int b, int c) { //Sum addValue(a + b + c); addValue(a + b - c); addValue(a + b * c); addValue((a + b) * c); if (c != 0 && b % c == 0) {addValue(a + b / c);} if (c != 0 && (a + b) % c == 0) { addValue((a + b) / c); } //Subtraction addValue(a - b + c); addValue(a - b - c); addValue(a - b * c); addValue((a - b) * c); if (c != 0 && b % c == 0) {addValue(a - b / c);} if (c != 0 && (a - b) % c == 0) {addValue((a - b) / c);} //Multiplication addValue(a * b + c); addValue(a * b - c); addValue(a * (b - c)); addValue(a * b * c); if (c != 0) { double x = (double)a * (double)b / (double)c; if (isInteger(x)) { addValue((int)x); } } if (c != 0) { double x = (double)a * (double)b / (double)c; if (isInteger(x)) { addValue((int)x); } } //Division if (b != 0 && a % b == 0) { addValue(a / b + c); } if (b + c != 0 && a % (b + c) == 0) { addValue(a / (b + c)); } if (b != 0 && a % b == 0) { addValue(a / b - c); } if (b - c != 0 && a % (b - c) == 0) { addValue(a / (b - c)); } if (b != 0) { double x = (double)a / (double)b * (double)c; if (isInteger(x)) { addValue((int)x); } } if (b != 0 && c != 0) { double x = (double)a / (double)b / (double)c; if (isInteger(x)) { addValue((int)x); } } }
      
      





合計: 23088チケット。



ラッキーチケット: 18個ごと

不運なチケット: 43ごと



ご清聴ありがとうございました!



All Articles