diff --git a/dday.py b/dday.py new file mode 100644 index 0000000..88743c4 --- /dev/null +++ b/dday.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +"""Terminal D-day counter CLI. + +Given a target date (YYYY-MM-DD), prints how many days remain until it, +have passed since it, or whether it's today. + +Examples: + python dday.py 2026-12-25 # D-155 (future date) + python dday.py 2020-01-01 # D+N (past date) + python dday.py 2026-07-23 # D-DAY (today) +""" + +import argparse +import sys +from datetime import date, datetime + + +def parse_date(text): + """Parse a 'YYYY-MM-DD' string into a date object.""" + return datetime.strptime(text, "%Y-%m-%d").date() + + +def format_dday(target): + """Format the day difference between today and `target` as D-N/D+N/D-DAY.""" + diff = (target - date.today()).days + if diff > 0: + return f"D-{diff}" + if diff < 0: + return f"D+{-diff}" + return "D-DAY" + + +def build_parser(): + parser = argparse.ArgumentParser( + prog="dday.py", + description="터미널 D-day 카운터", + ) + parser.add_argument( + "target_date", + help="목표 날짜 (형식: YYYY-MM-DD)", + ) + return parser + + +def main(): + parser = build_parser() + args = parser.parse_args() + + try: + target = parse_date(args.target_date) + except ValueError: + print( + f"오류: '{args.target_date}'는 올바른 날짜 형식이 아닙니다. YYYY-MM-DD 형식으로 입력하세요. " + "예: python dday.py 2026-12-25", + file=sys.stderr, + ) + return + + print(format_dday(target)) + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + print("\n중단됨") + sys.exit(130) diff --git a/quote.py b/quote.py new file mode 100644 index 0000000..a954ba1 --- /dev/null +++ b/quote.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +"""Terminal random quote CLI. + +Prints one randomly chosen quote from a local list each time it runs. + +Examples: + python quote.py +""" + +import argparse +import random +import sys + + +QUOTES = [ + ("성공은 열정을 잃지 않고 실패를 거듭할 수 있는 능력이다.", "윈스턴 처칠"), + ("삶이 있는 한 희망은 있다.", "키케로"), + ("시작이 반이다.", "아리스토텔레스"), + ("배움에는 지름길이 없다.", "속담"), + ("최고의 복수는 큰 성공이다.", "프랭크 시나트라"), + ("어제로부터 배우고, 오늘을 위해 살고, 내일을 위해 희망하라.", "알버트 아인슈타인"), + ("길이 없으면 만들면 된다.", "한니발"), + ("천 리 길도 한 걸음부터.", "노자"), + ("실패는 성공의 어머니다.", "속담"), + ("피할 수 없으면 즐겨라.", "로버트 엘리엇"), + ("행동하지 않으면 아무 일도 일어나지 않는다.", "요한 볼프강 폰 괴테"), + ("오늘 할 수 있는 일을 내일로 미루지 마라.", "벤저민 프랭클린"), + ("지혜의 시작은 자신이 모른다는 것을 아는 것이다.", "소크라테스"), + ("당신이 할 수 있다고 믿든 할 수 없다고 믿든, 믿는 대로 될 것이다.", "헨리 포드"), + ("위대한 일은 갑자기 이루어지지 않는다.", "에픽테토스"), + ("실패를 두려워하지 마라. 시도하지 않는 것을 두려워하라.", "속담"), + ("자신을 아는 것이 모든 지혜의 시작이다.", "아리스토텔레스"), + ("인생은 자전거를 타는 것과 같다. 균형을 잡으려면 계속 움직여야 한다.", "알버트 아인슈타인"), + ("변화를 두려워하지 마라. 정체를 두려워하라.", "속담"), + ("좋은 습관은 평범한 사람을 비범하게 만든다.", "속담"), + ("포기하지 않는 한 실패한 것이 아니다.", "속담"), + ("가장 어두운 밤도 끝나고 해가 뜬다.", "빅토르 위고"), + ("당신의 시간은 한정되어 있다. 다른 사람의 삶을 사느라 낭비하지 마라.", "스티브 잡스"), + ("작은 발걸음이 큰 여정을 만든다.", "속담"), +] + + +def load_quotes(): + """Return the list of (quote, author) tuples, or empty list if unavailable.""" + return QUOTES + + +def pick_quote(quotes): + """Randomly select one (quote, author) tuple from `quotes`.""" + return random.choice(quotes) + + +def build_parser(): + parser = argparse.ArgumentParser( + prog="quote.py", + description="터미널 무작위 명언 출력 CLI", + ) + return parser + + +def main(): + parser = build_parser() + parser.parse_args() + + quotes = load_quotes() + if not quotes: + print("안내: 표시할 명언이 없습니다. 명언 목록이 비어 있습니다.", file=sys.stderr) + return + + text, author = pick_quote(quotes) + print(f'"{text}" — {author}') + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + print("\n중단됨") + sys.exit(130)