본문 바로가기
College Computer Science/Programming Langauages

[프로그래밍언어론] 과제 1 : 이터레이터 생성자 (Iterator Generator) 만들기

by 2den 2020. 12. 20.
728x90

문제

Develop a program per each of the examples of the Python iterator generator for “sort”(quicksort) and “flatten” in ANY language of choice with the following constraints:

  • You MUST NOT use any constructs that are similar or equivalent to the iterator generator of Python (such as “yield”). You have only to use ordinary control structures (if, while, ...) and/or procedure calls.
  • You CAN utilize other people’s solutions found from the Internet if you can explain how they can be applied to the given problem. Give thorough comments to the code you have used.

The purpose of this assignment is to demonstrate why control abstraction like iterator is useful in general and essential sometimes.

 

Python iterator 생성자를 사용한 sort(quicksort)  flatten 예제 각각에 대하여 다음 조건을 만족하는 프로그램을 임의의 언어로 작성하시오.

  • Python의 iterator 생성자와 유사하거나 동일한 기능(예를 들어 “yield”)를 사용하면 안됩니다. 그 대신 if, while 등과 같은 보편적인 제어구조와 프로시저(함수, 메서드 호출)만 사용해야 합니다.
  • 주어진 문제에 어떻게 적용할 수 있는지 설명할 수만 있다면 인터넷에서 다른 사람들의 해결책을 찾아 활용해도 됩니다. 참조/인용/복사하여 사용한 코드에 대한 완전한 설명을 추가하기 바랍니다.

이 과제의 목적은 iterator와 같은 제어 추상화가 일반적으로 왜 유용하며, 어떤 경우에는 특히 필수적인지 예시하기 위한 것입니다.

 


flatten.py

  1. 첫번째 요소가 리스트가 아닐때까지 찾아 반환
  2. item이 리스트일 때는 리스트를 slice해 (첫번째 요소가 들어있는 리스트 + 나머지 요소가 들어있는 리스트) 첫번째 요소가 들어있는 리스트를 재귀적으로 returnitems()에 실행
  3. 2에서 slice된 나머지 요소들은 다시 원래 리스트 맨 앞에 insert (그래야 다음 실행때 다시 나머지 요소의 처음부터 반환해줄 수 있음)
  4. 첫번째 요소는 pop()으로 꺼내 처리한 요소를 리스트에서 제거
#flatten.py

def returnitems(lst):
    item = []
    if lst:
        while(1):
            if item:
                item = item.pop(0)
            else :
                item = lst.pop(0)
            if isinstance(item, list):
                if not item:
                    continue
                lst.insert(0, item[1:])
                item = item[0:1]
            else:
                break
    return item

def myflatten(lst) :
    result = []
    while(1):
        temp = returnitems(lst)
        if not isinstance(temp, int) :
            if not isinstance(temp, float):
                if not temp:
                    break
        result.append(temp)
    return result

data = [1, [-2, [[[4]]], [0, 5], [], 3], [4], 2, 7]
sum = 0

flattenlist = myflatten(data)
print("flatten list:",flattenlist, end='\n\n')

for e in range(len(flattenlist)):
    print(flattenlist[e], end=' ')
    sum += flattenlist[e]
    if sum > 10:
        break
print('\nResult:', sum)

 

 

sort.py

  1. 퀵소트를 활용하여 리스트 상 가장 작은 원소를 반환
  2. 피봇보다 작은 요소들로 이루어진 리스트, 같은 요소들로 이루어진 리스트, 큰 요소들로 이루어진 리스트를 생성
  3. 2에서 생성된 같은 리스트와 큰 리스트는 다시 temp 리스트에 넣어줌
  4. 작은 리스트가 비었을 경우 temp 리스트의 첫번째 요소 반환 (최솟값)
  5. mysort_zip()은 요소의 개수가 많을 경우 모든 정렬을 하지 않도록 출력할 범위를 정수로 함께 입력 받아 returnmins()를 해당 개수만큼만 호출
#sort.py

def returnmins(lst):
    print("list:",lst)
    temp = []
    head, tail = lst[0], lst[0:]
    less = [v for v in tail if v < head]
    equal = [v for v in tail if v==head]
    greater = [v for v in tail if v>head]
    temp = equal + greater + temp
    if not less:
        return temp.pop(0)
    else:
        return returnmins(less)

def mysort_zip(lst, ziprng):
    result = []
    while(len(result)<ziprng):
        temp = returnmins(lst)
        if not isinstance(temp, int) :
            if not isinstance(temp, float):
                if not temp:
                    break
        result.append(temp)
        lst.remove(temp)
    print("sorted list:",result, end='\n\n')
    return result

data =[3,1,-5,7,-4,2,6,200,9,-2,4,3,0,-2]+[100]*10000

mysort_zip(data,20)

 


평가

교수님께서 myflatten()과 mysort()처럼 굳이 한 번 더 결과를 리스트로 합쳐서 반환하지 않아도 된다고, returnitems()와 returnmins() 함수만 구현했어도 훌륭한 정답이라고 하셨음

 

 

728x90

댓글