본문 바로가기

Study/Today I Learn

[TIL] 2019.04.02

페어 프로그래밍 회고

오늘은 알고리즘 관련 문제를 함께 풀어 보았다. 기초적인 문제들도 많았지만 좀더 효율적인 코드를 작성하기 위한 다른 사람들의 노력이 보이는 코드들이 많았다. 그래도 오늘은 어제에 비해 좀 더 페어 프로그래밍 답게 코딩했다.

알고리즘

  • 두 정수 사이의 합
  • 나머지
  • 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* iterablefor(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