1. Python / Говнокод #26778

    0

    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
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    # https://www.opennet.ru/opennews/art.shtml?num=53248
    # Гвидо ван Россум предложил включить в Python операторы для сопоставления с образцом 
    
    # Отмечается, что предложенные операторы позволят улучшить читаемость кода,
    # упростят сопоставление произвольных Python-объектов и отладку, а также повысят
    # надёжность кода благодаря возможности расширенной статической проверки типов. 
    
    def http_error(status):
        match status:
            case 400:
                return "Bad request"
            case 401|403|404:
                return "Not allowed"
            case 418:
                return "I'm a teapot"
            case _:
                return "Something else"
    
    
    # Например, возможна распаковка объектов, кортежей, списков и произвольных последовательностей
    # для привязки переменных на основе имеющихся значений. Допускается определение вложенных
    # шаблонов, использование в шаблоне дополнительных условий "if", применение масок ("[x, y, *rest]"),
    # маппинга связок ключ/значение (например, {"bandwidth": b, "latency": l} для извлечения значений
    # "bandwidth" и "latency" и словаря), извлечения подшаблонов (оператор ":="), использования именованных
    # констант в шаблоне. В классах возможна настройка поведения при сопоставлении при помощи метода "__match__()". 
    
       from dataclasses import dataclass
    
       @dataclass
       class Point:
           x: int
           y: int
    
       def whereis(point):
           match point:
               case Point(0, 0):
                   print("Origin")
               case Point(0, y):
                   print(f"Y={y}")
               case Point(x, 0):
                   print(f"X={x}")
               case Point():
                   print("Somewhere else")
               case _:
                   print("Not a point")
    
       match point:
           case Point(x, y) if x == y:
               print(f"Y=X at {x}")
           case Point(x, y):
               print(f"Not on the diagonal")
    
    
       RED, GREEN, BLUE = 0, 1, 2
       match color:
           case .RED:
               print("I see red!")
           case .GREEN:
               print("Grass is green")
           case .BLU
       E:
               print("I'm feeling the blues :(")

    Какой прогресс)))
    Ждем когда добавят цикл for как в сишке

    Запостил: j123123, 28 Июня 2020

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

    • Из комментариев:

      > Python этим то и хорош, что не тащить всякий мусор в виде дублирующих операторов!
      > Посмотрите что с С++ сотворили, чужие исходники читать трудновато.
      > Меньше операторов это главное что отличает современные языки вроде Go, Rust в результате читаемость чужих исходников резко повышается!

      Предлагаю Brainfuck: там всего 8 операторов '+', '-', '<', '>', '[', ']', '.', ','
      Ответить
    • Второй пример — это уже не как в сишке. Это уже похоже на функциональные языки.
      Ответить
    • Кочу фоллсру.
      Ответить
      • Есть идея: завернуть match в цикл, а внутри веток мудифицировать исходное выражение, чтобы на следующей итерации сработала другая ветка.

        Или такая идея: вызывать какую-нибудь функцию, которая будет реализовывать это фоллсру:
        def whereis(point):
               match point:
                   case Point(0, 0):
                       fallthrough(0)
                   case Point(0, y):
                       fallthrough(1)
                   case Point(x, 0):
                       fallthrough(2)
                   case Point():
                       fallthrough(3)
                   case _:
                       print("Not a point")
        def fallthrough(level):
            if (level < 1):
                print("Ku-ka-re-ku")
            if (level < 2):
                print("Kudkudah")
            if (level < 3):
                print("Kokokoko")
            if (level < 4):
                print("Kurlyk")
        Ответить
        • Фу, говно-то какое.

          Именно поэтому я за https://www.jsoftware.com/help/dictionary/csel.htm
          Ответить
      • лет зе баттхарт фоллсру
        Ответить
      • Надо чтоб гомоиконность, через которую чтоб компилтайм-библиотеки для фоллсру, регекспов, паттерн-матчинга и любого другого подобного говна запиливать. А не вот это вот намертво впиленное в сам язык говно
        Ответить
        • ГОМОИКОНА
          (((L I S P )( L I S P ) ( L I S P ) ( L I S P )))
          * (     \             \            )    \       *
          B(       )             \          )      )      B
          e(       `.             )         )       :     e
          a`        )             )        \)       )     a
          t \       ) )       )  \\\   --__ \\       :    t
          i  \      \)   _--~~          ~--__) \     )    i  
          n   \      \_-~                    ~-_\    )    n
          g    \_     \        _.--------.______\)   )    g
                \     \______(( _ ___ _ (_(__H  \   )      
          t      \   .  S ___)  ______ (_(____t  )  )     t
          h       (\ )   I ____)) APPLY\ (_____D  )_)     h
          e      ( (\)   C_____)  EVAL )  (___P   )  \    e
                (   (   _P_____)\______)  )) _) )     \    
          a     (    \  )__   \\_________)) (__)       )  a
          v    ( \    \____)   `----   --'             )  v
          e    (  \_          ___\       )_          _) ) e
          r   (              )    (     )  \            ) r
          a   (             )    (   λ   )  \           ) a
          g   (          ) )    (         )  \           )g
          e   (         ) )      (__)(___)    )          )e
          s  (           )        (    )       )         )s
          *  (          )         (    )       )         )*
          (((L I S P )( L I S P ) ( L I S P ) ( L I S P )))
          Ответить
    • Гвидо ван Россум предложил включить в Конституцию РФ операторы для сопоставления с образцом.
      Ответить
      • 1 июля состоится всеобщий референдум по принятию поправок в синтаксис Python.
        Ответить
        • И торжественное обнуление версии питона.
          Ответить
          • обнуление eax
            Ответить
            • Давайте перечислим способы обнуления eax. Тривиальные mov eax, 0 и xor eax, eax не предлагать.
              Ответить
              • lea eax, [0] и sub eax, eax тоже тривиальные и не предлагать?

                push dword 0
                pop eax

                zero dd 0
                ...
                mov eax, [zero]
                Ответить
              • imul eax, eax, 0
                Ответить
              • zero db 48, 0
                ...
                push offset zero
                call _atoi
                Ответить
              • and eax, 0
                Ответить
              • sub eax, eax

                sal eax, 32
                Ответить
                • shr eax, 32
                  Ответить
                  • Оно нифига не делает вроде.
                    Ответить
                  • Т.е. надо так:

                    shr eax, 16
                    shr eax, 16

                    shl eax, 16
                    shl eax, 16

                    Ну или shr rax, 32 и забить на старшие биты. Сами отвалятся после 32-битных операций.
                    Ответить
              • BTR eax, 0
                BTR eax, 1
                BTR eax, 2
                BTR eax, 3
                BTR eax, 4
                BTR eax, 5
                BTR eax, 6
                BTR eax, 7
                BTR eax, 8
                BTR eax, 9
                BTR eax, 10
                BTR eax, 11
                BTR eax, 12
                BTR eax, 13
                BTR eax, 14
                BTR eax, 15
                BTR eax, 16
                BTR eax, 17
                BTR eax, 18
                BTR eax, 19
                BTR eax, 20
                BTR eax, 21
                BTR eax, 22
                BTR eax, 23
                BTR eax, 24
                BTR eax, 25
                BTR eax, 26
                BTR eax, 27
                BTR eax, 28
                BTR eax, 29
                BTR eax, 30
                BTR eax, 31
                Ответить
                • вообще я в асме ни в зуб ногой, так что не пинайте, если что
                  Ответить
                  • Про BTR/BTS/BTC вообще мало кто знает. Даже авторы конпеляторов эти инструкции редко используют.
                    Ответить
                    • Это который битик выталкивает в регистр флагов? А какую семантику он должен отражать у компиляторов?
                      Ответить
                      • Ну например когда ты проверяешь бит через (a >> n) & 1
                        Ответить
                        • Понятно.

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

                          Но получается гораздо больше действий
                          Ответить
                          • Не ну можно и a & (1 << n). Но так действий больше т.к. нужна единичка на входе.
                            Ответить
                            • Я анскильная макака.
                              Я делал когда-то так:

                              #define PETUH_BIT 0x10
                              #define KRESTUH_BIT 0x20
                              
                              if (flags & PETUH_BIT)

                              Вроде, работало.


                              Но через инструкцию правда круче.
                              Ты можешь просто сказать "дай мне бит номер 3" без всей этой ебли c эндом
                              Ответить
                              • Ну блин, если n неизвестно во время конпеляции, то ты не можешь так просто энд заюзать. Надо либо двигать либо юзать bt.
                                Ответить
                                • Можно надвигать себе любое число, но это будет тоже самое, да.

                                  Как-то так случалось, то у меня не было неизвестного n, и даже наоборот: у меня была переменная, и я знал все флаги (или сам их писал, или брал из SDK)
                                  Ответить
                              • А я недавно написал
                                if (flags & PETUH_BIT == 1)

                                И долго не мог понять, где обосрался. Да еще и дважды.
                                Прост в другом месте было == 0. Вот и инвертировал.
                                Ответить
                                • Какой багор )))

                                  Видел, как некоторые пишут
                                  if (flags & PETUH_BIT == PETUH_BIT)

                                  и не обсираются. Наверное, тоже боятся неявных кастов в буль-буль.
                                  Ответить
                                • А ведь сработает же, если питушачий бит крайний, а все другие флажки опущены
                                  Ответить
                                • Именно поэтому я за скобочки.
                                  Ответить
                              • >Я анскильная макака.
                                >Я делал когда-то так:

                                >#define PETUH_BIT 0x10

                                >if (flags & PETUH_BIT)

                                Нееее. Анскильные макаки делали примерно так:

                                (a-(a/32*32))/16
                                Ответить
                                • > (a-(a/32*32))/16
                                  Это уж скорее анскильные ма-те-ма-ти-ки.
                                  Ответить
                                  • В старом бейсике сдвигов не было. Приходилось делить.
                                    Ответить
                                    • Какой багор )))
                                      А потом начали сдвигать, потому что деления не было плавающий питух тормозит.
                                      Ответить
                      • Этими инструкциями можно реализовать паскалевские множества или работу с битовыми полями.
                        Ответить
                        • Да, теперь понял.

                          Я просто привык, что все ANDят с числом, но с этой инструкией удобнее.

                          Вспомнил как впервые я первые познакомился с битовой питушней.
                          Я был совсем мелким пзидюком, и писал чото под турбовижен кажется, и спросил препода "как проверить, какие из чекбоксов влкючены", а он и говорит "вот тут число, в нем каждый бит это факт включения чекбокса".

                          Если память не спит с другим, то так оно всё и было
                          Ответить
                      • А ещё есть интересные инструкции BSF и BSR.

                        Одна из них считает целую часть логарифма по основанию 2 исходного аргумента, а другая находит логарифм по основанию 2 наибольшего делителя, являющегося степенью двойки.
                        Ответить
                • while (n!=0) n&=n-1;
                  Ответить
              • undefined behavior

                mov eax, 0xFFFFFFFF
                cpuid
                Ответить
                • Можно ещё MSR'ы с нулём поискать.
                  Ответить
                  • Можно найти ноль в образе текущего экзешника (способ зависит от ОС). Нидлес и я находили нужные числа в PSP (в префиксе сегмента программы), когда соревновались в программировании в ASCII-кодах.
                    Ответить
                    • Нулей обычно в конце секции полно. Так что можно взять текущий адрес как call + pop и найти нули через repnz scasd.

                      З.Ы. А тьфу, для scasd уже понадобится 0. Придётся просто загружать и тестить.
                      Ответить
                    • > PSP

                      Ну в современных осях тоже должны найтись нули в тредлокал сегменте, на который ссылаются FS или GS.
                      Ответить
              • показать все, что скрытоvanished
                Ответить
              • loop:
                dec eax
                jnz loop

                Брейнфак-стайл.
                Ответить
                • Ещё идея: сбросить все флаги, а потом PUSHF и POP EAX.
                  Ответить
                • Искал по треду loop. Нашёл только это.
                  Странно что никто не предложил такой способ

                  za: loop za
                  mov eax, ecx
                  Ответить
              • times 32 add eax, eax

                Какой анролл )))
                Ответить
              • 21 СПОСОБ ОБНУЛИТЬ РЕГИСТР
                http://z0mbie.daemonlab.org/21zero.html
                Ответить
                • Собственно эту заметку я и вспомнил, когда предложил перечислить способы обнуления eax. Спасибо за находку, я бы её вряд ли сходу нагуглил.

                  >> вот чего тут нет - так это полных извращений, типа обнуления по одному
                  биту, автогенерируемого кода и т.п.

                  Придётся устранить это недоразумение. Есть идеи?
                  Ответить
                  • Ну вон выше есть пара-тройка полных извращений типа обнуления декрементом.
                    Ответить
                    • И обнуление по одному биту Fike предложил.

                      Осталось только позвать автогенерируемого кота.
                      Ответить
                      • > автогенерируемого

                        Мой пример с times 32. Он в 32 сложения раскроется.
                        Ответить
                        • Это мокрос. А я хочу в рантайме.
                          Ответить
                          • Ну сейчас сложно в рантайме код генерить...

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

                      Хм. Это первое что пришло мне в голову, когда посоны объявили спец. олимпиаду.
                      Ответить
                • The site ahead contains harmful programs
                  Ответить
                • > - вычисление синуса от Pi * n (умножать командой FMUL)
                  это лучший имхо
                  Ответить
    • показать все, что скрытоvanished
      Ответить
      • Там ещё и король с королевой неравноправны и не могут сменить свой гендер.
        Ответить
      • Политкорректные шахматы: белые фигуры не могут убивать чёрных.
        Ответить
        • А еще черные могут воровать у белых, например если черная фигура дошла до последней горизонтали, то надо чтоб играющий за белых заплатил бабла тому, кто за черных играет. И за черных конечно же только афро-американцы могут играть.
          Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • vanished
      Ответить

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