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

    +131

    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
    double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
                double[] numbers2 = { 2.2 };
    
                IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2);
    
                foreach (double number in onlyInFirstSet)
                    Console.WriteLine(number);
    
                /*
                 This code produces the following output:
    
                 2
                 2.1
                 2.3
                 2.4
                 2.5
                */

    Привет с msdn
    http://msdn.microsoft.com/en-us/library/bb300779%28v=vs.110%29.aspx

    Запостил: LispGovno, 27 Ноября 2014

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

    • Set из даблов! Ещё и тормозной.

      У них ещё и Enumerable.Distinct есть. Вернет только дублированные переменные, убрав их копии. Не требует сортировки исходной коллекции.
      Ответить
      • Массив из даблов, если быть точным, Set это в жабе, на сколько я помню. 00:00:00.0007206 при компиляции в Release, что тут тормозного то?
        Ответить

        • >>на сколько я помню. 00:00:00.0007206

          L:)))))))))))))))))
          Ответить
          • God of Benchmarks.
            Ответить
            • (по секрету) на одном собеседовании в одну известную компанию меня спросили сколько паттернов в книге Gang of four
              Ответить
              • > сколько паттернов в книге Gang of four
                И ответ "да хуй его знает, я их не считал" их устроил? (Ну не верю я, что кто-то помнит, сколько их там).
                Ответить
                • Охотно верю, что какой-нибудь китаец по имени Хуй точно знает их количество.
                  Ответить
                • Я посчитал в уме, сказал что порядка 20 могу вспомнить.
                  Собеседник сказал что их на самом деле 28 вроде (там еще MVC сокрыт, его в каталоге нет, но он упоминается)
                  Ответить
                  • Вики говорит, что 23.
                    Ответить
                    • Ну вот, я не запомнил точный ответ)
                      Следующий раз буду лучше готовиться
                      Ответить
                      • > Следующий раз буду лучше готовиться

                        Yу что посоны? Задачку чтоли из гугла вам простейшую задать? Есть массив целых чисел. Есть искомое число. Найти любую пару чисел из этого массива, сумма которых равна искомому числу.
                        Вариант ответа с производительностью О(n^2) даже не предлагать.
                        Ответить
                        • Ответ покажешь на языке Си.
                          Ответить
                        • Баянистая задача.

                          У неё много решений. От O(log n * n) времени и O(1) памяти до O(n) времени и O(n) памяти. Мне её как-то задавали на собеседовании и я додумался до O(n) + O(n).

                          Есть более интересный вариант: 3 числа в массиве, сумма которых ближе всего к некому числу X.
                          Ответить
                          • Да она же тривиальна.
                            Вопрос в том как решить её в языке где в стандартной библиотеке нету мапов и множеств.
                            Ответить
                            • Для O(log n * n) вроде бы достаточно джвоичного поиска да сортировки.
                              Ответить
                              • Двоичный поиск даже не нужен. Если массив отсортирован, можно решить за линейное время и О(1) памяти.
                                Ответить
                                • > линейное время и О(1) памяти
                                  А ну да, дошло - что-то типа слияния.

                                  P.S. А O(n)+O(n) амортизированные или нормальные?
                                  Ответить
                                  • Амортизированное, конечно. хеш-табличка в общем.
                                    Ответить
                                    • > Амортизированное, конечно.
                                      Банально как-то, я думал, что там есть красивое решение...

                                      А мне вот такая задачка понравилась: есть указатель на начало связного списка, нужно определить не закольцован ли он (кольцо может начаться и где-нибудь в середине списка). Нужно решение не хуже O(n) по времени + O(1) по памяти.
                                      Ответить
                                      • Это тоже очень баянистая классика.
                                        Проверить наличие кольца легко, интереснее отыскать точку начала цикла с такими же ограничениями.

                                        Всё это неплохо описано у Степанова в первых главах Elements of Programming для произвольных преобразований вида x = f(x).
                                        Ответить
                                        • > Elements of Programming
                                          Хм, скачал, почитаю. Спасибо!

                                          > алгоритм госпера?
                                          Скорее флойда, раз хотели константную память.
                                          Ответить
                                          • Если интересно, вот тут обычно довольно много занятных задачек без смс и регистрации:
                                            http://www.geeksforgeeks.org/

                                            На днях вот эту решал, доставила, хоть и простая:
                                            http://stackoverflow.com/questions/9648661
                                            Ответить
                                            • > 2. Implement queue without using any data structure
                                              O_o
                                              Ответить
                                              • может быть речь о структурах доступных в стандартной библиотеке?

                                                Ку сама по себе структура жезж
                                                Ответить
                                                • > может быть речь о структурах доступных в стандартной библиотеке
                                                  Ну да, логично.
                                                  Ответить
                                                  • А почему нет? Функций достаточно. Если почитать SICP то там описание данных и дается в таком виде, т.е. определяется функция cons, за ней car / cdr ну и дальше из этого уже можно все строить.
                                                    Ответить
                                                  • Единственное, это конечно, по-хорошему стек, но можно назвать и LIFO Queue :) В задаче же не сказано. Кью просто дольше писать.
                                                    function cons(head, tail) {
                                                        return function (v) {
                                                            return v ? head : tail;
                                                        };
                                                    }
                                                    
                                                    function car(cell) { return cell(true); }
                                                    
                                                    function cdr(cell) { return cell(false); }
                                                    
                                                    function enqueue(item, queue) {
                                                        return cons(item, queue);
                                                    }
                                                    
                                                    function dequeue(queue) { return cdr(queue); }
                                                    
                                                    function peek(queue) { return car(queue); }
                                                    
                                                    function test() {
                                                        var queue, i;
                                                        for (i = 0; i < 10; i++) 
                                                            queue = enqueue(i, queue);
                                                        for (i = 0; i < 10; i++) {
                                                            console.log("queued: " + peek(queue));
                                                            queue = dequeue(queue);
                                                        }
                                                    }
                                                    
                                                    // queued: 9
                                                    // queued: 8
                                                    // queued: 7
                                                    // queued: 6
                                                    // queued: 5
                                                    // queued: 4
                                                    // queued: 3
                                                    // queued: 2
                                                    // queued: 1
                                                    // queued: 0
                                                    Ответить
                                                    • Дополнение до очереди FIFO:
                                                      var nil = {};
                                                      
                                                      function dequeue(queue) {
                                                        return cdr(queue) === nil ?
                                                          nil :
                                                          cons(car(queue), dequeue(cdr(queue)));
                                                      }
                                                      
                                                      function peek(queue) {
                                                        return cdr(queue) === nil ? car(queue) : peek(cdr(queue));
                                                      }
                                                      
                                                      function test() {
                                                          var queue = nil, i;
                                                          for (i = 0; i < 10; i++) 
                                                              queue = enqueue(i, queue);
                                                          for (i = 0; i < 10; i++) {
                                                              console.log("queued: " + peek(queue));
                                                              queue = dequeue(queue);
                                                          }
                                                      }
                                                      Ответить
                                                      • Очередь с O(n) в dequeue()/peek()?! No way.
                                                        Ответить
                                                      • Как-то так это делается (через джва стека):
                                                        function empty() {
                                                            return cons(null, null);
                                                        }
                                                        
                                                        function enqueue(item, queue) {
                                                            return cons(cons(item, car(queue)), cdr(queue));
                                                        }
                                                        
                                                        function dequeue(queue) {
                                                            var rq = cdr(queue);
                                                            var wq = car(queue);
                                                            if (!rq) {
                                                                while (wq) {
                                                                    rq = cons(car(wq), rq);
                                                                    wq = cdr(wq);
                                                                }
                                                            }
                                                            if (!rq)
                                                                return cons(null, empty());
                                                            return cons(car(rq), cons(wq, cdr(rq)));
                                                        }
                                                        http://ideone.com/T3VGwH
                                                        Ответить
                                                        • > cons(cons(item, car(queue)), cdr(queue))
                                                          по-моему, всё опять линейно (надеюсь, что ошибаюсь), только из-за while стэку чуть легче
                                                          q0 = empty() = cons(null, null) =
                                                             q0
                                                            / \
                                                          {0} {0}
                                                          
                                                          q1 = enqueue(e1, q0) =
                                                          cons(cons(e1, car(q0)), cdr(q0)) =
                                                          cons(cons(e1, null), null) =
                                                               q1
                                                              /  \
                                                             *   {0}
                                                            / \
                                                          e1  {0}
                                                          
                                                          q2 = enqueue(e2, q1) =
                                                          cons(cons(e2, car(q1)), cdr(q1)) =
                                                               q2
                                                              /  \
                                                             *   {0}
                                                            / \
                                                           e2  *
                                                              / \
                                                            e1  {0}
                                                          
                                                          q3 = enqueue(e3, q2) =
                                                          cons(cons(e3, car(q2)), cdr(q2)) =
                                                               q3
                                                              /  \
                                                             *   {0}
                                                            / \
                                                           e3  *
                                                              / \
                                                             e2  *
                                                                / \
                                                              e1  {0}
                                                          Ответить
                                                          • > по-моему, всё опять линейно
                                                            Тут амортизированное O(n).

                                                            Записи набиваются в один стек, а вынимаются из другого. Когда правый стек пуст - все записи из левого перебрасываются в него. В итоге на n пропущенных через очередь записей имеем 2*n вставок в стек и 2*n вытаскиваний из него (но некоторые dequeue работают дольше, чем остальные).
                                                            Ответить
                                                            • Как всё продумано... А я думать совсем разучился (или не умел?) плюс ни черта не знаю и обучаться мне лень. Меня ни в школу не возьмут (разве что в первый класс, чтоб всё сначала изучать), ни в охранники (кроссворды не привык разгадывать).
                                                              Ответить
                                                              • Да ладно, можно просто книженцию по персистентным структурам данных почитать, там своя теория. Purely Functional Data Structures Окасаки - классика.
                                                                Ответить
                                                            • > Тут амортизированное O(n).
                                                              амортизированное О(1) ты хотел сказать? Тред не читал и может вы не об этом
                                                              Ответить
                                                              • > амортизированное О(1) ты хотел сказать?
                                                                Да, конечно. Опечатался я.
                                                                Ответить
                                                                • так n вставок в хеш с амортизированным O(1), так и получается амортизированное O(n)
                                                                  Ответить
                                                                  • > n вставок в хеш с амортизированным O(1)
                                                                    Эээ, какой хеш? Там вроде бы речь шла о очереди через джва стека.
                                                                    Ответить
                                                          • Вау, не знал что все C# программисты на самом деле думают на LISP, но говорят на жаргонном C++
                                                            Ответить
                                                            • Раз уж речь зашла о Лиспе:
                                                              (defstruct queue head tail)
                                                              
                                                              (defmethod enqueue ((this queue) item)
                                                                (if (queue-tail this)
                                                                    (setf (cdr (queue-tail this)) (list item)
                                                                          (queue-tail this) (cdr (queue-tail this)))
                                                                    (setf (queue-tail this) (list item)
                                                                          (queue-head this) (queue-tail this))))
                                                              
                                                              (defmethod dequeue ((this queue))
                                                                (prog1 (car (queue-head this))
                                                                  (setf (queue-head this) (cdr (queue-head this)))))
                                                              
                                                              (defun test-queue ()
                                                                (loop :with test := (make-queue)
                                                                   :for i :below 10 :do
                                                                   (enqueue test i)
                                                                   :finally (loop :for i :below 10 :do
                                                                               (format t "~&dequeue: ~s" (dequeue test)))))
                                                                   
                                                              (test-queue)
                                                              
                                                              ;; dequeue: 0
                                                              ;; dequeue: 1
                                                              ;; dequeue: 2
                                                              ;; dequeue: 3
                                                              ;; dequeue: 4
                                                              ;; dequeue: 5
                                                              ;; dequeue: 6
                                                              ;; dequeue: 7
                                                              ;; dequeue: 8
                                                              ;; dequeue: 9
                                                              Ответить
                                                        • queue_put(Item, queue([Item | Queue])) :- !.
                                                          queue_put(Item, queue([_ | Queue])) :- queue_put(Item, queue(Queue)).
                                                          
                                                          queue_pop(void, queue([]), _).
                                                          queue_pop(Item, queue([Item | Queue]), queue(Queue)).
                                                          
                                                          test_queue_rec(N, Queue) :-
                                                              ( N >= 0 -> 
                                                                ( N1 is N - 1, queue_put(N, Queue),
                                                                  test_queue_rec(N1, Queue) )
                                                              ;
                                                                true ).
                                                          ?- test_queue_rec(5, X), queue_pop(Y, X, Z), queue_put(42, Z).
                                                          X = queue([5, 4, 3, 2, 1, 0, 42|_G427]),
                                                          Y = 5,
                                                          Z = queue([4, 3, 2, 1, 0, 42|_G427]).

                                                          О :)

                                                          Ох, не, не так... но близко. Нужно числа в качестве ключей использовать. Но переписывать влом. Так будет работать только если в кью складывать разные элементы.
                                                          Ответить
                                                          • queue_put(Item, queue([(N, Item) | _]), N) :- !.
                                                            queue_put(Item, queue([(_, _) | Queue]), N) :-
                                                                N1 is N + 1,
                                                                queue_put(Item, queue(Queue), N1).
                                                            
                                                            queue_put(Item, Queue) :- queue_put(Item, Queue, 0).
                                                            
                                                            queue_pop(void, queue([]), _).
                                                            queue_pop(Item, queue([(_, Item) | Queue]), queue(Queue)).
                                                            
                                                            test_queue_rec(N, Queue) :-
                                                                ( N >= 0 -> 
                                                                  ( N1 is N - 1, queue_put(N, Queue),
                                                                    test_queue_rec(N1, Queue) )
                                                                ;
                                                                  true ).
                                                            
                                                            ?- test_queue_rec(5, X), queue_pop(Y, X, Z), queue_put(4, Z).
                                                            X = queue([ (0, 5), (1, 4), (2, 3), (3, 2), (4, 1), (5, 0), (5, 4)|_G445]),
                                                            Y = 5,
                                                            Z = queue([ (1, 4), (2, 3), (3, 2), (4, 1), (5, 0), (5, 4)|_G445]).

                                                            Не, все-таки сделал.
                                                            Ответить
                                                            • Ох, я ступил, все было намного проще...

                                                              enqueue(X, Qh : [X | Qt], Qh : Qt).
                                                              dequeue(X, [X | Qh] : Qt, Qh : Qt).
                                                              
                                                              populate_queue(N, Queue) :-
                                                                  ( N >= 0 ->
                                                                    ( enqueue(N, Queue, Queue1),
                                                                      N1 is N - 1,
                                                                      populate_queue(N1, Queue1) )
                                                                  ;
                                                                    true ).
                                                              
                                                              print_queue(N, Queue) :-
                                                                  ( N >= 0 ->
                                                                    ( dequeue(X, Queue, Queue1),
                                                                      print(X), print(', '),
                                                                      N1 is N - 1,
                                                                      print_queue(N1, Queue1) )
                                                                  ;
                                                                    true ).
                                                              
                                                              % ?- populate_queue(5, X), X = Y : Y, print_queue(5, X).
                                                              % 5, 4, 3, 2, 1, 0,
                                                              Ответить
                                                          • Пролололог?
                                                            Ответить
                                                            • Не просто Пролог, а частично инстанциированые данные. Это примерно как распечатать Хаскелевский бесконечный список.
                                                              Ответить
                                              • > 2. Implement queue without using any data structure
                                                Я именно так решал эту задачу в codehurt, поскольку стандартные жаба-структуры там залочили.
                                                Ответить
                                              • >Given a set S, find all the subsets whose sum = k
                                                Решил битовыми наборами (хорошо что в codehurt массивы короче 32). Только там надо индексы вместо значений
                                                int[][] solve(int[] n,int x){ //х - искомая сумма. n - исходный массив
                                                 L=n.length;
                                                		int p=1<<L;
                                                		int rCnt=0;
                                                		byte[] r=new byte[p];//подходящие битовые маски
                                                		for (int i=0;i<p;++i){
                                                			int sum=0;byte bits=0;
                                                			for (int j=0;j<L;++j){
                                                				if (0!=((1<<j)&i) ){
                                                					sum+=n[j];
                                                					++bits;
                                                				}
                                                			}
                                                			if (x==sum ){ //&& bits==2
                                                				r[i]=bits;
                                                				++rCnt;				
                                                			}
                                                		}
                                                //собственно генерация массива массивов с ответом
                                                		int rIndx=0, mask=0;
                                                		int[][] rx =new int[rCnt][];
                                                		for (byte b:r){
                                                			if (b!=0){
                                                				int[] inner=new int[b];
                                                				int innerIndx=0;
                                                				for (int j=0;j<L;++j)
                                                					if (0!=((1<<j)&mask))
                                                						inner[innerIndx++]=j;
                                                				rx[rIndx++]=inner;
                                                			}
                                                			++mask;
                                                		}
                                                        return rx;
                                                }
                                                Ответить
                                        • > Elements of Programming
                                          So, I started to read this book. It feels like a Functional Analysis lecture... My mind is cracking and blowing...

                                          But it's a nice book and I'm enjoying the reading. Thank you!
                                          Ответить
                                          • Англосаксон. Руску мову юзай!
                                            Ответить
                                            • > Руску
                                              > мову
                                              > юзай!
                                              I'm lol'd. What language do you speak? It's definitely not russian...

                                              So, I'll continue to fuck your brain with my poor spelling skills. It's a very funny experience.
                                              Ответить
                                      • Ответить
                          • > 3 числа в массиве, сумма которых ближе всего к некому числу X
                            O(n^2) по времени и O(n) по памяти сойдет за ответ?
                            Ответить
                • Какой самый известный паттерн? Сколько паттернов? Это знать надо, если ты программист. Это классика! Сейчас все наши программисты ориентируются на Банду Четырёх.
                  Ответить
                • Это, наверное, маркерный тест.

                  Есть такой анекдот:
                  Нужно на собеседовании попросить программиста решить задачу с помощью sed. Если справится - ни за что не брать! Он, блин, всё будет этим sed делать!

                  sed -i -e 's/sed/шаблоны проектирования/g'
                  Ответить
                  • На самом деле они спрашивали на полном серьезе. Впринципе я тоже считаю что хотяб штук пять паттернов ООП программисту следует уметь назвать и определить) Во всяком случае если речь о джаве/c#/C++ в мире энтерпрайза
                    Ответить
    • Ничо себе. Топик кто-то минусует и думает, что сравнивать даблы на равенство это нормально.
      Я вообще не представляю как в msdn добавили такой не адекватный пример.
      Или думает использовать эксепт с О(n*m) вместо амортизированного О(m).
      Я вообще не представляю как в C# добавили такую тормозную штуку с такой алгоритмической сложностью.
      Ответить

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