페어 프로그래밍 회고
오늘은 알고리즘 관련 문제를 함께 풀어 보았다. 기초적인 문제들도 많았지만 좀더 효율적인 코드를 작성하기 위한 다른 사람들의 노력이 보이는 코드들이 많았다. 그래도 오늘은 어제에 비해 좀 더 페어 프로그래밍 답게 코딩했다.
알고리즘
- 두 정수 사이의 합
- 나머지
- A-B
- A+B
- Arrays-DS
- Hello World
전체적으로 기초적인 내용이어서 쉽게 해결했다. 두 정수 사이의 값 의 다른 사람 풀이에 관해 하나 정리하겠다.
function solution (a, b) {
return (a+b) * (Math.abs(b-a) + 1) / 2
}
대부분의 사람들은 a와 b 중 큰 값을 찾아내고 그 사아수를 천천히 더하는 방법을 사용하였지만 이 풀이는 가우스의 풍이를 응용하여 풀었다.
UNIX 기본 명령어
cat
- 매개변수가 없는 경우 : 표준 입력 -> 표준 출력
- 매개변수가 있는 경우 : 매개변수로 받은 파일의 내용을 표준 출력
$ cat test.txt
hello
echo
매개변수로 받은 표준입력을 표준 출력으로 바꿈
$ echo "hello"
hello
> or < (Redirection)
- 입력 리다이렉션 : <
- 출력 리다이렉션 : >
# 출력 리다이렉션
$ echo "hello" > test.txt
$ cat test.txt
hello
$ echo "hello 덮어쓰기" > test.txt
hello 덮어쓰기
$ echo "hello 추가하기" >> test.txt
hello 덮어쓰기
hello 추가하기
> 를 이용하면 덮어쓰기, >> 는 추가할 수 있다.
# 입력 리다이렉션
$ cat < test.txt
hello
grep
표준 입력을 받아 매개변수로 받은 문자를 필터링하여 해당 문자를 표준 출력으로 변환
주로 파이프 |
와 함께 사용
| (Pipe)
앞 명령의 표준 출력을 표준 입력으로 변환
$ ls | grep test
test.txt
vim
모드
- 입력 모드
- 일반 모드
- ex 모드
명령어
- i - 현재 커서 입력 모드 전환
- a - 현재 커서 한탄 뒤 입력모드 전환
- :w - 저장
- :q - 종료
- :wq - 저장하고 종료
- :q! - 강제 종료
- h, j, k, l - 순서대로 ←, ↓, ↑, →
- w - 단어의 시작위치를 단위로 이동
- e - 단어의 끝위치를 단위로 이동
- b - 단어의 시작위치를 단위로 역이동
- yy - 행 복사
- dd - 행 삭제
- x - 커서가 위치한 곳 문자 한개 삭제
find
이터러블을 순회하면서 해당 조건에 맞는 값을 발견하면 해당 값을 리턴
const find = (f, iter) => go(iter,
L.filter(f),
take(1),
([k]) => k)
log(find(v => v % 2, [1,2,3])) // 1
infinity
무한대로 yield
를 하는 함수이다. next 할때만 평가하기 때문에 브라우저에 영향을 주지 않는다.
function *infinity(i = 0) {
while(1) yield i++
}
takeAll
take
함수를 응용한 함수로 배열의 모든 값을 리턴한다. 특정 배열의 길이를 모를때 사용한다.
const takeAll = take(infinity)
L.map 기반 map
지연 평가된 map
을 이용하여 전체를 평가하는 map
을 만들 수 있다.takeAll
함수를 이용해 전체를 평가를 할 수있도록 해주면 된다.
const map = curry((f, iter) => go(L.map(f, iter), takeAll))
L.filter 기반 filter
filter
함수도 L.filter
기반으로 작성할 수 있다.
const filter = curry((f, iter) => go(L.filter(f, iter), takeAll))
L.flatten
인자로 받은 배열을 1차원 배열로 변환시킨다. 단, 깊이는 1만 평가 할수 있다.
const isIterable = (iter) => iter && iter[Symbol.iterator]
L.flatten = function *(iter) {
for(const a of iter) {
if(isIterable(a)) for(const b of a) yield b
else yield a
}
}
const flatten = (iter) => go(L.flatten(iter), takeAll)
log(...L.flatten([[1, 2], [3, 4], [5, 6]])) // 1 2 3 4 5 6
log(flatten([[1, 2], [3, 4], [5, 6]])) // [1, 2, 3, 4, 5, 6]
해당 배열이 iterable 인지 판단하여 iterable 이라면 한번 더 for of
을 이용하여 안에 있는 요소를 yield
한다.
yield* [[iterable]]
iterable 객체에 yield
를 위임할때 사용한다.
즉 yield* iterable
은 for(const val of iterable) yield val
과 동일하다. flatten
함수를 좀 더 직관성 있게 작성해 보겠다.
L.flatten = function *(iter) {
for(const a of iter) {
if(isIterable(a)) yield* a
else yield a
}
}
deepFlat
flatten
함수를 조금 보완한 함수로 깊이가 깊은 배열이라도 재귀를 이용하여 yield
한다.
L.deepFlat = function *f(iter) {
for(const a of iter) {
if(isIterable(a)) yield* f(a)
else yield a
}
}
const deepFlat = (iter) => go(L.deepFlat(iter), takeAll)
'Study > Today I Learn' 카테고리의 다른 글
[TIL] 2019.04.04 - Git 기본 (0) | 2019.04.04 |
---|---|
[TIL] 2019.04.03 - Computer Science (0) | 2019.04.03 |
[TIL] 2019.04.01 (0) | 2019.04.01 |
[TIL] 2019.03.30 (0) | 2019.03.30 |
[TIL] 2019.03.24 (0) | 2019.03.24 |