1. Objective C / Говнокод #14311

    −104

    1. 1
    return (loginLength * passwordLength) > 0 ? YES:NO;

    А вдруг?

    Запостил: Dmitriy, 03 Января 2014

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

    • loginLength * passwordLength

      Так по-моему только в совке пишут.
      Ответить
      • А как пишут в других странах?
        Ответить
        • loginLength >0 and passwordLength>0

          Это в экс совке программистов готовят математики. Получаем менее читаемый код + а что если будет какое-нибудь переполнение?
          Ответить
          • Мне кажется, что вполне очевидно, что длина строковой переменной не может быть таковой, чтоб происходило переполнение при перемножении двух чисел, результат которого может быть больше чем размерность int64. Так что, здесь все совершенно легально. Если какое-то из значений отсутствует, результат превращается в 0. Что тоже совершенно легально. Именно эта часть выполнена весьма изящна. Однако, остальное приводит к трем проверкам на истинность утверждения, хотя достаточно одной.
            Ответить
            • > вполне очевидно, что длина строковой переменной не может быть таковой, чтоб происходило переполнение при перемножении двух чисел
              Достаточно 46341 байта, и уже забагует. Или в objective c инты на всех платформах 64-битные? Само собой, что пароли и логины такими не бывают. Но нахрена юзать потенциально ненадежную конструкцию, если есть адекватная, простая и понятная замена: loginLength > 0 && passwordLength > 0.

              > Так что, здесь все совершенно легально.
              Что не отменяет того факта, что это говно, и что так писать не стоит :)

              > Именно эта часть выполнена весьма изящна.
              А после таких "изяществ" потом всякие mysql пускают юзеров с произвольным паролем с вероятностью 1/256...

              Чем проще и наглядней код - тем лучше. Здесь Анонимб прав.
              Ответить
      • Я как то пытлся проверить, а есть ли смысл заменять if/else арифметикой (где это возмжно) - поидее мы откажемя от джамповых комманд процессора и может это будет работать быстрее за счет того что в ходу будут только арифметические комманды и регитры.
        //примеры:
        //Было
        if(!p_node)
                 EmptyNodes++;
        //стало
        EmptyNodes+=(p_node==NULL);

        Блин - как же я разочаровался когда дизассемлировал этот второй вариант - все равно переход к инкрементирующей команде по состоянию взведен/не взведен флаг.
        Ответить
        • Попробуй через тернарник, кстати. Он часто компилится в код без переходов.

          А вообще не стоит выпендриваться... компиляторы и так генерят достойный код. А яем больше выпендрежа - тем хуже работает оптимизатор.
          Ответить
        • часто код с переходами быстрее чем без них. юзай профилировщик
          Ответить
          • О да, это тоже - я однажды гуглив вопросы на собеседование в одну компанию, рдин из вопросов расчитать номера счасливых билетов для 6 цифр и дан ответ на 6 вложенных циклов, я покуметал и заранее (чтоб без палева) набросал еще парочку на один цикл - и что вы думаете? Самый быстрий из них был в 2 раза медленнее данного, а при /O3 (minGW), в полтора, я так растроился :(
            Ответить
            • Еще раз медленно и задание в студию
              Ответить
              • Вы что на тролейбусе не ездите - каждого билета есть номер, счастливым считается тот билет у которого сумма первой половины цифр ровна сумме второй половины. Например номер билета ABCDEF, если A+B+C==D+E+F, билет счастливый :)
                Ответить
                • Надо все вывести или количество подсчитать?)

                  вот количество - зверский код
                  namespace ConsoleApplication17
                  {
                      class Program
                      {
                          private static void Main(string[] args)
                          {
                              var count = 10;
                              var gruopsCount = (count * 3) / 2-1;
                              var arr = new int[gruopsCount];
                  
                              for (int i = 0, k = 1; i < gruopsCount; i++, k += (i <= gruopsCount - count/2) ? 1 : -1)
                                  for (var j = 0; (j < count) && ((i + j) < gruopsCount); j++)
                                      arr[i+j] += k;
                  
                              Console.WriteLine(2 * arr.Sum(i => Math.Pow(i, 2)));
                              Console.ReadKey();
                          }
                      }
                  }
                  Ответить
                  • Мой глупый но простой вариант:
                    int count[28] = {0};
                    for (int i=0; i<10; i++)
                        for (int j=0; j<10; j++)
                            for (int k=0; k<10; k++)
                                count[i+j+k]++;
                    int sum = 0;
                    for (int i=0; i<28; i++) {
                        sum += count[i] * count[i];
                    }
                    std::cout << sum << std::endl;
                    Можно даже на листочке посчитать через суммы, если делать нечего.
                    Ответить
                    • у моего принцип тот же самый, подсчет количества сумм-групп быстрее. И непонятный до ужаса.
                      Ответить
                      • > Math.Pow(i, 2)
                        почему не i*i

                        > И непонятный
                        Подозреваю, объяснение тут
                        http://www.genfunc.ru/theory/lucky/
                        ?
                        Ответить
                        • После такого курса теории даже неудобно выкладывать свои работы:

                          //мой вариант - по умолчанию рантайм 0,032 сек, /O3 - 0.021
                          NSArray* onecirclelucky()
                          {
                          	NSMutableArray* ray = [NSMutableArray array];
                          	short int r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = -1;
                          	int h;
                          	for(h = 0; h!=1000000; h++)
                          	{
                          		r6++;
                          		//printf("%i\n", (int)r6);
                          		r5+=(r6==10);
                          		r4+=(r5==10);
                          		r3+=(r4==10);
                          		r2+=(r3==10);
                          		r1+=(r2==10);
                          		
                          		r6*=(r6!=10);
                          		r5*=(r5!=10);
                          		r4*=(r4!=10);
                          		r3*=(r3!=10);
                          		r2*=(r2!=10);
                          		if((r1+r2+r3)==(r4+r5+r6))
                          					[ray addObject:[NSNumber numberWithInt:h]];
                          		//	printf("%i %i%i%i%i%i%i\n",h, (int)r1,(int)r2,(int)r3,(int)r4,(int)r5,(int)r6);//*/
                          	}
                          	return ray;
                          }
                          //нагугленный - 0,016 по умолчанию, /O3 0,014 сек
                          NSArray* nineciclelucky()
                          {
                          	NSMutableArray* ray = [NSMutableArray array];
                          	int h = -1;
                          	short int r1, r2, r3, r4, r5, r6;
                          	for(r1=0;r1!=10;r1++)
                          	{
                          		for(r2=0;r2!=10;r2++)
                          		{
                          			for(r3=0;r3!=10;r3++)
                          			{
                          				for(r4=0;r4!=10;r4++)
                          				{
                          					for(r5=0;r5!=10;r5++)
                          					{				
                          						for(r6=0;r6!=10;r6++)
                          						{	
                          							h++;			
                          							//printf("%i%i%i%i%i%i %i\n", (int)r1, (int)r2, (int)r3, (int)r4, (int)r5, (int)r6, h);	
                          							if((r1+r2+r3)==(r4+r5+r6))
                          								[ray addObject:[NSNumber numberWithInt:h]];		
                          						}	
                          					}				
                          				}				
                          			}		
                          		}
                          	}
                          	return ray;
                          }
                          Ответить
                          • Мои ламерские функци-анальные эксперименты с решением кегдана-борманда:
                            Array.prototype.bind = function(f){ return [].concat.apply([], this.map(f)); };
                            var arr10 = Array(10).join('_').split('_').map(function(_,i){ return i; });
                            var sums = function(x){ return arr10.map(function(i){ return x + i; }); };
                            
                            var countSame = function(arr){
                              var processed = arr
                                .sort(function(a,b){ return a-b; })
                                .reduce(function(processed, x){
                                  var lastValue = processed[0], lastCount = processed[1], values = processed[2];
                                  return lastValue == x ? [lastValue, lastCount+1, values] : [x, 1, [lastCount].concat(values)];
                                }, [0,0,[]]);
                              return [processed[1]].concat(processed[2]);
                            };
                            
                            var count = countSame(arr10.bind(sums).bind(sums))
                              .map(function(x){ return x*x; })
                              .reduce(function(x,y){ return x+y; });
                            console.log(count);


                            import Data.List
                            arr10 = [0..9]
                            sums x = map (\i -> x + i) arr10
                            
                            countSame arr = lastCount : values where
                              (_, lastCount, values) = foldl countSame' (0,0,[]) arr'
                              countSame' (lastValue, lastCount, values) x =
                                if lastValue == x 
                                then (lastValue, lastCount+1, values)
                                else (x, 1, lastCount : values)
                              arr' = sort arr
                                  
                            count = sum . map (^2) . countSame $ arr10 >>= sums >>= sums
                            main = print count
                            Ответить
                        • > http://www.genfunc.ru/theory/lucky/
                          Парни, поясните, почему верна формула D(k, n):= Sum(j = 0..9, D(k-j, n-1)) из Метод динамического программирования?
                          Ответить
                          • Тут в формуле используется заведомо не возможный D(k, n), например D(k, n-1), например D(27, 2). Такого просто не может быть. То есть не возможно получить билет с суммой двух чисел, равной 27. Они считают невозможные D(n, k) равным 0? Тогда в сумме будет участвовать много D(n, k) равных 0, кроме первого и получится что D(k, n):= 0+0+...+0+D(k-9, n-1), что явно какой-то бред
                            Ответить
                            • На тот случай, если кому-то лень разбираться в моей нотации спрашиваю про эту формулу:
                              http://www.genfunc.ru/theory/lucky/img10.png
                              Ответить
                            • > будет участвовать много D(n, k) равных 0
                              >> 10 элементов, стоящих слева и сверху от него

                              Максимум 9 - не так уж и много.

                              > явно какой-то бред
                              В чём именно бред? Если у тебя есть способ лучше - велкам.
                              Ответить
                              • Это получается каждый раз D(k, n):= D(k-9, n-1)
                                Зачем остальные девять элементов, если они всегда нулевые? Или я что-то не понял?
                                Ответить
                                • много нулей только для относительно больших значений k, в остальных случаях используются все слагаемые
                                  Ответить
                                  • Да о чем ты говоришь?
                                    n - число знакомест числа
                                    k - сумма всех знакомест числа, для которой мы вычисляем D
                                    D - число комбинаций цифр с указанной суммой всех знакомест k
                                    Допустим n = 3 (XXX). То есть максимально возможная сумма 9+9+9
                                    Мы же выражаем D(..., n) через D(..., n-1). То есть максимально возможная сумма для n-1 и n=3 будет k = 9+9.
                                    То есть всегда для всех k>9+9 мы получим неопределенный D(..., n-1), а как ты говоришь доопределим, чтобы считать неопределенный D равным 0.
                                    Вот и получается странная картина:
                                    D(9+9+9, 3) = D(9+9, 2)
                                    Отсюда же D(9+9, 2) = D(9, 1)
                                    Так как куча нулевых членов.
                                    D(9+9+9, 3) = D(9, 1)
                                    Также же D(9+9+9+9, 4) = D(9+9+9, 3)
                                    Вообщем всё это явно тянет на бред.
                                    D(9+9+9+9, 4) = D(9, 1)
                                    Ответить
                                    • Ты вообще читаешь, что тебе пишут?

                                      > много нулей только для относительно больших значений k

                                      Естественно, максимальные суммы можно представить только одним способом, все остальные слагаемые зануляться. В общем случае формулу упростить нельзя.
                                      Ответить
                                      • А можешь привести пример, когда формула не упрощается до одного слагаемого?
                                        Ответить
                                        • Ты меня троллишь? Там даже в табличке серым и красным выделено:

                                          D(12,3) = D(12,2) + D(11,2) + ... + D(3,2)
                                          Ответить
                                          • На самом деле они над тобой все кафедрой ржут
                                            Ответить
                        • ну да, первый вариант. только я считаю не весь массив, а первую половину, так как он симетричен
                          Ответить
    • А как пишут в других странах?
      Ответить
      • как нибудь так, что бы было понятно, что не введено. Хотя контекст задачи неизвестен Yes No напрягают. Почему не bool? почему пароль должен быть всегда? хз
        Ответить
        • наверное потому, что это только часть метода?
          Ответить
          • Я бы даже больше сказал - это конец метода.

            Контекста нет - а без контекста - не интересно, такого сорта говна на говнокоде выше крыши.

            Классика
            Ответить
            • > а без контекста - не интересно
              Ну and через умножение тут вроде еще не выкладывали.
              Ответить
        • > почему пароль должен быть всегда
          Потому что пароль должен быть всегда. :)

          > Yes No напрягают
          > Почему не bool?
          Потому что Objective C. :)
          Ответить
          • И там вместо true-false yes-no? Совсем яблочники охренели

            Про пароль - существуют системы, которые допускают пустой пароль. Какие нибудь игры локальные. Контекст то не известен опять же.
            Ответить
            • > И там вместо true-false yes-no? Совсем яблочники охренели
              На полном серьезе ;) Из официальной доки на developer.apple.com:
              The BOOL scalar type is defined in Objective-C to hold a Boolean value, which is either YES or NO. As you might expect, YES is logically equivalent to true and 1, while NO is equivalent to false and 0.

              > существуют системы, которые допускают пустой пароль
              Но т.к. систем, позволяющих задать пустой пароль, не так много, по сравнению с системами, которые вообще не требуют пароль, или же требуют, чтобы он был не пуст, то, при отсутствии контекста, мы можем считать, что пароль должен быть не пуст ;)
              Ответить
              • Конечно можем, но я предпочитаю полет фантазии)

                Правильно сказал кто-то, что для того что бы кодить на обжси нужно пожертвовать собой - стать пидорасом)
                Ответить
                • > нужно пожертвовать собой
                  Да. Я бы не смог писать stringByReplacingOccurrencesOfStringWith String. Я надеюсь в этом вашем x-code хотя бы автодополнение вменяемое? :)
                  Ответить
                  • x-code ?
                    Ответить
                    • https://developer.apple.com/xcode/
                      Ответить
                      • >>Я надеюсь в этом вашем x-code

                        Не, я VS и RubyMine юзаю. До яблок еще не упал
                        Ответить
                        • Ладно, раз уж мы тут в яблочном треде, то спрошу о наболевшем...

                          Правда ли
                          - что все тулзы для разработки под яОсь доступны только под маком;
                          - что надо иметь дорогущую лицензию разраба (или джейлбрейк), чтобы закинуть свой собственный код на свою яПодкладку.
                          Ответить
                          • Раз вопрос адресован мне попробую порассуждать о том, чего не знаю (как это делает большинство)

                            1 мне это кажется вполне логично. яблочники же илита. Сам подумай, будет ли пан Яблонкий писать на б-гмерской винде приложения для наливного?

                            2 лпп. имхо это было бы очень глупо.
                            Ответить
                            • > Раз вопрос адресован мне
                              Вопрос адресован всем желающим на него ответить ;) Мне просто лень гуглить.

                              > яблочники же илита
                              Уря, я илитарен! Обычная железка этот яПодкладка, ничего элитного в ней не вижу. Посёрфить в инете, книжку на ночь почитать, да немного поиграться, что им больше делать то... Был бы выбор - взял бы что-нибудь на ведре. Но дарёному коню, как говорится, в зубы не смотрят.

                              > лпп. это было бы очень глупо
                              Зря ты так думаешь. С них вполне станется. Обычный же софт ставится только с аппстора. Это же не ведро, на которое можно apk с флешки закинуть.

                              P.S. Не виноватый я! Он сам пришел.
                              До последнего не верил, что в сисадминско-программистских викторинах можно что-то выиграть, участвовал just for fun... Теперь вот третий месяц как яблочник :(
                              Ответить
                              • > Обычная железка этот айпад, ничего элитного в ней не вижу.

                                ну так я же не про адекватных людей говорю. айфон уже стал мемом - он популярнее всех остальных смартфонов вместе взятых. А продаются они на пафосе и понтах.

                                p.s книжки лучше на кинделе читать
                                Ответить
                                • > книжки лучше на кинделе читать
                                  Да у меня дигма была, тоже с электронными чернилами. Так то она даже получше киндла - экран больше, fb2 и кучу других форматов понимает. Ну разве что нету (бесполезных?) wifi и сенсорного экрана.

                                  Дал родителям погонять на пару дней, им понравилось, пришлось научить пользоваться флибустой и оставить насовсем. Чего людей расстраивать ;)

                                  На айпаде, если подсветку приглушить, тоже вполне сносно.
                                  Ответить
                                  • ну дигма тоже дигме рознь. как и киндл кинделу. У меня paperwhite 6 dpi212 с подсветкой и сенсой - сравнивал с сонькой, которая без чехла стоит также, как мой и чехлом и доставкой - у моего экран баче, а фичи типа плейера и браузера меня не интересуют
                                    Ответить
                                    • > сенсой
                                      Сенса, имхо, книжке нахер не нужна. Без нее экран чище будет, т.к. пальцами не лапают ;) А польза от нее разве что в браузере.
                                      Ответить
                                      • заметки делать удобно, в словарь переходить (я не гуру английского), листать из любого положения, а руки и помыть можно. но вообще да - сенса это приятное дополнение. в основном из-за экрана брал - посл нее в остальных ебуках кажется. что написано черным на черном)
                                        Ответить
                                      • >Сенса, имхо, книжке нахер не нужна.
                                        Владелец K3 врывается в тред. Ни на одной новой книжке нет таких кнопок перелистывания, как на K3. Везде тач. Алсо, на сони prst1 он был жутко неудобный.
                                        Ответить
                                      • > Сенса, имхо, книжке нахер не нужна
                                        Удобно пользоваться словарём. В киндловой прошивке отличный толковый словарь, в английском уж больно слов много...
                                        Ответить
                                  • с знакомым времено менялись девайсами - он мне ведроид -plants and zombies 2 поиграть, а я ему свой киндл. В итоге он решил заказать себе такую же)
                                    Ответить
                                    • > В итоге он решил заказать себе такую же)
                                      Ну киндлы удобные и недорогие. Тут не поспоришь.
                                      Ответить
                                      • правда читают в основном awz и pdf. это основной минус
                                        Ответить
                                        • > это основной минус
                                          Ну калиброй можно сконвертить, да и ладно.
                                          Ответить
                                          • gjvu хреново конвертятся в pdf - либо качество - кода не видно, либо вес нехилый. Особенно если pdf - учебник на 1500 страниц
                                            Ответить
                                            • > djvu
                                              99.99% дежавюх это сканы. А сканы на маленьких экранах читать жопа ;( Приходится скроллить туда-сюда. Так что что с конвертацией, что без, один фиг не айс ;)
                                              Ответить
                                              • у меня все четко расчитанно - в альбомном положении страница по горизонтали входит четко, по вертикали - 3 экрана, все видно, все красиво)
                                                Ответить
                                    • Мне бы таких знакомых.
                                      Ответить
                              • софт вообще неинтуитивный

                                Час искал, как забиндить кредитку к яМелодии. Куда в него заливать фоточки тоже фиг поймёшь. Похоже, всё только через ту же яМелодию.
                                Ответить
                                • > софт вообще неинтуитивный
                                  А почему именно айпад приобрел, если не секрет?

                                  > Похоже, всё только через ту же яМелодию.
                                  Угу. Которой нет под линух.

                                  Я пробовал вот такой вариант еще - поставить DLNA сервак на комп и DLNA клиент на яПодкладку. Музыка, видео и фоточки будут доступны только этому клиенту, но лучше чем ничего ;)
                                  Ответить
                                  • P.S. Сейчас юзаю minidlna (на линухе) + mediaconnect (на планшетке). Вполне юзабельно, клиент может выкачивать файлы на планшетку, чтобы в оффлайне юзать.

                                    Плюс в медиаконнекте есть сервер, через который всю эту медию можно всяким телекам раздавать (не тестил).
                                    Ответить
                                  • > почему именно айпад приобрел, если не секрет?

                                    Супруга выпросила. Мне такая хреновина даром не нужна. Я без полноценной клавиатуры жить не могу. На работе выдали ноут с отличным железом. Читаю я с kindle paperwhite + duokan.
                                    Ответить
                                    • > даром не нужна
                                      Ну вот мне фактически даром достался... а выбрасывать или отдавать всё-равно как-то жалко :)

                                      Довольно удобно тот же ГК листать, если не хочется включать гроб. Или статейки какие-нибудь раскуривать лежа на диване. Или включить для фонового шума что-нибудь с ютуба или DLNA...

                                      Короче задаром - применения найдутся ;) А если покупать бы что-то стал, так какой-нибудь нормальный андроидный планшет с усб хостом. Там и клаву нормальную зацепить можно. И проги бесплатней чем под iOS. И самому что-нибудь написать под него можно, тот же govnotify меня до сих пор радует :)

                                      > Я без полноценной клавиатуры жить не могу.
                                      Ну собственно поэтому у меня до сих пор нет ноута. Я ж не емаксер, чтобы вместо стрелок и home/end/pgup/pgdn выстукивать аккорды на основной клаве.
                                      Ответить
                                      • > Я ж не емаксер
                                        так в чём проблема...
                                        Ответить
                                      • > проги бесплатней чем под iOS
                                        спорно, очень

                                        на аппсторе регулярно раздача слонов дни, когда платные приложения временно становятся бесплатными

                                        есть даже приложение, которое отслеживает ежедневно, что сегодня стало бесплатным

                                        вот для андроида как-то такого не нашёл
                                        Ответить
                                        • > есть даже приложение, которое отслеживает ежедневно, что сегодня стало бесплатным
                                          А в том же стиме это вообще встроенная фишка.

                                          > спорно, очень
                                          Ну ок, я же совсем неопытный яблочник, многого не знаю ;)
                                          Ответить
                                          • да чтобы эппл это само встроило - за кого ты их принимаешь? они с каждой продажи забирают здоровый процент себе (30 вроде) - какой им стимул оповещать кого-либо, что сегодня вот это вот приложение стало бесплатным, это же эппл
                                            Ответить
                                            • > они с каждой продажи забирают здоровый процент себе
                                              Ага. А еще они замутили WebGL в iOS и никому его не дают.

                                              Что-то мне намекает, что флеш и вебгл они закопали неспроста, и совсем не из-за потенциальных дыр...
                                              Ответить

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