Комментарии 116
Ну наконец-то они перестали зацикливаться на Azure/Cloud технологиях и подумали о пользователях!
| Compiler timeout
Хабраэффект?
Хабраэффект?
Решил опробовать, прошёл пару lvl. Понравилось, решил войти, дабы сохранить прогресс, а он сбросился.
Мелочь, но неприятно.
Мелочь, но неприятно.
Какая-то игра у них сырая… Если хоть на одном тестовом случае выпадет исключение — не показывается ни один тестовый случай. Или в 1.10 — зашибись у них там «linear operation». Они хоть знают, что такое linear?..
Вполне себе линейная операция; и по первому пункту не совсем понятно, о чем вы.
Если в коде исключение — игра никак не реагирует, ответ можно ждать пока не надоест. Анимация мигает, но вывода никакого.
Можете подсказать, что это за линейная операция. А то блин вместо диплома, насилую математический пакет в попытках подобрать функцию. Ответ искать в виде полиномов Лагранжа? Или же тут используется хитрость с округлением int.
Хитрость с округлением int
return x+y/3;
Спасибо. После долгих лет учебы на физика, трудно заставить мозг перестать фильтровать неестественные (терпящие скачок) функции.
мдоо. а я дошёл до такого изврата
беременным и слабонервным не смотреть
return (int)(x*(1 + Math.Log(y)/64.0));
А дайте elegant code для 01.06? Совсем перестал соображать уже.
4/x
опередили
Аналогичный вопрос для 02.01. Что-то не получается больше одного кирпича.
Скрытый текст
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = i;
}
return a;
И на это он выдаёт 1 кирпич

А я уже дошёл до извращений типа

