Хламидомонада / Говнокод #6765 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 resettik, (Updated )

Комментарии (49) 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 #\.))))))

                    Можно было бы его импортировать в текущий пакет, и не нужно было бы писать имя пакета все время, но для наглядности оставил.
                    Ответить
            • Еще вариант, короче 😛
              (cl-ppcre:scan "^\\d+(\\.\\d+)?$" from-string)
              Ответить
    • судя по статистике - это новенький девятый программист на хаскелле
      Ответить
  • ЪYMCOFILMRKTUSIKPOKSBXJWPPZKSGYRWSLJAMHLZQHNEPYLJQOGCRBMAEOSZVKEBTVRXANSTMSXUIOHCKNGJHZFTPOMGDZHWFU
    Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8