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

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    switch (true)
    {
    
    }

    Запостил: pillar_hunter, 11 Апреля 2019

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

    • Оператор постижения дзена.
      Ответить
      • Дзенский мастер Питушня.
        Ответить
        • Кстати, кто добавил?

          https://lurkmore.to/копипаста:python#.D0.92.D0.BE.D1.80.D0.B 5.D1.86.D0.B8.D0.B8

          https://www.linux.org.ru/forum/development/13055845?cid=13061694

          http://holywars.ru/comments/16696#comment_940742
          Ответить
    • Баян. ЕМНИП, в сисярпке значения case не должен быть константный, потому, можно было делать типа:
      switch (true) {
      case expr1(): /* ... */; break;
      case expr2(): /* ... */; break;
      }

      Выполнится первое, где exprN() == true
      Ответить
    • Нахуй этот вербозный switch/case вместо else if.
      Ответить
      • https://ideone.com/pb20N6

        <?php
         
        function skill($val) {
            $val = trim($val);
            $last = strtolower($val[strlen($val)-1]);
            $val = (int)$val;
            switch($last) {
                case 'g':
                    $val *= 1024;
                case 'm':
                    $val *= 1024;
                case 'k':
                    $val *= 1024;
            }
            return $val;
        }
         
        var_dump([skill("1M"), skill("2G")]);
        Ответить
        • function skill($val) {
              $val = trim($val);
              $last = strtolower($val[strlen($val)-1]);
              $a = array(
                  'k' => 1024,
                  'm' => 1024*1024,
                  'g' => 1024*1024*1024
              );
              return (int)$val * $a[$last];
          }
          Ответить
          • skill("5");


            Какой анскилл )))
            Ответить
          • Перевёл на «Python»:
            from collections import defaultdict
            import itertools
            def skill(val):
                 val = val.strip()
                 val, last = int(val[:-1]), val[-1].lower()
                 return val * 1024**defaultdict(lambda: 0, zip(['k', 'm', 'g'], itertools.count(1)))[last.lower()]
            
            
            >>> skill('1M'), skill('2G'), skill('3k')
            (1048576, 2147483648, 3072)
            Ответить
            • Добавил поддержку чисел без постфикса:
              from collections import defaultdict
              import itertools
              def skill(val):
                   val = val.strip()
                   val, last = int(''.join(filter(lambda c: c.isdigit(), val))), val[-1].lower()
                   return val * 1024**defaultdict(lambda: 0, zip(['k', 'm', 'g'], itertools.count(1)))[last.lower()]
              Ответить
            • показать все, что скрытоvanished
              Ответить
              • Какой анскилл )))
                Ответить
              • Попробуем разобрать.
                int(val[:-1]) —– число, выделенное изо всех символов строки, кроме последнего.

                val[-1].lower() –— последний символ строки, приведённый к нижнему регистру.

                zip(['k', 'm', 'g'], itertools.count(1)) → [('k', 1), ('m', 2), ('g', 3)]

                defaultdict создаёт словарь. Значение по умолчанию задаётся лямбдой (в данном случае ноль).

                defaultdict(lambda: 0, zip(['k', 'm', 'g'], itertools.count(1)))[last.lower()] вернёт 1, если последний символ строки, приведённый к нижнему регистру, равен 'k'; двойку, если он равен 'm'; тройку, если он равен 'g'.
                Ответить
                • https://www.youtube.com/watch?v=Qk10kFRWrS4
                  Только я последний символ лишний раз к нижнему регистру привожу, не надо так.
                  Ответить
        • $val *= pow(1024, 1 + array_flip(['k', 'm', 'g'])[$last]);


          P.S. Ой! Я не дочитал ветку до конца. Какой анскилл )))
          Ответить
        • В «gcc» можно использовать computed goto.
          Ответить
        • Поехали нахуй:
          c;main(a){scanf("%d%c",&a,&c);c|=32;printf("%lld",a*=1ll<<10*((c=='g')*3+(c=='m')*2+(c=='k')));}
          Ответить
          • P.S. input гарантированно ^\d+[gGmMkK]?$
            Ответить
            • Принято:
              c;main(a){scanf("%d%c",&a,&c);printf("%lld",a*1ull<<10*((c&7)/2));}


              UPD: упс, опять «?» в регулярке не заметил.
              Ответить
              • там нолик в "c" будет, если нет ничего
                я не смог такую красивую формулу придумать
                какой анскилл )))
                Ответить
                • Именно поэтому я за «консоль»: при вводе из терминала в c будет «\n».
                  Ответить
                  • А я в ideone проверяю. И твой премер ниже там не работает.
                    Хотел 10/2=5 сократить
                    Ответить
                    • Да, пример ниже — ждля терминалов.

                      https://ideone.com/4pkQxK — без символа перевода строки в конце числа;
                      https://ideone.com/w3tZbH — с символом перевода строки в конце числа.
                      Ответить
          • c;main(a){scanf("%d%c",&a,&c);c&=~32;printf("%lld",a*=1ll<<10*((c==71)*3+(c>76)*2+(c==75)));}
            Ответить
            • Исправил косячок-с.
              c;main(a){scanf("%d%c",&a,&c);printf("%lld",a*1ull<<10*(((c-9)&7)/2));}
              Ответить

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