딴분들은 부끄러우니 보지 말아주세요..ㅠ_ㅠ
(defn open-doors [doors n]
(if (zero? n)
doors
(recur
(for [d doors
:let [i (first d)
s (last d)]]
(if (zero? (mod i n)) [i (not s)] [i s])) (dec n))))
(defn doors [n]
(let [doors (map vector (range 1 (inc n)) (repeat n false))]
(map first (filter (comp true? last)
(open-doors doors n)))))
(doors 100)
걍 내 아는 한도 내에서 짠거임. 걍 문제 알고리즘 돌직구.
나 걍 clojure 안하는게 좋음? 걍 이대로 자바게이나 C++게이로 사는게 흉이 보기에 100배 나음?
뭐 특히 좀 더러운 냄새 나는 부분에 대해서 어떻게 고치면 좀 더 clojure 스러운지 지도편달 부탁드리겠음.
근데 확실히 빠르게 코딩은 가능한 것 같다. REPL이랑 같이 쓱쓱하니..
근데 이거랑은 논외로 리습방식이 첨이라 그런진 모르겠는데 예를 들어 for루프를 타는 뭔가를 작성할때
예전에는 for ... range 이런 형태로 top-down적으로 짜고 있음. 근데 clojure는 우선 range로 리스트를 만들고 이걸 for로 한다는 생각으로 bottom-up으로 작성함. 이게 맞는 방식임? 아무래도 repl때문에 더 그런 것 같은데.
미리 감사드림!
음..12시에 일 안돼서 잠깐 살펴봐서 밑에 부분 좀 수정함. 이것까지 포함하면 대충 12분정도 걸린듯염.
근데 솔까말 (repeat 100 false)는 로제타 코드에서 보고 훔쳐옴..;;
솔까말 예제가 너무 구림.
시그마 i = 1 에서 n 까지 2n - 1 = n ^ 2 는 고1 때 나오는건데 그게 뭐 대단히 수학적임?
홀수를 더해서 제곱근 만드는거 예전에 퀴즈로 많이 내던거.
이걸론 펑셔널 랭귀지의 매력을 뿜어내기에 한계가 있을듯.
@codesafer : 지금은 clojure 자체를 배우는 시간이니까요 ㅋㅋㅋ
아코 2i - 1 = n ^ 2
흠 글쎄. 이 코드를 보고 clojure 를 배워야겠다는 생각은 안드는걸? 그럼 그 언어로 좋은 예제는 아니라는것 아닐까...
격식을 갖추는 부분은, 언어외적인 부분도 많다고 생각해.
야이미친의 코드에 담긴 격식도 언어 그자체의 철학과는 좀 다른듯 하고.
@codesafer : 음..저도 로제타코드에서 이 예제를 보고 clojure를 배워야겠다는 생각이 든게 아니라 clojure를 익힐 요량으로 로제타코드를 보니 1번 예제가 이 예제여서 본거죠..ㅎㅎㅎ
@codesafer : 그리고 일단 clojure's way에 대해서 익숙하지 않아서 아무래도 기존 경험 기반의 잔재가 남아있을 수 있으니 좀 봐달라는거임.
@codesafer : 일단 뭐 저는 기존에 haskell(물론 완전 올드스쿨이지만)이나 자바나 python에 있는 functional programming 도구를 쓸 때와는 좀 다른 느낌이 와서 clojure 자체가 나쁘진 않다고 생각해요.
swift의 최적화 코드 꼴릿하네 ㅋㄷㅋㄷ
컴파일러가 evaluation 하고 있는걸까 exception 처리 되는걸까 : ) 전자겠지?
아 저게 주석이 아니라 코드구나 ㅡ,.ㅡ 눈깔 병신.
야이미친흉은 일하나 보넹..5시 이후에 다시 봐야겠구나..모두들 즐일!
원래 코드는 한 7~8분정도 걸린 것 같은데 불필요한 중복도 보이고 함수로 만드는게 확장성있을 것 같아서 좀 수정해서 총 12분가량 걸림
내가 아는 한도내에선 뭐 개선할 방안은 더 이상 없는 것 같엉..
근데 확실히 익숙한 c++이나 java가 아직은 생산성이 좋긴해. 익숙해지면 괜춘하겠징
밥먹으면서 보나 저기 map을 왜 넣었나싶넹;; 2분 추가해서 14분. 올라가서 수정함여. 잘 모르니 캐도캐도 끝이 없구나
아..아니넹..map 뺄수가 없구나..쏴리!
반대로 돌아가는건 논외로 함여..어차피 조건문이랑 조금만 바꾸면 되서..-_-;
워홀 야이미친흉이 다섯시가 넘도록 반응이 없다닛. 의외군
지금 퇴근함. 일단 밥좀 먹고
@야이미친 : 옹! 즐저하시구랴. 난 오늘 회식!
밥이 좀 이르네. 네가지만 지적함 1. Destructuring 을 찾아서 좀 보고 고쳐봐. 2. Map, filter, keep-indexed,... 이런거 다 결국 loop야. 되도록 한큐에 되게 해봐. 3. For가 저기선 유효한데, 두개 이상 요소로 돌릴 때는 곱이 되니 주의. 4. 문 여는걸 거꾸로 열지마. 자기 의도대로 프로그래밍해야지
아 이따 내가 체이닝도 알랴주께
@야이미친 : ㅇㅇ 1은 알고는 있는데 적용이 쉽지 않넹. 2번은 중요한 포인트넹 알겠음. 3은 이미 알고 있음 그래서 let을 썼음. 4는 알겠음! 고마워 흉 좀 더 고민해서 수정해보겠음! 근데 빌딩 블럭 쌓는 방식은 맞음?
@야이미친 : 음..1번을 사실 적용 못한게 3번 때문이고 2번 형식으로 어떻게든 고쳐봐야겠넹..keep-indexed는 뭔지 모르니까 일단 좀 찾아봐야겠음..
3에서도 될걸
@야이미친 : 아 그러네..-_- 땡큐흉!
걍 :let 절에 쓰면 되지..음..이건 완전 깜빡했넹-_- 첨에 :let을 안 쓰고 생각했을때 안됐는데..ㅇㅇ;;
@야이미친 : 뭘할래도 스코프가 문제넹..흉 혹시 let으로 바인딩된 애들 let밖에서 쓸 수 있게 하는 방법 있음? 아니면 그런 경우가 필요할땐 어떻게 함? 지금 하려는게 (defn open-doors [n] (let [doors (repeat n false)]) doors) 형태로 접근을 해야 뭔가 방법을 찾을 수 있을 것 같담..
흉꺼보니까 loop로 해결했구나..혹시 이 방법 외에 다른 방법은 없음?
어째튼 오늘은 회식이라 틈틈히 볼께!