using System.Text.RegularExpressions;publicclassKata{publicstaticstringAlphabetWar(string b){bool ripOutside = Regex.Matches(b,"#").Count >0;if(!ripOutside)return b.Replace("[","").Replace("]","");string[] areas = Regex.Split(b,@"\[|\]");string survivors ="";for(int i =0; i < areas.Length; i++){if(i %2==1){int bombCount =0;try{bombCount += Regex.Matches(areas[i -1],"#").Count;}catch{}try{bombCount += Regex.Matches(areas[i +1],"#").Count;}catch{}if(bombCount <2) survivors += areas[i];}}return survivors;}}
答案5:
using System;using System.Linq;using System.Text.RegularExpressions;publicclassKata{publicstaticstringAlphabetWar(string b){var now = Regex.Replace(b,@"(\w*#\w*)","#");returnstring.Concat(Regex.Matches(now,@"(?=^[^#]*$).*|((?<!#{2,})\[\w+\](?!#))|((?<!#)\[\w+\](?!#{2,}))").Cast<Match>().Select(m => m.Value.Replace("[","").Replace("]","")));}}
答案6:
using System;using System.Linq;publicclassKata{publicstaticstringAlphabetWar(string b){if(!b.Contains('#'))returnstring.Concat(b.Where(char.IsLetter));var sections = b.Split('[',']');var nukeCounts = sections.Select(s => s.Count(c => c =='#')).ToArray();for(int i =0; i < sections.Length; i++){// even sections are outdoors, odd are inside sheltersif(i %2==0|| nukeCounts[i -1]+ nukeCounts[i +1]>1){
sections[i]=string.Empty;}}returnstring.Concat(sections);}}
答案7:
using System.Text.RegularExpressions;publicclassKata{publicstaticstringAlphabetWar(string b)=> Regex.Replace((!b.Contains('#')? b : Regex.Replace(string.Concat(Regex.Matches(b,@"\[(\w*)\]|(#)")),@"(?<=##)\[(\w*)\]|(?<=#)\[(\w*)\](?=#)|\[(\w*)\](?=##)","")),@"[^\w]","");}
答案8:
using System;using System.Collections.Generic;using System.Linq;using System.Text.RegularExpressions;publicclassKata{// The worst code ever written... should have used Regexprivatestatic List<char> temp;publicstaticstringAlphabetWar(String b){int s =0;
temp =newList<char>();foreach(char c in b){
temp.Add(c);}if(b.Contains("#")){bool inShelter =false;bool bomb;for(int i =0; i < temp.Count(); i++){
bomb =false;switch(temp[i]){case'[':
inShelter =true;break;case']':
inShelter =false;continue;//break;case'#':
bomb =true;break;default:break;}if(!(inShelter || bomb)){
temp.RemoveAt(i);
i--;}}}int leftBomb =0;int rightBomb =0;int shelter =0;for(int i =0; i < temp.Count(); i++){if(temp[i]=='['){if(shelter ==0){
shelter =1;}else{
i =elimate(ref leftBomb,ref rightBomb, i,ref shelter);}}elseif(temp[i]=='#'){if(shelter !=0){
rightBomb++;}else leftBomb++;}}elimate(ref leftBomb,ref rightBomb, temp.Count()-1,ref shelter);return String.Join("", String.Join("", temp).Where(Char.IsLetter));}privatestaticintelimate(refint left,refint right,int index,refint side){if(left >1){
index =deleteLeftShelter(index);
left = right;
right =0;}elseif(left ==1){if(right >0){
index =deleteLeftShelter(index);}
left = right;
right =0;}elseif(right >1){
index =delteLeftAndRightShelter(index);
left =0;
right =0;
side =0;}else{
left = right;
right =0;}return index;}privatestaticintdeleteLeftShelter(int index){bool found =false;for(int i = index; i >0; i--){if(temp[i]==']'){
i--;if(i >=0) temp.RemoveAt(i);
index--;
found =true;}elseif(found){if(temp[i]!='['){
temp.RemoveAt(i);
index--;}else i =0;}}return index;}privatestaticintdelteLeftAndRightShelter(int index){for(int i = index +1; i < temp.Count()-1;i++){if(temp[i]==']') i = temp.Count();else{
temp.RemoveAt(i);
i--;}}returndeleteLeftShelter(index);}}
答案9:
using System;using System.Collections.Generic;using System.Linq;publicclassKata{privatestaticintCountBombs(IEnumerable<char> chars,int pos,int length,bool forward){
IEnumerable<char> xs;char end;if(!forward){
xs = chars.Reverse();
pos = length -1- pos;
end =']';}else{
xs = chars;
end ='[';}return xs
.Skip(pos +1).TakeWhile(c => c != end).Count(c => c =='#');}publicstaticstringAlphabetWar(string b){var chars = b.ToCharArray();if(chars.Any(c => c =='#')){bool shelter =false;for(int i =0; i < chars.Length; i++){var c = chars[i];if(c =='#')continue;if(c =='['){// TODO: Check for double bombsint bombs =CountBombs(b, i, chars.Length,true)+CountBombs(b, i, chars.Length,false);
shelter = bombs <2;continue;}if(c ==']'){
shelter =false;continue;}if(shelter)continue;
chars[i]='_';}}var survived = chars
.Where(c => c !='_').Where(c => c !='[').Where(c => c !=']').Where(c => c !='#').ToArray();returnstring.Concat(survived);}}
答案10:
using System;using System.Collections.Generic;using System.Linq;using System.Text;publicclassKata{publicstaticstringAlphabetWar(string b){Battlefield bf =newBattlefield(b);return bf.Survivers();}}publicclassBattlefield{private List<Lettergroup> lettergroups =newList<Lettergroup>();publicstring BattlefieldDesc {get;set;}publicBattlefield(string battlefieldDesc){this.BattlefieldDesc = battlefieldDesc;ParseGroups();}privatevoidParseGroups(){Lettergroup current =newLettergroup();for(int i =0; i <this.BattlefieldDesc.Length; i++){if(this.BattlefieldDesc[i]=='['){// End previous groupif(current.Length >0){
lettergroups.Add(current);
current =newLettergroup();}
current.HasShelter =true;}elseif(this.BattlefieldDesc[i]==']'){
lettergroups.Add(current);
current =newLettergroup();}elseif(this.BattlefieldDesc[i]=='#'){
current.Bomb();}else{
current.Letter(BattlefieldDesc[i]);}}if(current.Length >0){
lettergroups.Add(current);}}publicstringSurvivers(){// Did bombs drop?if(this.lettergroups.Any(l => l.NumberOfBombs >0)){this.lettergroups.Where(l =>!l.HasShelter).ToList().ForEach(l => l.IsDead =true);}// Were any shelters destroyed?int neighbouringBombs =0;for(int i =0; i < lettergroups.Count; i++){if(lettergroups[i].HasShelter){
neighbouringBombs += i >0?this.lettergroups[i -1].NumberOfBombs :0;
neighbouringBombs +=this.lettergroups[i].NumberOfBombs;
neighbouringBombs += i +1<this.lettergroups.Count ?this.lettergroups[i +1].NumberOfBombs :0;if(neighbouringBombs >=2){
lettergroups[i].NukeShelter();}
neighbouringBombs =0;}}string survivors ="";this.lettergroups.Where(l =>!l.IsDead).ToList().ForEach(l => survivors += l.Letters);return survivors;}publicoverridestringToString(){returnstring.Join(Environment.NewLine,this.lettergroups);}}publicclassLettergroup{publicbool HasShelter {get;set;}publicint NumberOfBombs {get;privateset;}publicstring Letters {get;privateset;}publicint Length {get;privateset;}publicbool IsDead {get;set;}publicLettergroup(){this.IsDead =false;}publicvoidLetter(char letter){this.Letters += letter;
Length++;}publicvoidBomb(){this.NumberOfBombs++;
Length++;}publicvoidNukeShelter(){this.HasShelter =false;this.IsDead =true;}publicoverridestringToString(){StringBuilder s =newStringBuilder();
s.Append(Letters);if(this.HasShelter){
s.Insert(0,'[');
s.Append(']');}if(this.NumberOfBombs >0){
s.Append(" (");for(int i =0; i < NumberOfBombs; i++){
s.Append('#');}
s.Append(')');}return s.ToString();}}