사용자 도구

사이트 도구


ps:advent_of_code

Advent Of Code

  • 사이트 링크: https://adventofcode.com/
  • 매년 12월 1일부터 25일까지 매일 한 문제씩 문제가 올라오는 사이트. Advent calendar을 모티브로 한다
  • 2015년에 처음 시작되어서 지금까지 매년 이어져오고 있다.
  • 국내에서는 인지도가 똥망이지만, 해외에서는 꽤 인지도가 있는 듯 하다.
  • 문제마다 선착순 100등 안에 풀이를 제출하면, (100-등수) 만큼의 점수를 얻는다. 문제별 점수를 모은 총 점수로 랭킹이 나온다

연도별 문서

문제 스타일

  • 일반 PS/CP에서 등장하는 문제 스타일과는 조금 다르다. 따로 공부가 필요한 자료구조/알고리즘등을 사용해서 풀기보다는 기본적인 알고리즘 지식과 구현으로 풀어야 하는 문제들. PS하는 사람들보다는 일반 개발자를 위한 문제들에 가깝다
  • 인풋 데이터가 제공되고, 로컬에서 데이터에 대한 답을 구해서, 정답을 입력하는 형식이다. 소스코드는 전혀 제출할 필요가 없다.
    • 인풋 데이터는 유저마다 다르게 주어진다. 따라서 로그인을 해야만 데이터를 받을 수 있다.
  • 인풋 데이터는 PS/CP에서 흔히 주어지는 '최대한 컴퓨터가 읽기 쉬운 형태로 포매팅된' 방식의 데이터가 아니다. 대부분 문제에서는 PS문제에서는 할 필요가 없었을 파싱 작업이 필요하다

유틸리티 코드

  • 역사가 오래된 이벤트다보니. 인풋파일을 다운받고 기본 템플릿 코드를 생성하는 자동화 코드들이 이미 인터넷에 많이 있다.
  • https://github.com/tomfran/advent-of-code-setup 를 기반으로 내가 만들어 쓰고 있는 코드는 아래와 같다.
    • 세션 쿠키값을 파일에 저장해놓고 읽어서 쓴다. 원본 프로젝트의 설명을 참고.

import os
import requests
import sys


FOLDER = './AdventOfCode/'
YEAR = 2023

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
HEADERS = {'User-Agent': USER_AGENT}
SESSION_ID_FILE = FOLDER + 'session.cookie'

TEMPLATE = '''"""Solution code for "Advent of Code {0} Day {1}".

- Problem link: https://adventofcode.com/{0}/day/{1}

Tags: [XXX]
"""

def solve_part1(lines):
    pass

    
def solve_part2(lines):
    pass


def main():
    with open('./AdventOfCode/{0}/day{1}.txt', encoding='utf-8') as file:
        lines = file.read().split('\\n')
    print('[PART 1]')
    solve_part1(lines)
    print('[PART 2]')
    solve_part2(lines)    


if __name__ == '__main__':
    main()
'''


def get_session_id(filename):
    with open(filename, encoding='utf-8') as f:
        return f.read().strip()


def get_url(year, day):
    return f'https://adventofcode.com/{year}/day/{day}/input'


def get_cookies():
    session = get_session_id(SESSION_ID_FILE)
    return {'session': session}


def create_input_file(year, day):
    path = f'{FOLDER}{year}/day{day}.txt'
    if os.path.exists(path):
        print(path + ' already exists.')
        return

    url = get_url(year, day)
    cookies = get_cookies()
    response = requests.get(url, headers=HEADERS, cookies=cookies)
    if not response.ok:
        raise RuntimeError(
            f'Request failed\n\tstatus code: {response.status_code}\n\tmessage: {response.content}'
        )
    with open(path, 'w', encoding='utf-8') as f:
        f.write(response.text[:-1])


def create_source_file(year, day):
    path = f'{FOLDER}{year}/day{day}.py'
    if os.path.exists(path):
        print(path + ' already exists.')
        return

    with open(path, 'w', encoding='utf-8') as f:
        f.write(TEMPLATE.format(year, day))


def main():
    if len(sys.argv) != 2:
        year_and_day = input(f'Input day (or year/day, if year != {YEAR}): ')
    else:
        year_and_day = sys.argv[1]
    if '/' in year_and_day:
        year, day = year_and_day.split('/')
    else:
        year, day = YEAR, int(year_and_day)

    create_input_file(year, day)
    create_source_file(year, day)


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
C F M E H
 
ps/advent_of_code.txt · 마지막으로 수정됨: 2024/07/19 04:51 저자 teferi