할일 없어서 나의 무각 키보드를 뚜드려 보았다
답이 맞는지 안맞는지는 귀찮아서 안맞춰봤고, 테스트 데이터로 최대길이 1,000,000, 질문 100,000 했을 떄
"Elapsed time: 850.905821 msecs" 나옴
(import '(java.io BufferedReader StringReader Reader))
(def nl (int \newline))
(defn build-range-vectors [^java.io.BufferedInputStream in]
(loop [prev-char (.read in) cur-char (.read in)
start-index (int 0) end-index (int 1)
start-vector [] end-vector []]
(cond (= cur-char nl)
(if (>= (- end-index start-index) (int 1))
[(conj start-vector start-index) (conj end-vector end-index)]
[start-vector end-vector])
(= prev-char cur-char)
(recur cur-char (.read in) start-index (inc end-index) start-vector end-vector)
(not= prev-char cur-char)
(if (>= (- end-index start-index) (int 1))
(recur cur-char (.read in)
end-index (inc end-index)
(conj start-vector start-index) (conj end-vector end-index))
(recur cur-char (.read in)
end-index (inc end-index)
start-vector end-vector)))))
(defn build-sorted-question-seq [in]
(let [lines (-> in clojure.java.io/reader line-seq)]
(loop [questions (rest lines)
i (int 0)
index-added-ranges []]
(if (empty? questions)
[(-> lines first read-string)
(sort (fn [a b]
(< (second a) (second b)))
index-added-ranges)]
(recur (rest questions)
(inc i)
(->> (read-string (format "[%s]" (first questions)))
sort
(cons i)
(conj index-added-ranges)))))))
(defn -main [in]
(let [[startv endv] (build-range-vectors in)
[n sorted-questions] (build-sorted-question-seq in)
answers (transient (vec (replicate n "No")))]
(loop [questions sorted-questions
start-vector startv
end-vector endv]
(let [[[index start end] & more-questions] questions]
(when index
(let [[range-start & more-start] start-vector
[exclusive-range-end & more-end] end-vector
inclusive-range-end (dec exclusive-range-end)]
(cond (or (< end range-start)
(and (< start range-start) (<= range-start end inclusive-range-end))
(and (<= range-start start) (< start inclusive-range-end end)))
(recur more-questions
start-vector
end-vector)
(<= range-start start end inclusive-range-end)
(do
(assoc! answers index "Yes")
(recur more-questions
start-vector
end-vector))
:otherwise
(recur questions
more-start
more-end))))))
(.close in)
(persistent! answers)))
와 디시라 코드가 막 짤리네 ㅋㅋ
야이미친 형아 근데 이런 문제는 함수형 언어랑 잘 안 맞지 않음?
명령형 언어에 더 적합해 보이는 데 말이지.
일단 알고리듬이 괜춘하면 왠만한 속도는 나오는데, 조 위에보면 transient, persistent 및 (int ...), ^java.io.BufferedInputStream 이러한 타입 힌트 등으로 컴파일러한테 최대한 최적화 정보를 줘야 함
저런거 없으면 10배이상 느려짐 ㅎㄷㄷ
헐 ㄷㄷ
함수형 언어도 잘 알고 써야지 제대로 모르는 사람이 대충 짜면 오히려 독이네.
ㄴ 그러함. 가비지 컬렉션 자주 일어나게 코딩하면 조팝 인증하는 거임
근데 실전에서는 저정도 짜내기 할 일도 별로 없는게 함정 ㅎㅎ
솔까 함수형뿐만 아니라 타입 정보나 자잘한 힌트 주면 최적화때 도움되잖음
아따 둘째 빽빽 운다 ㅜㅜ
ㄴ 그러긴 한데, 직장에서는 그런거 까지 안하고 이렇게 시간 죽이기 용으로 쓸데없는 문제 풀때 속도 낸다고 그런거 신경써서 코딩하는게 함정 ㅋㅋ
오늘의 교훈: 돈안되는 일에 목숨걸자
애 잘 보긔
이 언어는 실행시에 자바 머신을 통하지 않고, 마치 컴파일된 c 프로그램처럼 바로 실행되게 하는 방법은 없나요? 그러면 일반 pc 응용프로그램도 다 작성될텐데..
ㄴ 얌마 일반 응용 프로그램도 그렇게 하는거 많다. 니가 발품팔아 찾아보면 java exe wrapper 이런거 있을건데... 암튼 로레벨 구현의 방법상 문제라 니가 생각하는 만큼 중요한건 아니다. 즉, 의미없음
ㄴ 네. 감사합니당!
http://autogram.tk/이
중고차 어플리케이션 어떤가요?