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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1446閲覧

間違いが見つからない。

IkeuchiKenyu

総合スコア6

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/08/01 07:43

###問題文
4 桁の暗証番号 X1X2X3X4が与えられます。 番号は先頭の桁が 0であることもあり得ます。 暗証番号は以下のいずれかの条件をみたすとき弱い暗証番号と呼ばれます。
4桁とも同じ数字である。
1≤i≤3 をみたす任意の整数 i について、 X(i+1)が、 Xi の次の数字である。 ただし、 0≤j≤8について jの次の数字は j+1 であり、 9 の次の数字は 0
である。
与えられた暗証番号が弱い暗証番号ならば Weak を、そうでないならば Strong を出力してください。
###入力
X1X2X3X4(間なし)
###出力
Strong or Weak
###コード

C++

1#include <algorithm> 2#include <iostream> 3#include <stdio.h> 4#include <vector> 5using namespace std; 6int main() { 7 int T; 8 int A[4]; 9 cin >> T; 10 A[0] = T / 1000; 11 A[1] = (T % 1000) / 100; 12 A[2] = (T % 100) / 10; 13 A[3] = T % 10; 14 if (A[0] == A[1] && A[1] == A[2] && A[2] == A[3])cout << "Weak" << endl; 15 else if (A[0] == 9 && A[1] == 0 && A[2] == 1 && A[3] == 2)cout << " Weak" << endl; 16 else if (A[1] == 9 && A[2] == 0 && A[3] == 1 && A[0] == 2)cout << " Weak" << endl; 17 else if (A[2] == 9 && A[3] == 0 && A[0] == 1 && A[1] == 2)cout << " Weak" << endl; 18 else if (A[3] - A[2] == 1 && A[2] - A[1] == 1 && A[1] - A[0] == 1)cout << "Weak" << endl; 19 else cout << "Strong" << endl; 20}

###問題点
これをコンピュータでチェックしたところ、ほとんどは大丈夫だったのですが一部うまくいきませんでした。
穴があるのはわかるのですがそれがどこかわかりません。
###参考
Visual studio 使用
問題はAt coderより(チェックも)
リンク https://atcoder.jp/contests/abc212/tasks/abc212_b
初学者なのでできるだけかみ砕いて説明してもらえるとありがたいです。

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

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

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

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

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

y_waiwai

2021/08/01 07:49

どこがどういうふうにうまくいかないのか説明しましょう
SaitoAtsushi

2021/08/01 08:07

機械判定で NG になってどこが上手くいってないのかもわからないんでしょう。 事実上のデバッグ依頼で、質問が具体的ではないのであまり好ましくはないですね。
IkeuchiKenyu

2021/08/01 11:10

すみません。初学者なのでタブー的なものを知りませんでした。 これからはもっと自分で考えて質問します。 ご迷惑をお掛けしました。
guest

回答3

0

A[1] == 9 && A[2] == 0 && A[3] == 1 && A[0] == 2 という条件だと A[0] == 2 の部分が間違いですね。 9 の前にあると weak になるのは 8 なのですから A[0] == 8 でなければなりません。 その次の条件についても同様です。 単純に条件が間違っているということです。

しかし根本的な問題を言うならば条件を網羅的に書こうとしているところが駄目です。

どのように一般化できるかを考えると

  • 隣り合う桁の差を取る
  • 差を 10 の mod で解釈する (9 の次を 0 とするために)
  • 取った差の全てが 0 もしくは全て 1 だった場合に Weak となる
  • そうでなければ Strong となる

ですから、これをコードにすれば例えば以下のような方法が考えられるでしょう。

cpp

1#include <algorithm> 2#include <iostream> 3#include <cassert> 4#include <type_traits> 5 6// 結果の種類 7enum class assessment_result { 8 weak, 9 strong 10}; 11 12// 結果の表示 13std::ostream& operator<<(std::ostream& os, const assessment_result res) { 14 switch(res) { 15 case assessment_result::weak: os<<"Weak"; break; 16 case assessment_result::strong: os<<"Strong"; break; 17 } 18 return os; 19} 20 21assessment_result assessment(int x) { 22 assert(x<10000); 23 int columns[4]; 24 // 桁に分解 25 std::generate(std::rbegin(columns), std::rend(columns), 26 [&x](){auto t = x%10; x /= 10; return t;}); 27 // 隣合う桁と差を取る 28 // 負数にならないように modulo を取れば 9 の次が 0 のような扱いになる 29 for(int i=0; i<3; ++i) columns[i] = (columns[i+1]-columns[i]+10)%10; 30 31 // 取った差の全てが 0、 または取った差の全てが 1 であれば weak 32 // そうでなければ strong 33 return 34 std::all_of(columns, columns+3, [](int c){return c==0;}) 35 || std::all_of(columns, columns+3, [](int c){return c==1;}) 36 ? assessment_result::weak 37 : assessment_result::strong; 38} 39 40int main(void) { 41 int input_data; 42 std::cin >> input_data; 43 std::cout << assessment(input_data) << std::endl; 44}

私の提案は質問者が正しく条件を網羅するよりはおそらく冗長なコードです。 しかしながら場合分けを手作業で網羅的にしようとすると間違えやすいのでなるべく一般化すべきでしょう。

初心者の内は必要な動作をするプログラムを書くことに精一杯でよりよく書こうという思考を持ち難いですが、きちんと整理すれば大したことないのはよくあることです。

投稿2021/08/01 09:45

SaitoAtsushi

総合スコア5686

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

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

IkeuchiKenyu

2021/08/01 11:08

ありがとうございます。 modは思いつきませんでした。 これからも精進していきます。
guest

0

ベストアンサー

9の前は8です。
その判定が間違っていませんか。
以下のチェックだと、

c

1else if (A[1] == 9 && A[2] == 0 && A[3] == 1 && A[0] == 2)cout << " Weak" << endl;

"2->9->0->1"となってしまって"Weak"ではありません。
"8->9->0->1"にする必要があります。

投稿2021/08/01 09:16

akiruno-oneone

総合スコア815

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

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

IkeuchiKenyu

2021/08/01 11:09

ご回答ありがとうございます。 勘違いしていました。
guest

0

1≤i≤3 をみたす任意の整数 i について、 X(i+1)が、 Xi の次の数字である。 ただし、 0≤j≤8について jの次の数字は j+1 であり、 9 の次の数字は 0

例えば、
2 9 0 1
はweakじゃないんじゃないかと。
逆に、
8 9 0 1
はweakなんじゃないですか?

投稿2021/08/01 07:57

thkana

総合スコア7703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問