C#入門(第6回)

前回振り返り

char を int に変換する方法

GetNumericValue() メソッドを使用

GetNumericValue() は、文字が数値の場合、文字を整数に変換する組み込みメソッドです。文字が数値でない場合、負の値を返します。

char Character = '9';
int integer = (int)Char.GetNumericValue(Character);

Difference with 0 メソッドを使用

数値の文字を整数に変換するには、ゼロの文字(’0’)を単純に減算することも可能です。

char Character = '9';
int integer = Character - '0';

Int32.Parse() メソッドを使用

int.Parseメソッドを利用するためには、String型への変換が必要です。

char Character = '9';
int integer = int.Parse(Character.ToString());

GetDecimalDigitValue() メソッドを使用

System.Globalization クラスの GetDecimalDigitValue メソッドを利用するため、usingディレクティブ を指定します。

using System.Globalization;

char Character = '9';
int integer = CharUnicodeInfo.GetDecimalDigitValue(Character);

前回演習問題の解答例

問題1

問題文

数字だけの文字列Sが与えられるので、その数字を全て足してください。

制約

  • 1≦|S|≦100000=105

入力

入力は以下の形式で標準入力から与えられる。

S

出力

全て足した数値を求めてください。


入力例 1

123

出力例 1

6

入力例 2

01235

出力例 2

11

解答例

var s = Console.ReadLine().ToCharArray().Select(i => int.Parse(i.ToString())).Aggregate((i,j) => i+j);
Console.WriteLine(s);
問題2

問題文

Mくんがショッピングサイトのアカウントを新規作成しようとしています。
ショッピングサイトのパスワードには半角英小文字と数字と記号のみ利用可能です。
登録できるのは、8 文字以上で半角英小文字と数字と記号をそれぞれ 1 文字以上含むパスワードです。
Mくんはいつもパスワードに利用している半角英小文字からなる 8 文字の文字列 S があります。
Mくんは S の文字のいくつかを以下のように置き換えて登録する方法を思いつきました。

  • lを数字の1に置き換える
  • oを数字の0に置き換える
  • aを記号の@に置き換える
  • sを記号の$に置き換える

置き換えにはいくつかのパターンがありますが、そのうちショッピングサイトに登録可能なパターンはいくつあるか答えてください。

制約

  • S∣=8
  • S は英小文字のみからなる

入力

入力は以下の形式で標準入力から与えられる。

S

出力

ショッピングサイトに登録可能な置き換えパターンの数を出力してください。


入力例 1

password

出力例 1

7

登録可能なのは、pas$w0rdpa$sw0rdpa$$w0rdp@ssw0rdp@s$w0rdp@$sw0rdp@$$w0rdの 7 パターンです。


入力例 2

assassin

出力例 2

0

いくつかの置き換えパターンがありますが、数字を含むパターンはありません。


入力例 3

sayhello

出力例 3

21

解答例

using System;
using static System.Console;
using System.Linq;
using System.Collections.Generic;
var s = ReadLine();
WriteLine(Pass(s));

static int Pass(string s)
{
    var nums = 0;
    var codes = 0;
    foreach (var si in s)
    {
        if (si == 'l' || si == 'o') ++nums;
        if (si == 'a' || si == 's') ++codes;
    }
    //var ans = ((1 << nums) - 1) * ((1 << codes) - 1);
    //int ans = (pow(2,nums) - 1) * (pow(2,codes) - 1);

    int ans = (int)((Math.Pow(2,nums) - 1) * (Math.Pow(2,codes) - 1));
    return Math.Max(0, nums + codes == s.Length ? ans - 1 : ans);
}

/*
static int pow(int x, int p) {
    if (p == 0) {
        return 1;
    } else {
        return x * pow(x, p - 1);
    }
}
*/

今回の演習問題

問題1

問題文

コアさんは格闘ゲームにハマっています。このゲームでは 1,2,3 の番号が付いた 3 種類の技を出すことができ、技 i (1≤i≤3) を1 回出すと敵に Ai​ ダメージを与えられます。ただし、A1​≤A2​≤A3​ とします。

また、これらを技 1→2→3 の順に 1 回ずつ出すとコンボが発生し、3 回分の技のダメージに加えて
さらに B ダメージを敵に与えられます。

「技 1,2,3 の中から自由に 1 つを選んで 1 回出す」という操作を 3 回繰り返すとき、
敵に与えられるダメージの最大値を求めてください。

置き換えにはいくつかのパターンがありますが、そのうちショッピングサイトに登録可能なパターンはいくつあるか答えてください。

制約

  • 1≤A1​≤A2​≤A3​≤100
  • 1≤B≤100
  • 入力はすべて整数

入力

入力は以下の形式で標準入力から与えられる。

A1 A2 A3 B
  • 1 行目には A1​,A2​,A3​,B がこの順に半角スペース区切りで与えられる

出力

答えを 1 行で出力してください。


入力例 1

1 2 3 4

出力例 1

10

技 1→2→3 の順に 1 回ずつ出すと良いです。

この場合、技 1 で 1 ダメージ、技 2 で 2 ダメージ、技 3 で 3 ダメージを敵に与えることができ、
さらにコンボが発生することによって 4 ダメージを追加で与えられます。

よって、合計 1+2+3+4=10 ダメージを敵に与えられます。

これより大きなダメージを敵に与えることはできません。


入力例 2

3 9 9 3

出力例 2

27

例えば、技 2 を 3 回連続で出すと良いです。
この場合、9×3=27 ダメージを敵に与えられます。

技 1,2,3 をこの順に 1 回ずつ出す場合、技 1 で 3 ダメージ、技 2 で 9 ダメージ、技 3 で 9 ダメージ、コンボ発生で 3 ダメージを敵に与えられますが、これらの合計は 24 ダメージとなり、
27 ダメージより小さくなります。


入力例 3

77 77 77 77

出力例 3

308

問題2

問題文

01 からなる長さ N の文字列 S,T が与えられます。S に対して以下の操作を行って T と一致させるための操作回数の最小値を求めてください。

  • 1≤iN を満たす整数 i を選ぶ。S の i 文字目を現在とは異なる方の文字に変更する。つまり、 0 なら 1、 1 なら 0 に変更する。その後、S の前後を反転する。

制約

  • N は整数
  • 1≤N≤106
  • S,T は 01 からなる長さ N の文字列

入力

入力は以下の形式で標準入力から与えられる。

N
S
T

出力

答えを 1 行で出力してください。


入力例 1

3
001
010

出力例 1

2

操作の一例を以下に示します。

  • i=2 として操作を行う。S の 2 文字目を 0 から 1 に変更し、S の前後を反転する。操作後、S110 となる。
  • i=1 として操作を行う。S の 1 文字目を 1 から 0 に変更し、S の前後を反転する。操作後、S010 となる。

2 回未満の操作で S と T を一致させることはできません。


入力例 2

2
01
11

出力例 2

1

操作の一例を以下に示します。

  • i=1 として操作を行う。S の 1 文字目を 0 から 1 に変更し、S の前後を反転する。操作後、S11 となる。

入力例 3

4
1111
1111

出力例 3

0

入力例 4

10
0110111010
1001010011

出力例 4

5

コメント