Решение задачи "Кто выпьет n-ю Double Cola" - C#

Узнай цену своей работы

Формулировка задачи:

 string[] names = new string[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
 int n = 1;
 Line.WhoIsNext(names, n) --> "Sheldon"
 
 int n = 6;
 Line.WhoIsNext(names, n) --> "Sheldon"
 
 int n = 52;
 Line.WhoIsNext(names, n) --> "Penny"
 
 int n = 7230702951;
 Line.WhoIsNext(names, n) --> "Leonard"
Дан массив, в качестве примера. string[] names = new string[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" }; Задача такова: 5 друзей пошли пить пиво "Супер" Колу. Свойства этой колы таковы, что выпив ее человек дублируется. Втали друзья в стэк очередь друг за другом и давай пить попивать... В общем, пили они ее по очереди, первым начал Шелдон, заним Леонард и т.д. После того как Шелдон выпил колу, он, магическим образов" раздвоился, и два Шелдона пошли в конец очереди. И так их цепочка продолжается бесконечно. Входные данные состоят из массива, который содержит пять имен и одного целого числа n. (1 ≤ n ≤ 1000000000) необходимо вернуть имя человека, который пьет n-ую банку колы. Нумирация банок идет с 1.
        static string Foo(string[] names, long n)
        {
            var result = Enumerable.Range(1, names.Length)
                .Select((m, i) => new { m, i })
                .ToDictionary(x => x.i, x=> (long)1);
            long k = 0;
            while (n>0)
            result = result.Select(i =>
             {
                 if (n > 0)
                 {
                     n -= i.Value;
                     if (n > 0)
                         k = i.Key + 1 > names.Length - 1 ? 0 : i.Key + 1;
                 }
                 return i.Value * 2;
             })
             .Select((m, i) => new { m, i })
             .ToDictionary(x => x.i, x => x.m);
 
            return names[k];             
        }
Довольно таки извращенно изощренно.

Может кто предложит более простой способ =)

Решение задачи: «Решение задачи "Кто выпьет n-ю Double Cola"»

textual
Листинг программы
program p1;
var a,b,k,l,d,e:integer;
c:boolean;
label l1;
begin
write('Type a, please ');
readln(a);
a:=(abs(a));
write('Type b, please ');
readln(b);
If b>0 then
       begin
k:=0;
l:=0;
repeat
d:= (a mod 10);
e:= (b mod 10);
c:=(d=e);
If C then
begin
k:=(d+k);
l:=(e+l);
a:=(a div 10);
b:=(b div 10);
end
else
begin
writeln('Не входит');
goto l1;
end;
until b=0;
Writeln('Входит');
l1:
       end
else writeln('Вы офигели!! Отрицательных цифр в записе числа не бывает!')
end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5
Похожие ответы