А я уже дошёл до извращений типа
for(int[] a=new int[n];n>0;a[n-1]=--n)if(n==1)return a;
Ваш код не даёт три кирпича.
Этот:
и такой
дают по два кирпича.
Как получить три — загадка.
И может кто подскажет как сделать на три кирпича 2.1, 2.3 и 2.5? Больше двух не получается.
Этот:
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? Больше двух не получается.
Странно, у меня три кирпича выдает
Какой код даёт три кирпича в 2.1?
Простой, который у меня под спойлером, проходил вчера, сегодня запускаю, все равно три кирпича, мож дело в кэше?
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;
}
}
public static int[] Puzzle(int n) {
int [] x = new int[n];
for (int i = 0; i < n; i++) x[i] = i;
return x;
}
}
спойлер
using System;
using System.Linq;
public class Program {
public static int[] Puzzle(int n) {
return Enumerable.Range(0, n).ToArray();
}
}
Да ёжкин тыж. На шарпе первый раз пишу, ради интереса попробовал, видимо без таких конструкций ничего толкового не выйдет =)
На 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;
}
}
На яве тоже не пишу, но ради интереса всё же спрошу.
Почему вы создаёте интовую переменную и в каком месте она становится массивом?
Почему вы создаёте интовую переменную и в каком месте она становится массивом?
Пробовал так, на линк ругается, говорит, что не знает его.
Придали Pex игровую форму. Забавно, но это уже было у MS (только в другом дизайне, более хардкорно)
www.pexforfun.com/
www.pexforfun.com/
В 2.05 никак не могу выбить 3 кирпича. Оба варианта дают только два:
return Enumerable.Range(0, n).Aggregate((sum, x) => x*x + sum);
return Enumerable.Range(0, n).Select(x => x*x).Sum();
return Enumerable.Range(0, n).Aggregate((sum, x) => x*x + sum);
return Enumerable.Range(0, n).Select(x => x*x).Sum();
Enumerable.Range(0, n).Sum(i => i * i);
Очень интересный тест 2.07
три кирпича на коде
а на этом коде всего два кирпича
Майкрософт сам не умеет кодить на C#? =)
return s.Where(c => c == x).Count();
а на этом коде всего два кирпича
return s.Count(c => c == x);
Майкрософт сам не умеет кодить на C#? =)
Неужели
(n-1)*n*(2*n-1)/6
дает меньше кирпичей?!Как 01.06 решить? Обычным switch? Или есть закономерность?
По многим числовым задачам помогает найти ответ сервис поиска последовательностей скажем oeis.org/
Например задачу 03.05 я решил так: получил два ответа (6 -> 56, 7-> 84), вбил в поиск, нашел последовательность oeis.org/A000292 применил любезно предоставленную мне формулу и получил 3 кирпичика.
И так получилось решить не одну числовую задачу.
Например задачу 03.05 я решил так: получил два ответа (6 -> 56, 7-> 84), вбил в поиск, нашел последовательность oeis.org/A000292 применил любезно предоставленную мне формулу и получил 3 кирпичика.
И так получилось решить не одну числовую задачу.
Сам я не программист, но 1 уровень дошёл до 1.11. 1.12 — 1.14 не могу пройти так как не понимаю, что значит «Вам необходимо использовать оператор modulo % чтобы решить эту задачу ». Может кто-нибудь поделится ссылкой. Все попытки найти, пересылают на какие-то левые сайты.
П.С. странно, что в 1.15 если ввести неправильный код выдаёт строку из трёх чисел: 33, 48, и 44 ожидают результат 41. На ум сразу же пришла идея формулы (33+48+44)/3. За разгадку дали 3 кирпичика. Но пересчитав на калькуляторе по этой формуле, получаю 41,67. Что не так?
П.С. странно, что в 1.15 если ввести неправильный код выдаёт строку из трёх чисел: 33, 48, и 44 ожидают результат 41. На ум сразу же пришла идея формулы (33+48+44)/3. За разгадку дали 3 кирпичика. Но пересчитав на калькуляторе по этой формуле, получаю 41,67. Что не так?
modulo — это остаток от деления на число. Например,
5 % 3 = 2
6 % 3 = 0
Там надо использовать этот оператор. Все примеры достаточно простые, ничего сложного вертеть не надо =).
5 % 3 = 2
6 % 3 = 0
Там надо использовать этот оператор. Все примеры достаточно простые, ничего сложного вертеть не надо =).
Но пересчитав на калькуляторе по этой формуле, получаю 41,67. Что не так?
Разгадка в целочисленном типе
int
. Только целые числа, только хардкор :)Не знал о такой особенности. Хотя по логике. Должно округлиться в большую сторону. Ведь по правилам округления первая отсекаемая цифра 7. она больше 5. И если так округлять до целого, то должно выйти 42. Но это сугубо с инженерной точки зрения.
А как это работает? Roslyn?
элегантный код от 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";
Всё просто и понятно!
Позвольте полюбопытствовать, что с этим кодом не так? 1 строка вместо 10 с кучей if'ов это плохо, что ли?
Вы не на перле программируете, случайно? =).
первый код понятен и в нём сложно ошибиться. Второй надо долго и вдумчиво читать.
первый код понятен и в нём сложно ошибиться. Второй надо долго и вдумчиво читать.
Нет, на джаве, но не вижу никаких проблем в разборе этого кода. Если нужна именно эта строчка, то разобраться в ней не составит труда, зато если она не нужна — придется пропустить взглядом только одну строку, а не пролистывать страницу вниз.
Правда возможно это дело привычки уже :)
Правда возможно это дело привычки уже :)
Подскажите, пожалуйста, как правильно узнать количество знаков у числа и чем плох этот вариант?
Скрытый текст
public static int Puzzle(int x) {
return String.valueOf(x).length();
}
По ходу штука децел корявая, как можно в разделах loop требовать решения с помощью Linq. Если уж циклы, значит циклы.
Решение уровней 01.* на три кирпича:
Осторожно, спойлер!
01.01
01.02
01.03
01.04
01.05
01.06
01.07
01.08
01.09
01.10
01.11
01.12
01.13
01.14
01.15
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;
}
В 1.02 ошибочка
Скрытый текст
using System;
public class Program {
public static int Puzzle(int x) {
return x - 2;
}
}
1.12
Скрытый текст
using System;
public class Program {
public static int Puzzle(int x) {
return x % 3;
}
}
Решение уровней 02.* на три кирпича:
Осторожно, спойлер!
02.01
02.02
02.03
02.04
Удивительно, но более простой и правильный
не проходит из-за ужасно подобранных тестов.
02.05
02.06
Опять-же, лучший код
дает всего 2 кирпича.
02.07
И снова, код получше
всего 2 кирпича. Может MS накладывает штраф за использование Linq?
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?
ну кое-где у них есть не совсем очевидные решения, в 2.04 под elegant попадает и такое решение
int s = 0;
for (int i=0;i < v.Length;i++) s += v[i];
return s;
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);
}
}
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;
}
}
2.06 Count с применением Linq работает медленнее: stackoverflow.com/questions/541954/how-would-you-count-occurrences-of-a-string-within-a-string
странно, 02.05:
цикл работает, а Linq нет:
good:
int sum = 0;
for(int i = 0; i < v.Length;++i)
sum += v[i];
return sum;
bad:
return v.Sum();
цикл работает, а Linq нет:
good:
int sum = 0;
for(int i = 0; i < v.Length;++i)
sum += v[i];
return sum;
bad:
return v.Sum();
Aggregate работает. А вот Sum работает в checked блоке. Тесты плохие.
Это связано с тем, что переполнения в этой задаче разрешены. Хотя зачастую целочисленное переполнение — ошибка, бывают и случаи, когда переполнения надо игнорировать.
Фактически, в этой задаче надо не просто подсчитать сумму элементов, а подсчитать ее в кольце вычетов по модулю 232
Фактически, в этой задаче надо не просто подсчитать сумму элементов, а подсчитать ее в кольце вычетов по модулю 232
Решение уровней 03.* на три кирпича:
Осторожно, спойлер!
03.01
Никакой код не дал 3 кирпича.
не проходит опять-же из-за плохих тестов.
Простой цикл дает 2 кирпича.
Как и такой изврат:
За решение буду признателен.
03.02
03.03
Можно и Linq.
03.04
03.05
03.06
03.07
Код ужасный, но ради кирпичей и не такое напишешь.
03.08
Никакой код не дал 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;
}
А я 3.08 решил вот так:
Скрытый текст
using System;
public class Program {
public static int Puzzle(int x) {
return x.ToString().Length;
}
}
В 03.01 и такой изврат не дает 3 кирпича:
уже вариантов 5 возведения в степень опробовал)
public static int Puzzle(int a, int n)
{ return (n == 0)?1:(((n & 1) != 0)?a:1) * Puzzle(a * a, n / 2);}
уже вариантов 5 возведения в степень опробовал)
3.01 — Math.Pow не подходит не из-за плохих тестов, а потому что функция xy для вещественных чисел и для целых — это две совершенно разные функции! И Math.Pow реализует первую, в то время как нас просят реализовать вторую. (Кстати, есть еще и третья функция — для комплексных аргументов. И на внезапном ее «превращении» в другую строится одно из «доказательств» 1=-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;
}
}
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);
}
}
Спасибо! Единственное решение, которое проходит тест и выдает 3 кирпича. Хоть и не без грязных хаков.
мое решение проходит все необходимые тесты (и то самое где -14^9 = 813789696))
Осторожно, скриншот

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')
));
}
}
Вот вариант 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;
}
}
Странно. Вчера так пробовал — 2 кирпича. Может потому что у меня переменная не res, а result называлась? Чем черт microsoft не шутит…
Решение уровней 04.* на три кирпича:
Теперь наконец добрался до того, что еще не решено, так-что решаю в реальном времени.
Теперь наконец добрался до того, что еще не решено, так-что решаю в реальном времени.
Осторожно, спойлер!
04.01
04.02
04.03
04.04
04.05
04.06
Необъяснимо, но у меня прошел такой код.
Второй раз тесты поменялись и прошел другой код:
Если у кого-нибудь есть мысли по этому поводу, буду рад их послушать.
04.07
04.08
04.09
04.10
04.11
04.12
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;
}
Лично у меня в 4.06 прошел такой код:
Скрытый текст
public static bool Puzzle(int i, int j) {
return i > j;
}
04.05, 04.11 - все намного проще
04.05
04.11
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";
}
}
Для 04.07 методом научного тыка подошло
return i < 50 ? 2 : 3;
Нет, они совсем офигели! Почему нет кнопки багрепорта?!
Второе решение падает на тестах
Что-то расхотелось мне дальше решать…
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)
— в то время как первое … просто не проверяется на этих тестах! Эти два решения выдают совершенно одинаковые результаты — но первое проходит на два кирпича — а второе не проходит.Что-то расхотелось мне дальше решать…
Кто-нибудь дошел до 8 сектора?
на 08.01 у меня какое-то странное поведение теста:
Сумма, факториалов от 3 до 64, конечно не помещается в Int, но по другим тестам было видно, что результат нужен по int32 кольцу. Мой метод в VisualStudio отрабатывает корректно. Баг?
на 08.01 у меня какое-то странное поведение теста:
Скриншот

