1using System;2using System.Linq;3using System.Text.RegularExpressions;45using static System.Console;67public class EntryPoint
8{9 public staticvoidMain(string[] args)10{11 StringComparator strComparate =new("12345678abcdefghijklmn","22345678abcdefghijjlmn");1213 string[] titles =[14"項目A:1文字目から8文字",15"項目B:1文字目から2文字",16"項目C:9文字目から13桁"17];1819Sample(strComparate, titles);20}2122 public staticvoidSample(StringComparator strComparate, params string[] titles)23{24 string[][] targets = new string[titles.Length][];2526for(int index =0; index < titles.Length;++index)27 targets[index]= strComparate.Range(titles[index],"桁");2829for(int index =0; index < titles.Length;++index)30if(targets[index][0]!= targets[index][1])31WriteLine($"{titles[index][0..3]}:比較文字A:{targets[index][0]},比較文字B:{targets[index][1]}");32}33}3435public structStringComparator(string sampleA, string sampleB)36{37int[]PutInt(string word)=>(38 from numbers in Regex.Split(word,"[^0-9]")39 where numbers !=""40 select int.Parse(numbers)41).ToArray();4243 public string[]Range(string word, string? flag = null)44{45int[] numbers =PutInt(word);4647return numbers.Length switch48{492=>Range(numbers.First(), flag != null ?50(word.Contains(flag)? numbers.Last()+ numbers.First(): numbers.Last())51: numbers.Last()),5253<2=> throw new FormatException("文字列には半角数値を二つ含めて下さい"),54>2=> throw new FormatException("文字列に二つ以上の半角数値が含まれています"),55};56}5758 public string[]Range(int start,int end)59{60 Range range =(start -1)..end;61return[$"{sampleA[range]}", $"{sampleB[range]}"];62}63}
1int[]PutInt(string word)=>(2 from numbers in Regex.Split(word,"[^0-9]")3 where numbers !=""4 select int.Parse(numbers)5).ToArray();
「項目」から得た整数を文字列から数値型に変換し、それを用いて対象の文字列より特定の範囲を指定します
C#
1public string[]Range(string word, string? flag = null)2{3int[] numbers =PutInt(word);45return numbers.Length switch6{72=>Range(numbers.First(), flag != null ?8(word.Contains(flag)? numbers.Last()+ numbers.First(): numbers.Last())9: numbers.Last()),1011<2=> throw new FormatException("文字列には半角数値を二つ含めて下さい"),12>2=> throw new FormatException("文字列に二つ以上の半角数値が含まれています"),13};14}
1for(int index =0; index < titles.Length;++index)2 targets[index]= strComparate.Range(titles[index],"桁");
「項目」のフォーマットが統一されていれば、固定の範囲から繰り返し必要な要素を取り出せます
C#
1for(int index =0; index < titles.Length;++index)2if(targets[index][0]!= targets[index][1])3WriteLine($"{titles[index][0..3]}:比較文字A:{targets[index][0]},比較文字B:{targets[index][1]}");
(正直質問文の日本語が難読すぎてイマイチ把握できてないのですが)
案A というのは以下のような話でしょうか?
長さが等しい文字列 A と B に関して,先頭から各文字が同一か否かを見ていく.文字が異なる位置 i が見つかる度に,構造体群の中で位置 i を範囲として含む物を探す.
このとき,位置 i を含む構造体は別の「不一致だよリスト」に移動させる(以降は見ない)とかすれば A-2 の「複数回hit」を避けられるように思うのですがどうなんでしょう?
(各範囲内での「不一致な文字の場所や個数」みたいな情報までは求められていないように見えるので)
(同様に,範囲が走査され終えたやつらを「一致だよリスト」に移動させることもできる)