Microsoft Research запустила браузерную игру-головоломку по обучению программированию



    Microsoft Research в своем блоге анонсировала запуск браузерной игры-головоломки Code Hunt по обучению программированию на C# и Java.
    Игроку даются фрагменты кода с заранее неизвестной функциональностью. Цель игры заключается в том, чтобы на основе входных данных и ожидаемого результата, изменить код метода или функции так, чтобы выходные данные соответствовали этому ожидаемому результату.



    В начале игры игрок выбирает на каком языке (Java или C#) будут представлены фрагменты кода. В дальнейшем, в ходе игры в любой момент времени можно переключиться с одного языка на другой. Игра разделена на сектора, соответствующие разным темам программирования (циклы, массивы, работа со строками и т.д.). Каждый сектор, в свою очередь, состоит из нескольких уровней, расположенных в порядке возрастания сложности. Прохождение уровня оценивается одним, двумя или тремя «кирпичиками» в зависимости от «элегантности» написанного кода. Чем короче код, тем он считается элегантнее. Например, в задаче подсчета количества символов 'a' в строке, код
    public class Program {
    	public static int Puzzle(String s) {
    		int result = 0;
    		for (char c : s) {
    			if (c == 'a') 
    				++result;
    		}
    		return result;
        }
    }

    оценивается в один кирпичик по шкале элегантности, а вот код, имеющий ту же функциональность, но написанный с использованием регулярных выражений — уже в три кирпичика:
    public class Program {
        public static int Puzzle(String s) {        		
    		return s.replaceAll("[^a]", "").length();
        }
    }

    Конечно, эта игра больше подходит под категорию головоломок или пазлов, чем обучалок программированию, но в качестве разминки для мозгов весьма затягивает.
    Поделиться публикацией

    Комментарии 116

      –21
      Ну наконец-то они перестали зацикливаться на Azure/Cloud технологиях и подумали о пользователях!
      +3
      | Compiler timeout
      Хабраэффект?
        +2
        Решил опробовать, прошёл пару lvl. Понравилось, решил войти, дабы сохранить прогресс, а он сбросился.
        Мелочь, но неприятно.
          0
          Прогресс и без входа сохраняется, по крайней мере, до первой очистки кэша браузера.
            +2
            у меня тоже слетел, ничего не очищал.
          +2
          Какая-то игра у них сырая… Если хоть на одном тестовом случае выпадет исключение — не показывается ни один тестовый случай. Или в 1.10 — зашибись у них там «linear operation». Они хоть знают, что такое linear?..
            0
            Вполне себе линейная операция; и по первому пункту не совсем понятно, о чем вы.
              0
              Если в коде исключение — игра никак не реагирует, ответ можно ждать пока не надоест. Анимация мигает, но вывода никакого.
                0
                Можете подсказать, что это за линейная операция. А то блин вместо диплома, насилую математический пакет в попытках подобрать функцию. Ответ искать в виде полиномов Лагранжа? Или же тут используется хитрость с округлением int.
                  +1
                  Хитрость с округлением int
                  return x+y/3;
                    +1
                    Спасибо. После долгих лет учебы на физика, трудно заставить мозг перестать фильтровать неестественные (терпящие скачок) функции.
                      +3
                      мдоо. а я дошёл до такого изврата

                      беременным и слабонервным не смотреть
                      return (int)(x*(1 + Math.Log(y)/64.0));
                        0
                        там же
                        return x + y / 3;
                          0
                          Вот это решение… :)))
                          Хорошо, что я до такого не дошёл. :)
                  +2
                  А дайте elegant code для 01.06? Совсем перестал соображать уже.
                    +5
                    4/x
                      +2
                      Ах ты черт!
                      +2
                      опередили
                        0
                        Аналогичный вопрос для 02.01. Что-то не получается больше одного кирпича.
                          0
                          Скрытый текст
                          int[] a = new int[n];
                          for (int i = 0; i < n; i++) {
                          	a[i] = i;
                          }
                          return a;

                            0
                            И на это он выдаёт 1 кирпич

                            А я уже дошёл до извращений типа
                            for(int[] a=new int[n];n>0;a[n-1]=--n)if(n==1)return a;
                            
                              0
                              Ваш код не даёт три кирпича.
                              Этот:
                              int[] r = new int[n];
                              Array.ForEach(r, i => {if (i!=n-1) r[i+1]=i+1;});
                              return r;
                              

                              и такой
                              int[] result = new int[n];
                              while((result[--n]=n)>0);
                              return result;
                              

                              дают по два кирпича.
                              Как получить три — загадка.
                              И может кто подскажет как сделать на три кирпича 2.1, 2.3 и 2.5? Больше двух не получается.
                                0
                                Странно, у меня три кирпича выдает
                                  0
                                  Какой код даёт три кирпича в 2.1?
                                    0
                                    Простой, который у меня под спойлером, проходил вчера, сегодня запускаю, все равно три кирпича, мож дело в кэше?
                                      0
                                      А какой уровень программирования у вас заполнен в Settings? Может он как-то влияет. Или язык. Я на шарпе пишу.
                                        0
                                        Java. Играю без входа.
                                        +4
                                        Ветка похожа на дискуссию строителей.
                                        0
                                        public class Program {
                                        public static int[] Puzzle(int n) {
                                        int [] x = new int[n];
                                        for (int i = 0; i < n; i++) x[i] = i;
                                        return x;
                                        }
                                        }
                                          0
                                          Тоже позанимаюсь некропостингом.
                                          Специально зашёл и глянул. На три кирпича у меня там зашло
                                          return Enumerable.Range(0, n).ToArray();
                                  +4
                                  спойлер
                                  using System;
                                  using System.Linq;
                                  public class Program {
                                      public static int[] Puzzle(int n) {
                                          return Enumerable.Range(0, n).ToArray();
                                      }
                                  }
                                  

                                    0
                                    Да ёжкин тыж. На шарпе первый раз пишу, ради интереса попробовал, видимо без таких конструкций ничего толкового не выйдет =)
                                      0
                                      На Java было достаточно, дало 3 кирпича
                                      public class Program {
                                          public static int Puzzle(int n) {
                                      	int result = 0;
                                      	for (int i=0; i<n;i++){
                                      		result = result + (i*i);
                                      	}
                                              return result;
                                          }
                                      }
                                      
                                        +1
                                        На яве тоже не пишу, но ради интереса всё же спрошу.
                                        Почему вы создаёте интовую переменную и в каком месте она становится массивом?
                                          0
                                          Прошу прощения, я неверный код вставил, должен был быть этот:
                                          Скрытый текст
                                          public class Program {
                                              public static int[] Puzzle(int n) {
                                          	int[] result = new int[n];
                                          	for (int i=0; i<n;i++){
                                          		result[i]=i;
                                          	}
                                          	return result;
                                              }
                                          }
                                          

                                      0
                                      Пробовал так, на линк ругается, говорит, что не знает его.
                                        0
                                        using System.Linq; не забыли?
                                  +2
                                  Придали Pex игровую форму. Забавно, но это уже было у MS (только в другом дизайне, более хардкорно)
                                  www.pexforfun.com/
                                    0
                                    В 2.05 никак не могу выбить 3 кирпича. Оба варианта дают только два:

                                    return Enumerable.Range(0, n).Aggregate((sum, x) => x*x + sum);

                                    return Enumerable.Range(0, n).Select(x => x*x).Sum();
                                      0
                                      Enumerable.Range(0, n).Sum(i => i * i);
                                        0
                                        Очень интересный тест 2.07
                                        три кирпича на коде
                                        return s.Where(c => c == x).Count();
                                        


                                        а на этом коде всего два кирпича
                                        return s.Count(c => c == x);
                                        

                                        Майкрософт сам не умеет кодить на C#? =)

                                          0
                                          У меня выпали три кирпича на таком вот «элегантном» коде:
                                          return s.length - s.Replace(x.toString(),"").Length;
                                          0
                                          Неужели (n-1)*n*(2*n-1)/6 дает меньше кирпичей?!
                                        0
                                        Как 01.06 решить? Обычным switch? Или есть закономерность?
                                          +1
                                          Выше был ответ: 4/x
                                          +3
                                          По многим числовым задачам помогает найти ответ сервис поиска последовательностей скажем oeis.org/

                                          Например задачу 03.05 я решил так: получил два ответа (6 -> 56, 7-> 84), вбил в поиск, нашел последовательность oeis.org/A000292 применил любезно предоставленную мне формулу и получил 3 кирпичика.

                                          И так получилось решить не одну числовую задачу.
                                            0
                                            Тоже голову сломал на этой задаче. Крайне смутила категория задачи: loops
                                            +4
                                            Для любителей Javascript напоминаю про Untrusted.
                                              0
                                              Сам я не программист, но 1 уровень дошёл до 1.11. 1.12 — 1.14 не могу пройти так как не понимаю, что значит «Вам необходимо использовать оператор modulo % чтобы решить эту задачу ». Может кто-нибудь поделится ссылкой. Все попытки найти, пересылают на какие-то левые сайты.

                                              П.С. странно, что в 1.15 если ввести неправильный код выдаёт строку из трёх чисел: 33, 48, и 44 ожидают результат 41. На ум сразу же пришла идея формулы (33+48+44)/3. За разгадку дали 3 кирпичика. Но пересчитав на калькуляторе по этой формуле, получаю 41,67. Что не так?
                                                0
                                                modulo — это остаток от деления на число. Например,

                                                5 % 3 = 2
                                                6 % 3 = 0

                                                Там надо использовать этот оператор. Все примеры достаточно простые, ничего сложного вертеть не надо =).
                                                  +1
                                                  Но пересчитав на калькуляторе по этой формуле, получаю 41,67. Что не так?

                                                  Разгадка в целочисленном типе int. Только целые числа, только хардкор :)
                                                    0
                                                    Не знал о такой особенности. Хотя по логике. Должно округлиться в большую сторону. Ведь по правилам округления первая отсекаемая цифра 7. она больше 5. И если так округлять до целого, то должно выйти 42. Но это сугубо с инженерной точки зрения.
                                                      0
                                                      При подобных преобразованиях дробная часть откидывается без округления в практически любом языке программирования. Округление происходит в несколько других случаях. Более того если вы инту приравняете float/double, то тоже округления не получите!
                                                  0
                                                  А как это работает? Roslyn?
                                                    +2
                                                    элегантный код от Microsoft в 05.01
                                                    Как вам такой код?
                                                    if(len < 4)
                                                    	return "short";
                                                    		
                                                    if(len < 8)
                                                    	return "average";
                                                    		
                                                    if(len < 15)
                                                    	return "long";
                                                    			
                                                    return "super long";
                                                    


                                                    Не, недостаточно элегантно. надо так:
                                                    return len < 4 ? "short" : len < 8 ? "average" : len < 15 ? "long" : "super long";
                                                    

                                                    Всё просто и понятно!

                                                      –3
                                                      Позвольте полюбопытствовать, что с этим кодом не так? 1 строка вместо 10 с кучей if'ов это плохо, что ли?
                                                        +3
                                                        Вы не на перле программируете, случайно? =).

                                                        первый код понятен и в нём сложно ошибиться. Второй надо долго и вдумчиво читать.
                                                          –3
                                                          Нет, на джаве, но не вижу никаких проблем в разборе этого кода. Если нужна именно эта строчка, то разобраться в ней не составит труда, зато если она не нужна — придется пропустить взглядом только одну строку, а не пролистывать страницу вниз.
                                                          Правда возможно это дело привычки уже :)
                                                            +5
                                                            гм. Ну может и вправду дело привычки, но меня такая строчка в середине кода испугает. Я обычно его выношу такое в отдельный метод (numericLengthToString), а там вопросов прокрутки не стоит.
                                                      0
                                                      Забавно, что все исходники Java они переводят в C#, для этого им пришлось понаписать замен для Java API. Вот описание этой забавы от разработчиков. Похоже, они тоже повеселились, реализуя такую архитектуру.
                                                        0
                                                        Подскажите, пожалуйста, как правильно узнать количество знаков у числа и чем плох этот вариант?
                                                        Скрытый текст
                                                        public static int Puzzle(int x) {
                                                        	return String.valueOf(x).length();
                                                        }
                                                        


                                                          +1
                                                          видимо плох тем, что происходит преобразование в строку. Подумайте над десятичным логарифмом.
                                                          0
                                                          По ходу штука децел корявая, как можно в разделах loop требовать решения с помощью Linq. Если уж циклы, значит циклы.
                                                            0
                                                            ну linq — это же по сути циклы, просто записанные в другом виде.
                                                            Да и решить всё можно циклами, просто три кирпича требуют linq
                                                            0
                                                            Решение уровней 01.* на три кирпича:
                                                            Осторожно, спойлер!
                                                            01.01
                                                                public static int Puzzle(int x) {
                                                                    return -x;
                                                                }
                                                            


                                                            01.02
                                                                public static int Puzzle(int x) {
                                                                    return -x;
                                                                }
                                                            


                                                            01.03
                                                                public static int Puzzle(int x) {
                                                                    return x*x;
                                                                }
                                                            


                                                            01.04
                                                                public static int Puzzle(int x) {
                                                                    return x*3;
                                                                }
                                                            


                                                            01.05
                                                                public static int Puzzle(int x) {
                                                                    return x/3;
                                                                }
                                                            


                                                            01.06
                                                                public static int Puzzle(int x) {
                                                                    return 4/x;
                                                                }
                                                            


                                                            01.07
                                                                public static int Puzzle(int x, int y) {
                                                                    return x-y;
                                                                }
                                                            


                                                            01.08
                                                                public static int Puzzle(int x, int y) {
                                                                    return x+2*y;
                                                                }
                                                            


                                                            01.09
                                                                public static int Puzzle(int x, int y) {
                                                                    return x*y;
                                                                }
                                                            


                                                            01.10
                                                                public static int Puzzle(int x, int y) {
                                                                    return x + y/3;
                                                                }
                                                            


                                                            01.11
                                                                public static int Puzzle(int x, int y) {
                                                                    return x / y;
                                                                }
                                                            


                                                            01.12
                                                                public static int Puzzle(int x, int y) {
                                                                    return x / y;
                                                                }
                                                            


                                                            01.13
                                                                public static int Puzzle(int x) {
                                                            	return (x % 3 + 1);
                                                                }
                                                            


                                                            01.14
                                                                public static int Puzzle(int x) {
                                                            	return 10 % x;
                                                                }
                                                            


                                                            01.15
                                                                public static int Puzzle(int x, int y, int z) {
                                                                    return (x+y+z)/3;
                                                                }
                                                            


                                                              0
                                                              В 1.02 ошибочка

                                                              Скрытый текст
                                                              using System;
                                                              public class Program {
                                                                  public static int Puzzle(int x) {
                                                                      return x - 2;
                                                                  }
                                                              }
                                                              
                                                                0
                                                                Да. Спасибо. Писал методом Copy-Paste, чтобы не набирать 13 раз теги, ошибки не заставили себя ждать.
                                                                0
                                                                1.12
                                                                Скрытый текст
                                                                using System;
                                                                public class Program {
                                                                    public static int Puzzle(int x) {
                                                                        return x % 3;
                                                                    }
                                                                }
                                                                
                                                                  0
                                                                  Спасибо.
                                                                0
                                                                Решение уровней 02.* на три кирпича:
                                                                Осторожно, спойлер!
                                                                02.01
                                                                    public static int[] Puzzle(int n) {
                                                                        return Enumerable.Range(0, n).ToArray();
                                                                    }
                                                                


                                                                02.02
                                                                    public static int[] Puzzle(int n) {
                                                                        return Enumerable.Range(0, n).Select(x => x * n).ToArray();
                                                                    }
                                                                


                                                                02.03
                                                                    public static int[] Puzzle(int n) {
                                                                        return Enumerable.Range(0, n).Select(x => x * x).ToArray();
                                                                    }
                                                                


                                                                02.04
                                                                    public static int Puzzle(int[] v) {
                                                                        int sum = 0;
                                                                        foreach (int e in v) {
                                                                            sum += e;
                                                                        }
                                                                        return sum;
                                                                    }
                                                                


                                                                Удивительно, но более простой и правильный
                                                                    public static int Puzzle(int[] v) {
                                                                        return v.Sum();
                                                                    }
                                                                

                                                                не проходит из-за ужасно подобранных тестов.

                                                                02.05
                                                                    public static int Puzzle(int n) {
                                                                        return (n-1)*(n)*(2*n-1)/6;
                                                                    }
                                                                


                                                                02.06
                                                                    public static int Puzzle(string s) {
                                                                        return (new Regex("[^a]")).Replace(s, "").Length;
                                                                    }
                                                                


                                                                Опять-же, лучший код
                                                                    public static int Puzzle(string s) {
                                                                        return s.Count(c => 'a' == c);
                                                                    }
                                                                

                                                                дает всего 2 кирпича.

                                                                02.07
                                                                    public static int Puzzle(string s, char x) {
                                                                        Regex rx = new Regex("[^" + x + "]");
                                                                        return rx.Replace(s, "").Length;
                                                                    }
                                                                


                                                                И снова, код получше
                                                                public static int Puzzle(string s, char x) {
                                                                    return s.Count(c => x == c);
                                                                }
                                                                

                                                                всего 2 кирпича. Может MS накладывает штраф за использование Linq?

                                                                  0
                                                                  ну кое-где у них есть не совсем очевидные решения, в 2.04 под elegant попадает и такое решение
                                                                  int s = 0;
                                                                  for (int i=0;i < v.Length;i++) s += v[i];
                                                                  return s; 
                                                                  
                                                                    0
                                                                    02.04 можно сделать вот так:
                                                                    Скрытый текст
                                                                    using System;
                                                                    using System.Linq;
                                                                    public class Program {
                                                                        public static int Puzzle(int[] v) {
                                                                            return unchecked((int)v.Sum(x => (long)x));
                                                                        }
                                                                    }
                                                                    

                                                                    или так
                                                                    using System;
                                                                    using System.Linq;
                                                                    public class Program {
                                                                        public static int Puzzle(int[] v) {
                                                                            return v.Aggregate((x,y) => x+y);
                                                                        }
                                                                    }
                                                                    
                                                                      0
                                                                      2.06 и 2.07 Без регулярок:
                                                                      Скрытый текст
                                                                      using System;
                                                                      using System.Linq;
                                                                      public class Program {
                                                                          public static int Puzzle(string s) {
                                                                              return s.Length - s.Replace("a", "").Length;
                                                                          }
                                                                      }
                                                                      
                                                                      using System;
                                                                      using System.Linq;
                                                                      public class Program {
                                                                          public static int Puzzle(string s, char x) {
                                                                              return s.Length - s.Replace(""+x, "").Length;
                                                                          }
                                                                      }
                                                                      

                                                                        0
                                                                        2.06 Count с применением Linq работает медленнее: stackoverflow.com/questions/541954/how-would-you-count-occurrences-of-a-string-within-a-string
                                                                        0
                                                                        странно, 02.05:
                                                                        цикл работает, а Linq нет:
                                                                        good:
                                                                        int sum = 0;
                                                                        for(int i = 0; i < v.Length;++i)
                                                                        sum += v[i];
                                                                        return sum;
                                                                        bad:
                                                                        return v.Sum();
                                                                          0
                                                                          Aggregate работает. А вот Sum работает в checked блоке. Тесты плохие.
                                                                            0
                                                                            Это связано с тем, что переполнения в этой задаче разрешены. Хотя зачастую целочисленное переполнение — ошибка, бывают и случаи, когда переполнения надо игнорировать.

                                                                            Фактически, в этой задаче надо не просто подсчитать сумму элементов, а подсчитать ее в кольце вычетов по модулю 232
                                                                            0
                                                                            Решение уровней 03.* на три кирпича:
                                                                            Осторожно, спойлер!
                                                                            03.01
                                                                            Никакой код не дал 3 кирпича.

                                                                                public static int Puzzle(int number, int power) {
                                                                                     return (int)Math.Pow(number, power);
                                                                                }
                                                                            

                                                                            не проходит опять-же из-за плохих тестов.

                                                                            Простой цикл дает 2 кирпича.

                                                                            Как и такой изврат:
                                                                                public static int Puzzle(int number, int power) {
                                                                                     return Enumerable
                                                                                           .Range(0, power)
                                                                                           .Select(x => number)
                                                                                           .Aggregate(1, (i, j) => i*j);
                                                                                }
                                                                            


                                                                            За решение буду признателен.

                                                                            03.02
                                                                                public static int Puzzle(int i) {
                                                                                    return (i == 0)? 1: i * Puzzle(i-1);
                                                                                }
                                                                            


                                                                            03.03
                                                                                public static int Puzzle(int lowerBound, int upperBound) {
                                                                                    int product = 1;
                                                                                    for (int i = lowerBound; i <= upperBound; ++i) {
                                                                                        product *= i;
                                                                                    }
                                                                                    return product;
                                                                                }
                                                                            


                                                                            Можно и Linq.

                                                                            03.04
                                                                                public static int Puzzle(int n) {
                                                                                    return (n <= 0)? 0: (n+1) / 2 * ((n + 1) / 2 - 1);
                                                                                }
                                                                            


                                                                            03.05
                                                                                public static int Puzzle(int n) {
                                                                                    return n*(n+1)*(n+2)/6;
                                                                                }
                                                                            


                                                                            03.06
                                                                                public static string Puzzle(string word) {
                                                                                    return string.Join(" ", (new string('_', word.Length)).AsEnumerable());
                                                                                }
                                                                            


                                                                            03.07
                                                                                public static string Puzzle(string s) {
                                                                                    return string.Join("", 
                                                                                        s.Select(
                                                                                            c => (char)((c > 117)? (c - 21): (c + 5))
                                                                                        )
                                                                                    );
                                                                                }
                                                                            


                                                                            Код ужасный, но ради кирпичей и не такое напишешь.

                                                                            03.08
                                                                                public static int Puzzle(int x) {
                                                                                    string s = "";
                                                                                    s += x;
                                                                                    return s.Length;
                                                                                }
                                                                            


                                                                              0
                                                                              А я 3.08 решил вот так:
                                                                              Скрытый текст
                                                                              using System;
                                                                              public class Program {
                                                                                  public static int Puzzle(int x) {
                                                                                      return x.ToString().Length;
                                                                                  }
                                                                              }
                                                                              
                                                                                0
                                                                                Да. Этот вариант лучше.
                                                                                  0
                                                                                  Я на яве так:
                                                                                  Скрытый текст
                                                                                  return (int)java.lang.Math.log10(x) + 1;
                                                                                  


                                                                                  три кирпича.
                                                                                  0
                                                                                  В 03.01 и такой изврат не дает 3 кирпича:

                                                                                  public static int Puzzle(int a, int n)
                                                                                  	 { return (n == 0)?1:(((n & 1) != 0)?a:1) * Puzzle(a * a, n / 2);}
                                                                                  

                                                                                  уже вариантов 5 возведения в степень опробовал)
                                                                                    0
                                                                                    Тоже самое, я испробовал все, что только приходило в голову, штук 5 циклов, извращения с Linq, ничего не помогло.
                                                                                  –1
                                                                                  3.01 — Math.Pow не подходит не из-за плохих тестов, а потому что функция xy для вещественных чисел и для целых — это две совершенно разные функции! И Math.Pow реализует первую, в то время как нас просят реализовать вторую. (Кстати, есть еще и третья функция — для комплексных аргументов. И на внезапном ее «превращении» в другую строится одно из «доказательств» 1=-1)

                                                                                  Кстати, для справки, правильным решением данной задачи всегда было вот это (к сожалению, дает всего 1 кирпич):
                                                                                  using System;
                                                                                  using System;
                                                                                  public class Program {
                                                                                      public static int Puzzle(int a, int x) {    
                                                                                          int b = 1;
                                                                                          for (; x>0; x/=2, a*=a)
                                                                                              if (x % 2 == 1) b *= a;
                                                                                          return b;
                                                                                      }
                                                                                  }
                                                                                  
                                                                                    +2
                                                                                    UPD: нет, вру, там все-таки корявые тесты опять кольцо вычетов по модулю 232. Даже не думал, что в Math.Pow столько эвристик предусмотрели, чтобы сразу две фнукции реализовать…

                                                                                    Вот правильный код:
                                                                                    using System;
                                                                                    using System.Linq;
                                                                                    public class Program {
                                                                                        public static int Puzzle(int a, int n) {
                                                                                    		return (int)(long)Math.Pow(a, n);
                                                                                        }
                                                                                    }
                                                                                    

                                                                                      0
                                                                                      Спасибо! Единственное решение, которое проходит тест и выдает 3 кирпича. Хоть и не без грязных хаков.
                                                                                        0
                                                                                        Кстати, вот решение без хаков, тоже на три кирпича
                                                                                        Скрытый текст
                                                                                        using System;
                                                                                        public class Program {
                                                                                            public static int Puzzle(int a, int n) {
                                                                                        		return (int)Math.IEEERemainder(Math.Pow(a, n), 4294967296.0);
                                                                                            }
                                                                                        }
                                                                                        

                                                                                          0
                                                                                          И это Вы называете «без хаков»?
                                                                                            0
                                                                                            Конечно. Что из сделанного мною является хаком?

                                                                                            Требовалось вычислить an в кольце вычетов по модулю 232, чтобы влезало в int — и я сделал ровным счетом то, что требовалось: сначала возвел в степень, потом взял остаток.
                                                                                      0
                                                                                      мое решение проходит все необходимые тесты (и то самое где -14^9 = 813789696))
                                                                                      Осторожно, скриншот
                                                                                      image
                                                                                      0
                                                                                      3.07 - вариант без магических чисел
                                                                                      using System;
                                                                                      using System.Linq;
                                                                                      public class Program {
                                                                                      	const int shift = 'f'-'a';
                                                                                      	const int total = 'z'-'a'+1;
                                                                                      	public static string Puzzle(string s) {
                                                                                      		return string.Join("", 
                                                                                      			s.Select(
                                                                                      				c => (char)((c-'a' + shift)%total + 'a')
                                                                                      			));
                                                                                      	}
                                                                                      }
                                                                                      

                                                                                        0
                                                                                        Вот вариант 03.01, в лоб, за который мне дали три кирпича:

                                                                                        using System;
                                                                                        public class Program {
                                                                                            public static int Puzzle(int number, int power) {    
                                                                                                int res=1;
                                                                                        	for(int i=0;i<power;i++) res*=number;
                                                                                        	return res;
                                                                                            }
                                                                                        }
                                                                                        
                                                                                          0
                                                                                          Странно. Вчера так пробовал — 2 кирпича. Может потому что у меня переменная не res, а result называлась? Чем черт microsoft не шутит…
                                                                                            0
                                                                                            Моё решение 3.01 на три кирпича
                                                                                            using System;
                                                                                            public class Program {
                                                                                                public static int Puzzle(int number, int power) {
                                                                                            		return power==0 ? 1 : number*Puzzle(number, power-1);
                                                                                            	}
                                                                                            }
                                                                                            

                                                                                            В 3 разделе можно ещё несколько задач сдать на 3 кирпича через такую жуткую рекурсию.
                                                                                        0
                                                                                        Решение уровней 04.* на три кирпича:

                                                                                        Теперь наконец добрался до того, что еще не решено, так-что решаю в реальном времени.

                                                                                        Осторожно, спойлер!
                                                                                        04.01
                                                                                            public static bool Puzzle(bool x, bool y) {
                                                                                                return x || y;
                                                                                            }
                                                                                        


                                                                                        04.02
                                                                                            public static bool Puzzle(bool x, bool y) {
                                                                                                return x && y;
                                                                                            }
                                                                                        


                                                                                        04.03
                                                                                            public static bool Puzzle(int x) {
                                                                                                 return x < 50;
                                                                                            }
                                                                                        


                                                                                        04.04
                                                                                            public static bool Puzzle(int x, int y) {
                                                                                                return x < y;
                                                                                            }
                                                                                        


                                                                                        04.05
                                                                                            public static int Puzzle(int i) {
                                                                                                return (i == 0)? 0: Math.Abs(i)/i;
                                                                                            }
                                                                                        


                                                                                        04.06
                                                                                            public static bool Puzzle(int i, int j) {
                                                                                                return true;
                                                                                            }
                                                                                        


                                                                                        Необъяснимо, но у меня прошел такой код.

                                                                                        Второй раз тесты поменялись и прошел другой код:
                                                                                            public static bool Puzzle(int i, int j) {
                                                                                                return false;
                                                                                            }
                                                                                        


                                                                                        Если у кого-нибудь есть мысли по этому поводу, буду рад их послушать.

                                                                                        04.07
                                                                                            public static int Puzzle(int i) {
                                                                                                return (i < 100)? 2: 3;
                                                                                            }
                                                                                        


                                                                                        04.08
                                                                                            public static string Puzzle(int i) {
                                                                                                return (i % 2 == 0)? "even": "odd";
                                                                                            }
                                                                                        


                                                                                        04.09
                                                                                            public static string Puzzle(int i) {
                                                                                                return ((i % 5 == 0)? "": "not a ") + "multiple of 5";
                                                                                            }
                                                                                        


                                                                                        04.10
                                                                                            public static string Puzzle(int i, int x) {
                                                                                                return ((i % x == 0)? "": "not a ") + ("multiple of " + x);
                                                                                            }
                                                                                        


                                                                                        04.11
                                                                                            public static string Puzzle(int i, int j, int k) {
                                                                                                if (i / (double)j == j / (double)k && (i!=j)) return "yes!";
                                                                                                return "no";
                                                                                            }
                                                                                        


                                                                                        04.12
                                                                                            public static int Puzzle(int i) {
                                                                                                if (i < 8) return 0;
                                                                                                if (i < 15) return 7;
                                                                                                return 21;
                                                                                            }
                                                                                        


                                                                                          0
                                                                                          Лично у меня в 4.06 прошел такой код:
                                                                                          Скрытый текст
                                                                                          public static bool Puzzle(int i, int j) {
                                                                                                  return i > j;
                                                                                              }
                                                                                          
                                                                                            0
                                                                                            Какое-то странное задание. То true, то false, то >.

                                                                                            Подозреваю что количество тестов в сумме большое, но из них случайно выбираются 2-3.
                                                                                            +1
                                                                                            04.05, 04.11 - все намного проще
                                                                                            04.05
                                                                                            using System;
                                                                                            public class Program {
                                                                                                public static int Puzzle(int i) {
                                                                                                    return Math.Sign(i);
                                                                                                }
                                                                                            }
                                                                                            

                                                                                            04.11
                                                                                            using System;
                                                                                            public class Program {
                                                                                                public static string Puzzle(int i, int j, int k) {
                                                                                                    return i==4*k && j==2*k ? "yes!" : "no";
                                                                                                }
                                                                                            }
                                                                                            

                                                                                              0
                                                                                              Спасибо, буду знать. Программирую на C++, решил, что эта игра от Microsoft хороший способ выучить C#.
                                                                                                0
                                                                                                04.05 - тоже на отлично
                                                                                                return Integer.compare(i,0);
                                                                                                0
                                                                                                Для 04.07 методом научного тыка подошло
                                                                                                return i < 50 ? 2 : 3;
                                                                                                0
                                                                                                Нет, они совсем офигели! Почему нет кнопки багрепорта?!

                                                                                                05.03 Два решения
                                                                                                using System;
                                                                                                using System.Linq;
                                                                                                public class Program {
                                                                                                	static int gcd(int a, int b) {
                                                                                                		while (a>0) {
                                                                                                			int c = b % a;
                                                                                                			b = a;
                                                                                                			a = c;
                                                                                                		}
                                                                                                		return b;
                                                                                                	}
                                                                                                	
                                                                                                	public static bool Puzzle(int a, int b, int c) {
                                                                                                		return new[] { gcd(a,b), gcd(b,c), gcd(a,c) }.Distinct().Count() == 1
                                                                                                			&& new[] {a,b,c}.Distinct().Count() == 3;
                                                                                                	}
                                                                                                }
                                                                                                


                                                                                                using System;
                                                                                                using System.Linq;
                                                                                                public class Program {
                                                                                                	public static bool Puzzle(int a, int b, int c) {
                                                                                                		int[] args = new[] {a,b,c};
                                                                                                		return args.Distinct().Count() == 3
                                                                                                			&& Enumerable.Range(1, Math.Max(Math.Max(a,b), c))
                                                                                                				.All(d => args.Count(x => x%d==0) != 2);
                                                                                                	}
                                                                                                }
                                                                                                

                                                                                                Второе решение падает на тестах (97, 41, 3) и (33, 1, 2) — в то время как первое … просто не проверяется на этих тестах! Эти два решения выдают совершенно одинаковые результаты — но первое проходит на два кирпича — а второе не проходит.

                                                                                                Что-то расхотелось мне дальше решать…
                                                                                                  0
                                                                                                  Ммм… я сдавал такое:
                                                                                                  using System;
                                                                                                  public class Program {
                                                                                                      public static bool Puzzle(int a, int b, int c) {																										
                                                                                                  		return (a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a);
                                                                                                      }
                                                                                                  }
                                                                                                  
                                                                                                    0
                                                                                                    Мда. Это — совершенно не то же самое, что в итоге сдал я. Но мое (первое) решение прошло! Что у них там вообще за проверка?
                                                                                                  0
                                                                                                  Кто-нибудь дошел до 8 сектора?
                                                                                                  на 08.01 у меня какое-то странное поведение теста:
                                                                                                  Скриншот

                                                                                                  Сумма, факториалов от 3 до 64, конечно не помещается в Int, но по другим тестам было видно, что результат нужен по int32 кольцу. Мой метод в VisualStudio отрабатывает корректно. Баг?
                                                                                                    0
                                                                                                    По ходу, как с тестами повезет. У меня в 8.01 дают три кирпича сразу после одного теста (2, 3).
                                                                                                      0
                                                                                                      Не могли бы вы показать свое решение, тут или в личку? У меня никак не получается вызвать другие тесты :)
                                                                                                        0
                                                                                                        Собственно, у меня тот же самый код с рекурсией, что и у вас
                                                                                                        Скрытый текст
                                                                                                        private static int Fact(int x)
                                                                                                        {
                                                                                                        	return (x == 1)? 1 : x * Fact(x - 1);
                                                                                                        }
                                                                                                        	
                                                                                                        public static int Puzzle(int i, int j) 
                                                                                                        {
                                                                                                        	int sum = 0;
                                                                                                        		
                                                                                                        	for (int k = i; k <= j; k++)
                                                                                                        	{
                                                                                                        		sum += Fact(k);
                                                                                                        	}
                                                                                                        		
                                                                                                                return sum;
                                                                                                        }
                                                                                                        
                                                                                                      0
                                                                                                      Очень странно. Сделал через рекурсию, что на мой взгляд в данном примере менее эффективно, так как факториал рассчитывается каждый раз заново, и появился только 1 тест (2,3). Дали три кирпича...:
                                                                                                      Код
                                                                                                      public static int fac(int i)
                                                                                                      {
                                                                                                          if (i == 1) return 1;
                                                                                                          return i * fac(i - 1);
                                                                                                      
                                                                                                      }
                                                                                                      public static int Puzzle(int i, int j)
                                                                                                      {
                                                                                                          int sum = 0;
                                                                                                          for (int k = i; k <= j; k++)
                                                                                                              sum += fac(k);
                                                                                                          return sum;
                                                                                                      }
                                                                                                      
                                                                                                      0
                                                                                                      Кто как сделал 06.02 на Java? Придумал только два варианта за которые получил 9 скора и один кирпич

                                                                                                      Вариант раз:
                                                                                                      Скрытый текст
                                                                                                          public static String Puzzle(String s) {        
                                                                                                              for (int i = 0; i < s.length(); i += 2) {
                                                                                                                  s = s.substring(0, i) + s.substring(i,i+1).toUpperCase() + s.substring(i+1)
                                                                                                              }
                                                                                                              return s;
                                                                                                          }
                                                                                                      



                                                                                                      Вариант два:
                                                                                                      Скрытый текст
                                                                                                          public static String Puzzle(String s) {        
                                                                                                              char[] cb = s.toCharArray();
                                                                                                              for (int i = 0; i < cb.length; i += 2) {
                                                                                                                  cb[i] = Character.toUpperCase(cb[i]);
                                                                                                              }
                                                                                                              return new String(cb);
                                                                                                          }
                                                                                                      



                                                                                                      Все остальные валидные варианты (типа через StringBuffer), проверку на нечётность, дают тоже один кирпич, но скор — 0.
                                                                                                        0
                                                                                                        По примеру из статьи, на мой взгляд, вот это
                                                                                                        public class Program {
                                                                                                            public static int Puzzle(String s) {        		
                                                                                                                return s.replaceAll("[^a]", "").length();
                                                                                                            }
                                                                                                        }
                                                                                                        
                                                                                                        — ничуть не хороший код по сравнению с первым, и приветствовать такое — странно. Серьезный оверхед в виде использования регулярного выражения и создания новой строки там, где нужно просто посчитать символы 'a', ради экономии 3 строчек;
                                                                                                          0
                                                                                                          Именно. Вообще по-хорошему нужно использовать функцию вроде count.

                                                                                                          На хаскеле это выглядело бы примерно так:
                                                                                                          puzzle s = length $ filter (=='a') s

                                                                                                          Вообще, хотелось бы увидеть подобный сервис для менее популярных языков.

                                                                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                                        Самое читаемое