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

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

ただいまの
回答率

90.52%

  • C#

    7102questions

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

  • Visual Studio

    1831questions

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

数字とアルファベットの組み合わせで数列を作りたい

受付中

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,231

sinatose

score 8

2桁までは数字のみで連番
01,02,03,04,05...97,98,99

3桁からは数字(1-9)とアルファベット(A-Z)の組み合わせ
1A,1B,1C,1D...1X,1Y,1Z
2A,2B,2C,2D...2X,2Y,2Z

9A,9B,9C,9D...9X,9Y,9Z

A1,A2,A3.....A8,A9,AA,AB,AC,AD,AE...AZ
B1,B2,B3.....B8,B9,BA,BB,BC,BD,BE...BZ

Z1,Z2,Z3.....Z8,Z9,ZA,ZB,ZC,ZD,ZE...ZZ

こういう規則性で数列を作りたいのです…

//説明不足点
すみません、説明不足がありましたので追加します。
3桁目からはアルファベットと数字を入れた数列にしたいです。
また、数字の0は使わないようにしたいです。

数字の配列を作成し、ループさせて更にその中にアルファベットの配列をループで回す。9Zになったら、ループを抜けてアルファベット配列ループ内でアルファベット配列のループを回すのがいいのでしょうか? もっといい方法を教えて下さい。よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+3

ロジックが 3 つ必要ですね。
99 までのもの、9A~9Z、A1~ZZ
そのまま実装した泥臭いものが次です。

static string convert(int src)
{
    if (src < 1) return "";
    string alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string digitsAndAlphabets = "123456789" + alphabets;
    int alphabetsLength = 26;
    int digitsAndAlphabetsLength = 9 + alphabetsLength;
    if (src < 100) return string.Format("{0:00}", src);
    src -= 100;
    if (src < 9 * alphabetsLength) return string.Format("{0}{1}", (int)(src / alphabetsLength) + 1, alphabets[src % alphabetsLength]);
    src -= 9 * alphabetsLength;
    if (src < alphabetsLength * digitsAndAlphabetsLength) return string.Format("{0}{1}", alphabets[src / digitsAndAlphabetsLength], digitsAndAlphabets[src % digitsAndAlphabetsLength]);
    return "";
}


上記洗練の余地があります。

また、高速化が必要であればあらかじめ計算済みのものを作っておくという手もあります。

static string convert2(int src)
{
    #region data
    var data = new string[]
    {
        "01",
        "02",
        "03",
中略
        "99",
        "1A",
        "1B",
        "1C",
中略
        "ZX",
        "ZY",
        "ZZ",
    };
    #endregion
    if (src < 0 || src >= data.Length) return "";
    return data[src];
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

(01/26 全面書き換え)
やや無理やりな感じもありますが……

"00"から始まり、"99"までは2桁で出力、3桁目以降は順次追加し、[1-Z]の範囲の列とする、先頭は1始まりとする、という解釈で作成してみました。

public IEnumerable<string> Sequence()
{
    var digit = Enumerable.Range(0, 100).Select(x => $"{x, 0:00}");

    foreach (var result in digit)
        yield return result;

    foreach (var result in DigitAlpha().SelectMany(_ => digit, (x, y) => x + y))
        yield return result;
}

private IEnumerable<string> DigitAlpha()
{
    var array = Enumerable.Range('1', 9).Concat(Enumerable.Range('A', 26))
        .Select(x => ((char)x).ToString());

    foreach (var result in array)
        yield return result;

    foreach (var result in DigitAlpha().SelectMany(_ => array, (x, y) => x + y))
        yield return result;
}

そのままだと無限に列挙するので適当にTakeで切ってください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/26 11:10 編集

    同じくルールを見落としていました……最初の2桁は十進だったんですね……ちょっと考え直してきます。 -> 考え直してきました。

    キャンセル

+1

だめだ、このルールがあると基数変換(36進数)使用しての変換はできないですね。

1A,1B,1C,1D...1X,1Y,1Z 
2A,2B,2C,2D...2X,2Y,2Z 
↓ 
9A,9B,9C,9D...9X,9Y,9Z 


3桁からは数字(1-9)とアルファベット(A-Z)の組み合わせ 
1~99まではそのまま1~99なので36進数としては扱えないですね。

こんな感じですか。 ※ Convert10To36() は割愛

string ConvertXX(int val) {

    if (val < 100の場合) {
        return val.ToString();
    }
    return Convert10To36(val - 100 + 46);
}

System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("0,");
for (int i = 1; i < 1349 /* "zz" */ ; i++) {
    sb.Append(ConvertXX(i));
    sb.Append(",");
}
Console.WriteLine(sb.ToString());

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

10進法で考えたときに0~99 までは10進法表記で、
100以降では[1-9][A-Z] となるパターンと、[A-Z][1-9A-Z] となるパターン
ということですよね?
どのパターンに該当するかさえ切り分ければ、それぞれ毎に変換はできますね。

本来の数が100未満 = 素直に10進変換
100以上333(9Zに該当)以下 = (本来の数-100) を、26で割った商=上位桁、余り=下位桁として、それぞれ0-8,0-25 を 1-9, A-Z にみなして表記
334以上 = (本来の数-334)を、35(1-9A-Zで35文字)で割った商=上位桁、余り=下位桁として、それぞれを上と同様にA-Z,1-9A-Zとみなして表記

になりますかね。

上を踏まえて、変換関数はこうなります。

private string ConvertFunc(int value) {
  string disp = "";
  if (value<100) {
    disp = string.Format("{0:00}", i);
  } else if (value<334) {
    int hidigt = (i - 100) / 26;
    int lwdigt = (i - 100) % 26;
    disp = "123456789".Substring(hidigt, 1) + "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(lwdigt, 1);
  } else {
    int hidigt = (i - 334) / 35;
    int lwdigt = (i - 334) % 35;
    disp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(hidigt, 1) + "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(lwdigt, 1);
  }
  return disp;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

C# 36進数変換、で検索すると参考になる資料が出て来るかと思います。36進法とは0〜9とA〜Zをフルに使った記法です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/26 11:02

    すみません、一番上の条件を見落としていました…36進が使えるのは3桁目以降だけなんですね。

    キャンセル

0

これでどうでしょうか?
高速化の為にStringBuilderを利用しています。

StringBuilder sb = new StringBuilder();
for(int i = 0; i < 1000; i++)
{
 sb.Append(AZnumber(i)+",");
}

>sb.ToString();//これが答え
  private string AZnumber(int i)
        {
            StringBuilder sb = new StringBuilder(); 
//100以下
            if (i < 100)
            {
                return i.ToString();
            }
            
            int d = ( (i -100) / 26);
            int m = ( (i - 100) % 26);
//(1-9)A-Z
            if (d < 9)
            {
                sb.Append((d+1).ToString());
                //sb.Append(((byte)'A' + d).ToString());
                
                    sb.Append(((char)((byte)'A' + m )).ToString());
            }
//(A-Z)(0-Z)
            else
            {
                int dd = ((i - 334) / 33);
                sb.Append(((char)((byte)'A' + dd)).ToString());
                int mm = ((i - 334) % 33);
                if (mm < 10)
                {
                    sb.Append(mm.ToString());
                }
                else
                {
                    sb.Append(((char)((byte)'A' + (mm - 10))).ToString());
                }

            }
            return sb.ToString();
        }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7102questions

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

  • Visual Studio

    1831questions

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