1. C# / Говнокод #16008

    +134

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    // Как вы думаете какой вариант кода более правильный?
    using System;
    using System.Linq;
    public class Program {
        public static int Puzzle(string s) {
            return s.Where(x=>x=='a').Count();
        }
    }
    // Или вот этот?
    using System;
    using System.Linq;
    public class Program {
        public static int Puzzle(string s) {
            return s.Count(x=>x=='a');
        }
    }
    //С точки зрения Майкрософт 1-ый вариант лучше

    Майкрософт запустила игру головоломку, каждая из головоломок решается определнным кодом. После - элегантность решения оценивается, весьма неоднозначным способом.
    Подробнее - https://www.codehunt.com/ и статейка на хабре http://habrahabr.ru/post/223173/ . Данная особенность замечена не мной, задачи 2.06 и 2.07

    Запостил: Zuzik, 18 Мая 2014

    Комментарии (88) RSS

    • cleaned
      Ответить
    • И как это было мотивировано?
      Ответить
      • Что именно?
        Ответить
        • То что первый вариант лучше.
          Ответить
          • А не было объяснений))) Оценка за код - от одного до трех кирпичиков, без объяснений. 1-ый - два кирпича, второй - 3 кирпича.
            Ответить
            • Больше кирпичиков - хуже?
              Ответить
            • Черт, ошибся я. За первый дали 3 кирпича, за второй - 2 кирпича.
              Ответить
            • >1-ый - два кирпича, второй - 3 кирпича.
              > чем больше тем лучше.
              Имея навыки оверинжиниринга и познания в паттернах запросто можно и забор высрать.
              Ответить
              • Интересно, за фабрику билдеров сколько кирпичей отложат?
                Ответить
    • > Java, C#
      Игра о том, как жаваёбы соснули преимуществах c#?
      Ответить
      • Да, ибо часть решений на шарпе считаются наиболее красивыми только в случае использования Linq, циклы, их не устраивают. Да и сам Java код переводится в исходный код на шарпе http://research.microsoft.com/pubs/210651/CodeHunt%20SBST%202014b.pdf .
        Ответить
        • А чем linq так плох? Или его выразительность не дотягивает до питоновского ФП?
          Ответить
        • if (!code.Contains("linq"))
          {
              kirpichi--;
          }
          Ответить
    • // Как вы думаете какой вариант кода более правильный?
      using System;
      using System.Linq;
      public class Program {
          public static int Puzzle(string s) {
              return s.Where(x=>x=='a').AssParallel().Count();
          }
      }

      Высрал 4 кирпича!
      Ответить
      • А как правильнее?
        return s.AssParallel().Where(x=>x=='a').Count();
        return s.Where(x=>x=='a').AssParallel().Count();
        //или
        return s.Where(x=>x=='a').Count().AssParallel();
        
        
        //Я само собой за 
        return s.Where(x=>x=='a').Count().AssParallel().AssParallel();
        Ответить
        • > А как правильнее?
          return s.AssParallel().Where(x=>x=='a').AssParallel().Count().AssParallel();
          Ответить
    • Еще меня настораживает что оно какое-то дико глючное и сырое.
      Пробовал в 3(трёх!) разных браузерах. И везде какие-то баги, фф (я даже последнюю версию качнул для верности) например не показывает панель ожидаемого результата.
      TypeError: window.frames[this.iframeId(...)].postMessage is not a function
      В опере:
      Uncaught exception: DOMException: INVALID_STATE_ERR
      Error thrown at line 1, column 220843 in o(n, i) in https://www.codehunt.com/customjquery?v=KxW2BdonKMS7e8z5EoxVNWzqs W_nv2kmrXhDf0XsvQo1:

      Это мс-дерьмо надо в ишаке штоле запускать?
      Ответить
      • > Это мс-дерьмо надо в ишаке штоле запускать?
        Х.з. Сейчас прошел пару уровней в FF29.0/ubuntu14.04 - нормально работает. Ну тестирование подлагивает, но это терпимо и объяснимо.
        Ответить
        • >Ну тестирование подлагивает, но это терпимо и объяснимо.
          Да на некоторых программах (см. ниже) я так и не дождался результата. Если не трудно - попробуй запустить мои примеры.

          >FF29.0 - нормально работает.
          Тормознуто очень. И много по сети гоняет.
          Ответить
          • > Да на некоторых программах (см. ниже) я так и не дождался результата.
            На хабре писали, что если прога кинет исключение - ответа не дождешься. А жаба там транслируется через жопу шарп, а в шарпе переполнения, емнип, проверяются и бросают экцепшн... Может быть в этом проблема?
            Ответить
            • А кстати попробовал на шарпе, там работает
              return (int)((((long)i)*0x55555556L)>>32);
              Выдало мисматч:
              -64 -21 -22
              Ответить
              • Хм, а в арифметике 02 проканало return x + 0xFFFFFFFE; Видимо переполнения тут не при делах.

                P.S. Байтоёбы набежали на кодехант.
                Ответить
                • У них просто жаба мелкософтовская. То есть хуёвая до горя.
                  Типа вот, даже в тестах, жаба - говно.
                  x/3
                  Три кирпича, лол
                  return (int)  ((((long)x)*0x55555556L)>>32)
                  		+(x<0 ? 1 : 0);

                  Юзать, повторюсь в C#
                  Ответить
    • https://www.codehunt.com/#/sectors/Arithmetic/05
      Решение x/3 показалось мне банальным
      Решил попробовать что-нибудь посложнее.
      Ни на одно из джвух решений я не получил никакого ответа:
      а) return (int)((((long)i)*0x55555556L)>>32);
      б) int n=x<<16;
      n+=n>>2;
      n+=n>>4;
      n+=n>>8;
      n+=n>>16;
      n+=0x1; return n>>18;
      Ответить
      • в) linq-style решение тоже не прокатило
        return BigInteger.valueOf(x).divide(BigInteger. valueOf(3)).intValue();
        Package java.math not found.
        А то есть преимущество C#, в using System.Linq, а жаба сосёт потому что в ней нет java.math из стандартной либы?!
        Ответить
      • Зато в Arithmetic/01 приняло ~x + 1 вместо -x, и даже посчитало элегантным :P
        Ответить
        • >Зато в Arithmetic/01 приняло ~x + 1 вместо -x
          Ха! Я тоже так сделал!
          Но это не оправдывает того что байтоебство с делением на 3 тупо виснет
          Ответить
      • x = x + (x>>31 & 2);
        	   	int q = (x >> 2) + (x >> 4);
        	   	q += q >> 4;       
        	   	q += q >> 8;
        	   	q += q >> 16;
        		int r = x - q-q-q;
           		return q + (((r<<3)+r+r+r) >> 5);

        you wrote elegant code!
        Ответить
        • > you wrote elegant code!
          А то ;)
          Ответить
          • ё.. в рот, элегантный код
            Ответить
          • Я думал что оно просто проверяет "элегантность" не по размеру и эзотеричности, а по наличию таких операторов ветвления и цикла.
            https://www.codehunt.com/#/sectors/Arithmetic/09
            public static int Puzzle(int x, int y) {
            		int s=0;
                    for (int i=0;i<x;++i) s=add(s,y);
            		return s;
                }
            	static int add(int a, int b){
            		return (0==b) ? a : add(++a,--b);
            	}

            Однако я ошибался. Снова 3 кирпича.
            Ответить
            • > Однако я ошибался. Снова 3 кирпича.
              Может быть жабе дают фору и на ней всегда 3 кирпича?
              Ответить
              • Та не. В шарпе тоже. У меня в принципе никак не получается высрать менее трёх:
                static int a;
                      public static int Puzzle(int x, int y) {
                		a=x;
                		return mul(0,y);
                      }
                	static int add(int a, int b){
                		return (0==b) ? a : add(++a,--b);
                	}
                	static int mul(int sum, int cnt){
                		return (0==cnt) ? sum : mul(add(sum,a),--cnt);
                	}
                //а так умножали русские крестьяне
                return mul1(x, y,0);
                    static int mul1(int a,int b,int sum) {
                        return (0 == a) ? sum : mul1(a>>1,b<<1, sum+ ((-(a&1))&b) );
                    }
                Ответить
                • > никак не получается высрать менее трёх
                  Ну вот я в арифметике 14 высрал единичку вот таким пиздецом (в упор не пойму, какую функцию они имели в виду):
                  x = Math.abs(x);
                  if (x <= 10) {
                      if (x == 3 || x == 4) return x - 2;
                      if (x >= 6) return 10 - x;
                      return 0;
                  }
                  return 10;
                  
                  // и таким тоже единичку
                  return x == 3 || x == 4 ? x - 2 :
                      x <= 10 ? (x >= 6 ? 10 - x : 0) : 10;
                  Может быть по числу различных ветвей считает?
                  Ответить
                  • >Может быть по числу различных ветвей считает?
                    Ну да. Если ветвлениями подгонка под ответ.
                    Типа неуниверсальный код.

                    >в упор не пойму, какую функцию они имели в виду
                    А я на 10-й застпорился по той же причине.
                    Ответить
                    • > А я на 10-й застпорился по той же причине.
                      А в десятой, кстати, легко. Если побольше примеров надергать подгонкой - можно догадаться что там за линейная операция.
                      Ответить
                      • Догадался.
                        > Если побольше примеров надергать подгонкой
                        Просто у меня он выдаёт их раз в пару минут.
                        Ответить
                        • > Просто у меня он выдаёт их раз в пару минут.
                          Там, кстати, чит есть - если напихать ветвей с if (x == n), то он выведет по контрпримеру на каждую. Так можно за один запуск получить пачку примеров для нужных тебе значений, а не тех, которые взбредут в голову ИИ.
                          Ответить
                          • http://prntscr.com/3kpc1e
                            Ответить
                            • Здесь область с ненулевым ответом очень узкая, и ты ее полностью перечислил в своем switch'е. Контрпример придумать не получится. И до этого кода доебаться не сможет даже человек (если он его конечно не прочтет).
                              Ответить
                      • 11-й codehurt таки выдал 1 кирпич!
                        while (x>=3) x-=3;while (x<=-3) x+=3;return x;
                        Ответить
                        • > 11-й codehurt таки выдал 1 кирпич!
                          А я таки прошел 14й, ответ настолько простой...

                          P.S. Если я закрою браузер - прогресс сохранится?
                          Ответить
                          • Да вроде как. Но у некоторых прогресс слетал.
                            Ответить
                            • Фак. Я даже залогинился, отошёл, прихожу:
                              Oops, something went wrong...
                              oops, something went wrong.error
                              Но эта сука требует доступ к личным данным фейкоакка.
                              Ответить
                          • >А я таки прошел 14й, ответ настолько простой...
                            Шото нихера простого не придумывается
                            x=System.Math.Abs(x);
                            if (x>10) return 10;
                            return ((10-x) %5)*(x/5)+(x-2)%3*(0==(x-3)/2?1:0);

                            Зато 15-й с первого же раза :)
                            Ответить
                            • 14 очень простой, 10/x
                              Ответить
                              • FFFFUUUU
                                Ответить
                              • Черт, малость не то,операцию перепутал 10%x
                                Ответить
                                • Да я всё понял.
                                  Вот что он хочет на 3 кирпича:? В Loops/05. LINQ?
                                  int s=0; for (int i=1,p=0;i<(x-1)*2;i+=2) { p+=i;s+=p;}
                                  return s;

                                  Я уже и так, и так. А. Хотя я знаю. Там же формула есть.
                                  Ответить
                                  • > В Loops/05
                                    Я вот так написал: Enumerable.Range(0, n).Sum(x => x*x);

                                    > Там же формула есть.
                                    Ее выводить/вспоминать...

                                    З.Ы.: return (2*n*n*n - 3*n*n + n) / 6;
                                    Ответить
                                    • >Я вот так написал:
                                      А в жаве как?
                                      Тем формула асимптотически быстрее, что при запуске Enumerable.Range(0, n).Sum(x => x*x); выразилось в Compiler timeout. Пятый раз уже запускаю - снова и снова таймаут.

                                      А формула с первого раза заработала: return --n*(n+1)*(2*n+1)/6 ;

                                      Ответить
                                    • >Я вот так написал: Enumerable.Range(0, n).Sum(x => x*x);
                                      И сколько дало кирпичей? Никак получается скомпилить.
                                      Ответить
                                      • > И сколько дало кирпичей?
                                        Три, как и формула.

                                        > Никак получается скомпилить.
                                        Ага, уже давно через раз запускается, я на сегодня забил, видимо европа с америкой набижали.
                                        Ответить
                                        • Вот говно. Ну не работает у меня никак это ваше LINQ.
                                          И кстати тупые программы - поиск циклом, формулы - гораздо быстрее отрабатывают.
                                          Ответить
                                          • > поиск циклом
                                            Скучно же... С LINQ интересней возиться.
                                            Ответить
                                            • Навязывают своё говно, фор он в любом языке от сишки до js отлично работает - получается портируемый на другие языки код. А так надо запоминать как что, откуда импортить, какие есть методы итп.
                                              >Скучно же...
                                              Скучные обои императивные циклы.
                                              Ответить
                                              • > Скучные циклы.
                                                C# с нескучными обоями LINQ.
                                                Ответить
                                                • Вот сцуко написал простой и очевидный цикл для подсчёта а, задача из топика.
                                                  Работает. Десятый раз запускаю "элегантный":
                                                  return s.length()-s.replaceAll("a","").length();
                                                  Пустое окно ответа. WTF?

                                                  В жабе на каждом вызове replaceAll компилится дорогостоящий объект регулярного выражения.
                                                  EDIT:
                                                  return s.length()-s.replaceAll("a","").length()+1-1;
                                                  А вот так заработало. У меня CODEHURT
                                                  Ответить
    • // 3.01
      return Math.Pow(number, power); // неправильный ответ (т.к. насыщается до минимального инта)
      return Enumerable.Range(0, power).Aggregate(1, (s, i) => s * number); // 2 балла
      return Enumerable.Repeat(number, power).Aggregate(1, (s, i) => s * i); // 2 балла
      int res = 1;
      for (int i=0; i<power; i++)
          res *= number;
      return res; // 2 балла
      Там вообще реально 3 кирпича получить?
      Ответить
      • > Там вообще реально 3 кирпича получить?
        Вот за это элегантнейшее решение дали 3 кирпича:
        return (int)((long)Math.Pow(number, power) & 0xFFFFFFFF);
        P.S. Вот получше:
        return (int)(long)Math.Pow(number, power);
        Ответить
        • >неправильный ответ (т.к. насыщается до минимального инта)
          Дык, я сходу написал Math.Pow и потом просто откастил.
          long l=(long)Math.pow(number,power);
          return (int)l;
          Проблема в том что таким образом вычисляем какое-то неправильное говно - степень по модулю 2^32.
          Смысл в говнозадаче? Найти хеш ? Или модуль?
          Ответить
    • У всех compiler timeout, или только мне так везет?
      Ответить
    • > Use a while loop to count the number of digits in the number x
      return (int)Math.Floor(Math.Log10(x)) + 1;
      Ответить
      • > Use a while loop to count the number of digits in the number x
        Пиздец феерический.
        Ответить
        • >> Use a while loop to count the number of digits in the number x
          >> return (int)Math.Floor(Math.Log10(x)) + 1;

          >Пиздец феерический.
          Полчаса жарился
          i &= i-1;
          i *=10;
          int n = 1;
          if (i >>> 16 == 0) { n += 16; i <<= 16; }
          if (i >>> 24 == 0) { n +=  8; i <<=  8; }
          if (i >>> 28 == 0) { n +=  4; i <<=  4; }
          if (i >>> 30 == 0) { n +=  2; i <<=  2; }
          n -= i >>> 31;
          n = 32-n;
          return (n*30/100);

          А эта "маштабируемая" сука отказывается компилить.
          Ответить
    • А в Loops 2/04 нет ничего более элегантного?
      int n= (x-1)/2; return (n<0)?0:n*(n+1);
      Ответить
    • Это какая-то совершенно особая, микрософтовская жаба.
      char[] a = new char[s.length()];
              for (int i=0;i<a.length;++i) a[i]=(char)(s.charAt(i)+5);
      return new String(a);
      Cannot implicitly convert type 'char[]' to 'string'
      Ох не зря их погнали sSunными тряпками, ох не зря.

      http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#String(char[])
      Ответить
      • > Это какая-то совершенно особая, микрософтовская жаба.
        Эта "жаба" транслируется в шарп на уровне исходников.

        http://research.microsoft.com/pubs/210651/CodeHunt%20SBST%202014b.pdf
        Ответить
        • Both the front-end and the back-end have been designed for maximum scalability, dynamically increasing the number of cores available to serve an arbitrary number of users.

          > У всех compiler timeout, или только мне так везет?
          Ответить
          • > maximum scalability,
            Вчера забил, так и не смог регэксами решить дождаться, теперь не могу пройти Loops 2/07 из-за этого самого compiler timeout.
            Потому решаю в несколько потоков-закладок.
            Ответить
        • >>Эта "жаба" транслируется в шарп на уровне исходников.
          Если переключиться с жабы на проклятый диез, то оно конвертит и показывает во что превращается код, как оказалось
          return new String(charArray); => return charArray;
          Ответить
    • Conditionals 4.12
      Можно ли проще высрать три кирпича?
      return Math.min( 21, ((i-1)/7+((i+1)>>4))*7);
      А. Хотя там можно использовать вид битов -8, +7 или просто сделать Math.min, Math.max
      Ответить
    • 5.01
      //1 балл
      		return new String[]{
      		"short","short","short","short"
      		,"average","average","average","average"
      		,"long","long","long","long"
      		 ,"long","long","long"
      		,"super long","super long","super long"
      		,"super long","super long","super long"
      		}
              [s.length()];
      //2 балла
      if(len < 4)    return "short";
      if(len < 8)    return "average";
      if(len < 15)    return "long";            
      return "super long";
      //3 балла
      return len < 4 ? "short" : len < 8 ? "average" : len < 15 ? "long" : "super long";
      Ответить
      • Но!
        Если немного улучшить 1-е говнорешение, то стаёт 2 балла.
        int slen=s.length();
        return new String[]{
        	"short"
        	,"average"
        	,"long","long"
        	,"super long","super long","super long"
        }
        [((slen+1)>>4)+slen/4];
        Ответить
        • Но самое смешное, если написать совершенно левый и бесполезный тернарник говно заработавает три очка!
          int slen=s.length();
          slen=s.length()>100?s.length():slen;
          
          return new String[]{
          	"short"
          	,"average"
          	,"long","long"
          	,"super long","super long","super long"
          }
          [((slen+1)>>4)+slen/4];
          //я сначала написал такое, и двигая тернарник заметил что разница только в нём
          return slen>=15
          ?"super long"
          : new String[]{"short"	,"average","long","long"}[slen/4];

          Ответить
    • Ну что за. Оставил в 5.05 простенький unsed!-метод на 5 строк - 1 кирпич. Убрал - 3.
      В первых примерах никакими изъебами меньше трёх не удавалось выбить, сложения рекурсивно, байтоебские деления - нипочём, а тут такое.

      Еще некоторые тесты проходят тупо по return true/false. Иногда через раз.
      Ответить
    • Шарпотранслятор не хочет комипилить вполне валидный жабокод:
      Puzzle(String a, String b) {
          return (a+b).substring(0
               , (Math.max( a.length()+b.length(),0 ))
            );

      please rewrite so that argument 1 of this function does not have side-effects
      Ответить
    • 6.12
      Пробую:
      a)return s+new StringBuilder(s).reverse();
      b)return new StringBuilder(s).reverse().insert(0,s).t oString();
      Казалось бы элегантный one-liner в флюент LINQ-стиле.
      1 кирпич.
      Ответить
    • 7.07
      Что там за дрочь с регулярными выражениями:
      return s.replaceAll("[auieo]","");
      Bad Dependency Invalid Referenced Types [auieo]"
      Так заработало: return s.replaceAll("(a)|(u)|(i)|(e)|(o)","");
      Ответить
    • Как проблему с null в 8.1 решить?
      Нихера не понял, вписал в жабе Integer, возвращал null - не компилируется.

      Но если написать пару рандомных частных случаев сверху, то test-case (y=64 с null) не выпадает .
      if (x == 2 && y==3) return 8;
      if (x == 2 && y==4) return 24+8;
              long s = 0, f = 1;
              for (int i = 2; i <= y; ++i) {
                  f *= i;
                  if (i >= x) s += f;
              }
              return (int) s;

      Джва кирипича.
      А если оставить один частный случай - даёт все три. Вот так код кодхёрт.
      Ответить
    • 9.03
      for (int a:list) if (a==i) return true; 
      return false;

      1 кирпич

      Ок. Будем юзать коллекции с оверхедом и боксингом
      return java.util.Collections.unmodifiableSet(list).contains(i);
      cannot find field Collections
      Ok.
      return java.util.Arrays.asList(list).contains(i);
      method asList not found (did you forget an 'import' declaration?)
      Переключаюсь на C#
      return Array.IndexOf(list,i)>=0;
      cannot find class which contains method IndexOf
      FFFUUUuuuu
      Ответить
    • 10.02
      return new int[5][5];
      2 кирпича. Наверное потому что без LINQ
      Ответить

    Добавить комментарий