1. Куча / Говнокод #10404

    +125

    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
    (defun question-2 ()
      (let ((b '(1 2 3))
            (a '(1 2 3 4))
            (com (make-hash-table :test #'equal)))
        (labels ((put-sorted (x)
                   (let ((key
                          (sort
                           (flatten
                            (copy-tree x)) #'<)))
                     (if (gethash key com)
                         (incf (gethash key com))
                         (setf (gethash key com) 1)))))
          (values (remove-if
           #'(lambda (x)
               (prog ((results
                      (do ((x x (cdr x)) (r))
                          (nil)
                        (setf r (append (cadar x) r))
                        (when (null (cdr x))
                          (return r)))))
                 (dolist (y a)
                   (when (not (member y results))
                     (go remove-it)))
                 (put-sorted results)
                 (go keep-it)
                 remove-it (return t)
                 keep-it nil))
           (all-functions b (cartesian-product a))) com))))

    Ну, чем бы еще порадовать. Вот, родилось во время проверки домашних заданий :)

    Запостил: wvxvw, 29 Мая 2012

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

    • показать все, что скрытоЭто на чем вообще написано, что за высер такой?
      Ответить
      • > defun
        > #'
        > setf
        > dolist
        CommonLisp же
        Ответить
        • СКОБКИ.
          Много скобок.
          Ответить
          • Диалектов много, знаете ли, и не все мне нравятся.
            Скобок во всех лиспах хватает ололо в clojure скобок меньше чем в жабе
            Ответить
          • Зато скобки позволяют в редакторе одним легким нажатием клавиш выделить следующуй нон-терминал / выражение, при чем любой степени сложности.
            Ответить
            • Мне тоже лисп-стиль нравится больше хацкельного.
              Ответить
    • Более подробный комментарий:
      Тут, вобщем, как в комиксе с динозавром и goto получилось. Было очень влом переделывать по-нормальному. При чем 2 раза (но второй нужно объяснять, и мне лень) там можно было бы без do цикла сделать быстрее через (mapcan #'cdr ...) но я не сразу сообразил в чем фишка, и лень было разбираться.
      Ответить
    • 1) CL это второй язык после хаскеля, в котором функции в районе 10 строк нечитабельны.

      2) Зачем загонять все задание в одну функцию. ИМХО это только создает лишние labels'ы let'ы, уровни вложенности и проблемы при чтении.
      Ответить
      • Лол, и вправду, на Хаскелле если это нельзя записать 1-5 строчек, лучше вообще никак не писать.
        Ответить
    • Кстати, а можно посмотреть на определения cartesian-product и all-functions?
      Ответить
      • Не читабельны, ну... без преувеличений, плохо читабельны - тут можно согласится. Но эта конкретная функция имеет повышенную степень нечитабельности изза лени автора (ее можно было сократить, разбить на меньшие функции, и не придумывать извращенные решения - но автора мучала лень, и нужно было просто быстро проверить результат).

        Остальные функции: да, пожалуйста:
        http://pastebin.com/tWQrciWM


        Вроде ничего не забыл.
        Ответить

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