1. Си / Говнокод #6905

    +105

    1. 1
    2. 2
    3. 3
    4. 4
    if ( (value[0] - 'N') == 0 || (value[0] - 'n') == 0 )
       val = 0;
    if ( (value[0] - 'Y') == 0 || (value[0] - 'y') == 0 )
       val = 1;

    нет, просто сравнить - это слишком скучно и неоригинально.

    ЗЫ от автора http://govnokod.ru/5034

    Запостил: Dummy00001, 09 Июня 2011

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

    • ага, тока лучше switch.
      Ответить
    • val = ( (value[0] - 'Y') == 0 || (value[0] - 'y') == 0 );
      Ответить
      • val = ( (value[0] & 'Y') || (value[0] & 'y') );
        Ответить
        • только вот true может не быть единицей
          Ответить
          • #define TRUE 0
            #defien FALSE 1
            // оно ?
            Другое, Char1 & Char2 могут давать на каком-то пересечении 1, ну и соответственно...

            //вариант
            val = ( !(c[0] - 'Y') || !(c[0] -'y') );
            Ответить
          • Это внутренне, физически 'true' может не быть единицей. Но нас это не интересует, ибо на уровне языка при конверсии 'true' в целочиселнный тип результат всегда - гарантированно единица.
            Ответить
            • согласен, промахнулся немного. почитал стандарт :)
              Ответить
    • if value[0] in ['N','n'] then val := 0
      else if value[0] in ['Y','y'] then val := 1;
      Ответить
      • Ну раз пошла такая пьянка...
        val = 1 if value[0] in 'Yy' else (0 if value[0] in 'Nn' else None)
        Ответить
        • val = {'N': 0, 'Y': 1}.get(value[0].upper(), val)
          Ответить
          • (lambda (x) (find x "yY"))
            Ответить
            • Или
              (lambda (x) (char-equal x #\y))

              или
              (defun test (x) (or (char= x #\y) (char= x #\Y)))

              Целиком:
              (do () ((y-or-n-p "Lisp rules?") t))
              Ответить
            • Это не тождественный код. Но мне нравится код вашей мысли.

              try:
                   val = ('N', 'Y').index(value[0].upper())
              except ValueError:
                   pass
              Ответить
              • Ок... есть 2 варианта тогда :)
                1. Очень просто, но выбрасывается не совсем то исключение, что нужно:
                (lambda (x) (ash (position x "nNyY") -1))


                2. И есть сложно (можно было наверное и проще, но раз уж не важно, как именно, то так имо нормально:
                (define-condition n/y-condition () ())
                (defgeneric integer-p (x call-what with-args))
                (defmethod integer-p ((x integer) call-what with-args)
                  (apply call-what (cons x with-args)))
                (defmethod integer-p (x call-what with-args)
                  (error (make-condition 'n/y-condition)))
                (defun y/n-p (x) (integer-p (position x "nNyY") 'ash '(-1)))

                Единственно, конечно описание ошибке можно было написать какое-то, но это уже кому нужно - тот напишет :)
                Ответить
                • Поддерживаю вариант 1 - красиво.
                  Настаиваю на применении в варианте 2 cond и char-equal:
                  (define-condition yn-condition() ())
                  (defun test-yn (x) (cond ((char-equal x #\y) t) ((char-equal x #\n) nil) (t (error (make-condition 'yn-condition)))))


                  Нет ничего лучше, чем невзначай начирикать пару строчек на лиспе в уикэнд.
                  Ответить
          • откуда это?
            Ответить
            • вот не знаю откуда тот код
              но очень напомнило груви, в котором можно писать таким же макаром
              Integer val=['N':1,'Y':2].get ("yy".toUpperCase().getChars()[0], null)

              >(lambda (x) (find x "yY"))
              this is incorrect. try again later.
              Ответить
            • Это тоже Питон.
              Ответить
    • Вот именно что оригинально!
      Ответить
    • Я чет не понял (value[0] - 'N' )зачем это??? если value[0] char то сравнить char можно просто

      if (value[0] =='N' || value[0] =='n' ) если отсутствует метод upper() или аналогичный.
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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