1. Haskell / Говнокод #6765

    −357

    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
    chislo :: String -> Bool
    chislo []=True
    chislo (x:xs) =if (x=='1') then chislo xs
                   else if (x=='2') then chislo xs
                     else if (x=='3') then chislo xs
                       else if (x=='4') then chislo xs
                         else if (x=='5') then chislo xs
                           else if (x=='6') then chislo xs
                             else if (x=='7') then chislo xs
                               else if (x=='8') then chislo xs
                                 else if (x=='9') then chislo xs
                                   else if (x=='0') then chislo xs
                                     else if (x=='.') then chislo xs
    							 else False

    haskell

    Запостил: resettik, 26 Мая 2011

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

    • как я соскучился по лесенке!
      Ответить
      • это точно, лестничные пролеты, косяки уток...
        Ответить
    • chislo xs = length [x | x <- xs, x == '.'] < 2 && (and $ map (\x -> isDigit x || x == '.') xs)

      это же haskell, тут все легко и понятно
      Ответить
      • Легко и понятно - это вот так:
        (every (lambda (x) (or (digit-char-p x) (char= x #\.))) in-string)
        Ответить
        • изящно
          Ответить
        • В примере выше проверяется, что точка будет всего одна. Но в самом первом примерe это не требуется, но в зависимости от языка разные записи допустимы. Если уж мы говорим об ANSI Lisp, то -2/+4 - это вполне себе число, если это CL, то практически во всех реализациях #c(100 4.2e200) - тоже число, например.
          Вобщем, не зная изначальную задачу тяжело сказать, что именно не получилось у автора кода.
          Ответить
        • Раз уж на то пошло :)
          (defun maybe-float-p (from-string)
            (loop for char across from-string
                 with has-dot = nil
                 with valid = nil
                 for code = (char-code char)
                 do (if
          	    (not (and (> code #x30) (< code #x39)))
          	    (if (= code #x2E)
          		(if has-dot
          		    (return nil)
          		    (progn
          		      (setf has-dot t)
          		      (setf valid nil)))
          		(return nil))
          		(setf valid t))
                 finally (return valid)))
          
          (maybe-float-p "123.456")		;T
          (maybe-float-p ".123")			;T
          (maybe-float-p "123random text456")	;NIL
          (maybe-float-p "123.")			;NIL
          (maybe-float-p "123.456.789")		;NIL
          Ответить
          • - (not (and (> code #x30) (< code #x39))) 
            + (or (< code #x30) (> code #x39))

            упс D:
            Ответить
            • А может не надо loop'ов и progn'ов?

              (defun maybe-float-p (from-string)
              (let ((x (ignore-errors (read-from-string from-string)))) (and (realp x) (not (integerp x)))))
              Ответить
              • А почему не целый тип? Целый вроде как можно по условию задачи (только смотри мой предыдущий пост о том, что условие задачи не понятно) :) Ну и вообще, если пользоваться встроенными функциями, то смысла в этом коде вообще как-бы и не было :)
                Кроме того, мой вариант может оказаться оптимальнее (не смотря на то, что "не красивый") в случае когда, например: 1/1234567890123456789012345678901234567890 потому что закончит работу когда ему встретится / а не будет читать до самого конца, не смотря на то, что уже как бы и так все понятно.
                Ответить
                • >А почему не целый тип?
                  Справедливо. Это мой глюк. В таком случае можно и let убрать:
                  (defun maybe-float-p (from-string)
                  (realp (ignore-errors (read-from-string from-string))))

                  Ну а насчет остального скажу так: Ваш код выглядит (чисто визуально) жутковато - я даже побоялся в нем разбираться. CL позволяет сделать все проще.
                  Ответить
                  • Ну так кто бы спорил. Я ж и говорю, что если пользоваться тем что уж по-любому по стандарту должно быть в языке, то этот код явно лишний, потому что уже все превращения числа в строку и обратно написаны и еще раз писать их совсем не нужно.
                    А по поводу цикла - дело привычки, наверное. Я думаю, что iterate красивше выглядит, но если ищу примеры, то чаще всего именно loop попадается.
                    Ответить
                    • Собственно:
                      ; (ql:quickload "iterate")
                      (eval-when (:compile-toplevel :load-toplevel :execute)
                        (require 'iterate))
                      
                      (defun maybe-float-p (from-string)
                        (iterate:iter 
                          (iterate:for char in-string from-string)
                      	(iterate:generate dots upfrom 0)
                      	(cond
                      	  ((position char "0123456789") t)
                      	  ((and (char= char #\.) (< dots 0))
                      	   (iterate:next dots))
                      	  (t (iterate:leave)))
                      	(iterate:finally (return (not (char= char #\.))))))

                      Можно было бы его импортировать в текущий пакет, и не нужно было бы писать имя пакета все время, но для наглядности оставил.
                      Ответить
              • Еще вариант, короче :P
                (cl-ppcre:scan "^\\d+(\\.\\d+)?$" from-string)
                Ответить
          • чото больше на лисп похоже
            Ответить
            • лисп говно
              Ответить
            • У wvxvw всегда либо Лисп, либо Пролог.
              Ответить
              • Пролог клёвый) Вообще логическое программирование это интересно
                Ответить
                • Ага. А какое бывает логическое программирование, Пролога и Вижуал Пролога?
                  Ответить
                  • Mercury использует примерно полторы компании
                    См. также Datalog
                    Ответить
                    • Кстати, есть реализация пролога на Racket
                      Ответить
                      • Логическое программирование в виде embedded DSL не реализовал только ленивый
                        http://minikanren.org/
                        http://hackage.haskell.org/package/logict
                        https://franz.com/support/tech_corner/prolog-071504.lhtml
                        
                        https://en.wikipedia.org/wiki/Warren_Abstract_Machine
                        Ответить
                        • Собственно, именно Datalog на Рэкете и реализован
                          Ответить
      • Ололо.
        chislo = all (`elem` ('.':['0'..'9']))
        Ответить
    • Ничего святого!
      Ответить
    • Что нам стоит дом построить.
      Ответить
    • на хаскеле можно говнокодить?
      Ответить
    • Аааа, бля, быдлокод на Хаскелле!!!
      Ответить
      • НА ХАСКЕЛЕ НЕЛЬЗЯ ГОВНОКОДИТЬ
        Ответить
        • Эти ваши быдлокодеры кеннот интро ХАСКЕЛЛЬ
          Ответить
      • судя по статистике - это новенький девятый программист на хаскелле
        Ответить
    • askhell
      Ответить
    • функционально, хуле.

      >chislo
      bydlo cannot into haskell
      Ответить
    • этопять!!!
      Ответить

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