Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions dday.py
Original file line number Diff line number Diff line change
@@ -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)
79 changes: 79 additions & 0 deletions quote.py
Original file line number Diff line number Diff line change
@@ -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)
Loading