Сумма, факториалов от 3 до 64, конечно не помещается в Int, но по другим тестам было видно, что результат нужен по int32 кольцу. Мой метод в VisualStudio отрабатывает корректно. Баг?
По ходу, как с тестами повезет. У меня в 8.01 дают три кирпича сразу после одного теста (2, 3).
Не могли бы вы показать свое решение, тут или в личку? У меня никак не получается вызвать другие тесты :)
Очень странно. Сделал через рекурсию, что на мой взгляд в данном примере менее эффективно, так как факториал рассчитывается каждый раз заново, и появился только 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;
}
Кто как сделал 06.02 на Java? Придумал только два варианта за которые получил 9 скора и один кирпич
Вариант раз:
Вариант два:
Все остальные валидные варианты (типа через StringBuffer), проверку на нечётность, дают тоже один кирпич, но скор — 0.
Вариант раз:
Скрытый текст
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.
По примеру из статьи, на мой взгляд, вот это
public class Program {
public static int Puzzle(String s) {
return s.replaceAll("[^a]", "").length();
}
}
— ничуть не хороший код по сравнению с первым, и приветствовать такое — странно. Серьезный оверхед в виде использования регулярного выражения и создания новой строки там, где нужно просто посчитать символы 'a', ради экономии 3 строчек;Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Microsoft Research запустила браузерную игру-головоломку по обучению программированию