letter upper lower combo

以前同事为了炫耀ruby的简洁,特意出一道题来考小陈:

在写一个爆破密码的字典生成工具,其中有这样一个需求:

输入一个单词:列出这个单词的所有大小写组合,比如ruby Ruby rUby ruBy rubY RuBy RuBY ....等等,这样2^n个

用C#该怎么写?

然后他把ruby的写法给了小陈:

s='abcd'

[nil].product(*[s.chars, s.swapcase.chars].transpose).map(&:join)

 


小陈只有从linq另辟蹊径了。最后在大牛的帮助下解决了问题:
 

void Main()
{
      string word = "abcd";
      List<List<string>> letters = new List<List<string>>();
      letters = word.ToCharArray().Select(w => new List<string>(){w.ToString().ToLower(),w.ToString().ToUpper()} ).ToList();
      CartesianProduct(letters)
          .Select (x => x.Aggregate ((a,b) => a + b))
           .ToList()
           .ForEach(Console.WriteLine);
}

static IEnumerable<IEnumerable<T>> CartesianProduct<T>( IEnumerable<IEnumerable<T>> sequences)
      {
        IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
        return sequences.Aggregate(
          emptyProduct,
          (accumulator, sequence) =>
            from accseq in accumulator
            from item in sequence
            select accseq.Concat(new[] {item}));
      }

 


在小陈看来已经是很简洁了。不过还是败了。
 

转载于:https://www.cnblogs.com/cdjboy/p/4820607.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值