C#/ Linq又一个脑筋急转弯

时间:2009-10-18 11:57:31

标签: c# linq

朋友们,还有另一种情况需要解决。我在没有申请Linq的情况下正在努力。但是如果你在Linq分享你的代码,我希望这是学习Linq的好机会。

它被称为 FLAMES

F - 朋友

L - 情人

A - Admirer

M - Marry(丈夫)

E - Enemy

S - 姐姐

问题描述:

将给出两个名字(男性,女性)。我们必须删除这两个名字的共同字母。然后我们必须在从两个名字中删除共同字符后计算剩余字母的数量。最后,我们必须迭代字符串FLAMES并删除FLAMES中的字母,直到我们达到单个字符为止。剩下的单个字符显示了这种关系。我将在以下示例中解释该过程的更多细节。(忽略大小写和空格)。

示例:

第1步

Male    : Albert

Female : Hebarna

字母“a”,“e”,“b”在两个名称中都很常见。

(从两个字符串中删除这些字母,即使名称“Hebarna”包含两个“a”,您也可以从两个字符串中单击“a”,因为名称“Albert”只有单个“a”)。

结果字符串是 的

Male :     $  l    $     $   r   t

Female:    H  $    $     $   r  n    a

第2步:

计算两个字符串中的剩余字母。

数:7

第3步:

使用计数我们必须以下列方式迭代字符串“FLAMES”

F       L           A        M        E           S

1       2           3         4       5           6

7

(Here the count 7 ends at F ,so strike F)

你会得到

$       L         A         M         E         S

(如果是最后一个字母(“S”),则从下一个字母开始计数(它不应该被击出)然后从第一个字母“F”开始,如果“F”尚未被击中。

 $              L         A          M             E             S

 (igonre)        1         2          3              4            5

 (ignore)       6         7

在计算过程中,请不要考虑外出字母。

$          L         $               M           E         S

                                    1           2          3      

ignore     4       ignore           5           6          7       

“s”将被击中。

$            L         $           M          E        $

ignore       1         ignore      2           3       

             4         ignore      5           6 

             7

“L”将被击中

$           $          $            M             E           $

                      ignore        1             2          ignore

ignore     ignore     ignore        3             4          ignore

                                    5             6  

                                    7 

最后“M”将被击中。然后只有剩下的字母是“E”所以albert是herbana的敌人。

更新 Lettter“r”在这两个名字中也很常见.I forgor可以点击它。这个过程与解释的相同。谢谢指出它。

3 个答案:

答案 0 :(得分:2)

var count = male.Length + female.Length - male.Intersect( female ).Count();

while (flames.Length > 1)
{
     flames = string.Join( '', flames.Where( (c,i) => i != (count % flames.Length) -1 ).ToArray() );
}

答案 1 :(得分:2)

可以预先计算迭代通过火焰字母并逐个删除的最后一个计算部分。

public static Char GetChar(int diff) {
    var idx = (diff - 1) % 60;
    return "efefmeaelmaafmfaflefefeemsasamfmfallslslesmsasmmaelmlaslslfs"[idx];
}

有些事情可以在没有linq的情况下完成......除非我完全搞砸了。

答案 2 :(得分:2)

Step1和Step2

var firstLookup = firstName.ToLookup(c => c.ToLower());
var secondLookup = secondName.ToLookup(c => c.ToLower());
var allChars = firstLookup.Keys.Union(secondLookup.Keys);
int count =
(
  from c in allChars
  let firstCount = firstLookup[c].Count()
  let secondCount = secondLookup[c].Count()
  select
    firstCount < secondCount ? secondCount - firstCount :
    firstCount - secondCount
).Sum()

Step3(未经测试)

List<char> word = "FLAMES".ToList();

while (word.Count > 1)
{
  int wordCount = word.Count;
  int remove = (count-1) % wordCount;
  word =
    word.Select( (c, i) => new {c, i =
      i == remove ? 0 :
      i < remove ? i + wordCount + 1 : 
      i})
    .OrderBy(x => x.i)
    .Select(x => x.c)
    .Skip(1)
    .ToList();
}

char result = word.Single();