# 3버전 스타일 print 함수 사용
from __future__ import print_function

"""
Explanation: 반복과 제어
이성주 (c) 2015
End of explanation
"""


print([1,2,3])

for n in [1,2,3]:
    print(n)

"""
Explanation: for
End of explanation
"""


for n in [1,2,3]:
    print(n)
     print(n)

for key in {'name': '이성주', 'email':'seongjoo@codebasic'}:
    print(key)

profile = {'name': '이성주', 'email':'seongjoo@codebasic'}
profile.items()

for key, value in profile.items():
    print(key, value)

for c in 'python':
    print(c, end=':::')

"""
Explanation: 들여쓰기는 문법
End of explanation
"""


nums_square = []
for n in [1,2,3,4,5]:
    nums_square.append(n**2)
print(nums_square)

"""
Explanation: 들여쓰기와 스코프
End of explanation
"""


nums_square = [n**2 for n in [1,2,3,4,5]]
print(nums_square)

"""
Explanation: 내장리스트 (list comprehension)
리스트 내에서 반복문 실행
End of explanation
"""


range(10)

# 3 버전
list(range(10)) 

range(2,11)

range(1,11,2)

"""
Explanation: 숫자 리스트 생성 함수
End of explanation
"""


for x in range(3):
    print('참 잘했어요!')

"""
Explanation: 특정 횟수 반복
End of explanation
"""


it = enumerate('abc')
it.next()

it.next()

for i, x in enumerate(range(3)):
    print i+1, '참 잘했어요!'

profile = {'name':'이성주', 'email': 'seongjoo@codebasic.co'}
for k,v in profile.items():
    print(k,v)

"""
Explanation: 인덱스가 필요한 경우
End of explanation
"""


x=1
while x < 3:
    print(x)
    x += 1

isTrueLove = True
while isTrueLove:
    print("I love you")
    break

"""
Explanation: while
End of explanation
"""


# 52장 카드 덱 생성
suits = ['Heart', 'Diamond', 'Clover', 'Spade']
ranks = range(2,11)+['J', 'Q', 'K', 'A']
deck = []
for s in suits:
    for r in ranks:
        card = s + str(r)
        deck.append(card)

# 각 문양별로 한 줄씩 출력
previous_suit = ''
for card in deck:
    # 카드의 문양을 뽑는다.
    suit = card[0]
    # 같은 문양이면 같은 줄로 출력
    if suit == 'H':
        suit_collection[0].append(card)
    elif suit == 'D':
        suit_collection[1].append(card)
    elif suit == 'C':
        suit_collection[2].append(card)
    elif suit == 'S':
        suit_collection[3].append(card)
    else:
        print('그런 문양은 없어요!')
    
for suits in suit_collection:
    for card in suits:
        print(card, end=', ')
    print('\n')

deck = [[s,r] for s in ['Heart', 'Diamond', 'Spade', 'Clover'] for r in range(2,11)+['J','Q','K', 'A']]
len(deck)

"""
Explanation: 도전과제
포커 카드는 52장이다. 각 카드는 문양(suit)와 숫자(rank)로 이루어진다. 문양은 Diamond, Heart, Spade, Clover 4 종류이고, 숫자는 2, 3, … , 9, 10, J, Q, K, A의 13개의 값이다. 52장의 포커 카드를 생성해 변수 deck에 저장하시오.
예: ‘Diamond 3’, ‘Heart Q’
a. 각 포커 카드의 정보를 문자열 형태로 저장하시오. 
b. 각 포커 카드 정보를 리스트 자료 구조로 저장하시오. 예: [‘Diamond’, 3], [‘Heart’, ‘Q’]
c. 한 줄의 구문으로 전체 포커 카드를 생성하시오.
d. 같은 문양은 같은 줄로 출력해 총 네 줄로 전체 카드를 출력하시오.
End of explanation
"""


import random
total = 0
count = 0
while total < 100:
    face = random.randint(1,6)
    total += face
    count += 1

print(count)

"""
Explanation: 도전과제
6면 주사위는 1부터 6까지의 값을 갖는다. 주사위를 굴릴 때 나온 윗면의 숫자의 누적 합계를 구한다. 누적 합계가 100 이상이 될 때까지 몇 번을 던졌는지를 표시하는 프로그램을 작성한다. [a, b] 구간에서 무작위 숫자를 구하는 구문은 다음과 같다.
import random
# 0 이상 1 이하의 무작위 정수 생성
n = random.randint(0, 1)
End of explanation
"""


x = 10
if x < 5:
    fruit = 'banana'
else:
    fruit = 'apple'

print(fruit)

hour = 13
greeting = 'Good'
if 5 < hour < 12:
    # 아침인사
    greeting += ' morning'
elif 12 <= hour < 18:
    greeting += ' afternoon'
else:
    greeting += ' night!'

print(greeting)

if 'a':
    print('hi')

"""
Explanation: 제어
End of explanation
"""


# 숫자 생성
N = 20
for n in range(1,N):
    # 숫자에 3 또는 6 또는 9가 있는지 확인
    if '3' in str(n)or '6' in str(n)or '9' in str(n):
        print('짝!', end=' ')
        continue
    print(n, end=' ')

False or 6

"""
Explanation: 도전과제
3-6-9 게임
1부터 시작해 1씩 숫자가 증가한다. 숫자에 3,6,9가 하나 이상 있으면 숫자 대신 '짝!'을 출력한다.
출력 예시: 1 2 짝! 4 5 짝! 7 8 짝!
End of explanation
"""


float(1/2)

3/2

students = [{'name': '이성주', 
             'scores': [75, 85, 92]},
            {'name': '서희정', 
             'scores': [85, 95, 99]}
           ]

# 각 학생의 평균 점수 구하기
for s in students:
    avg = float(sum(s['scores']))/len(s['scores'])
    print(s['name']+ " 평균: " + str(avg))
    
# 각 과목의 평균 점수
subjects = [[],[],[]]
for s in students:
    subjects[0].append(s['scores'][0])
    subjects[1].append(s['scores'][1])
    subjects[2].append(s['scores'][2])
    
print(subjects)
for sub in subjects:
    print(sum(sub)/len(sub))

"""
Explanation: 도전과제
10 이하의 3 또는 5의 배수는 3, 5, 6, 9이다. 이 숫자들의 합은 23이다. 1000 이하 3 또는 5의 배수의 합을 구하라.
도전과제
각 학생 정보는 이름, 세 과목의 점수로 이루어진다. 세 명 학생의 정보를 저장한다.


각 학생의 평균 점수를 구하라.


각 과목의 평균 점수를 구하라.
End of explanation
"""


# 일단 ... 회문 숫자를 검색하는 방법부터 마련해 보자
pn_list = []
for n1 in range(100,1000):
    for n2 in range(100, 1000):
        n = n1*n2
        # Q:회문 숫자인가?
        # A: 유한별
        n_str = str(n)
        if n_str[::-1] == n_str:
            # 회문 숫자면 추가
            pn_list.append(n)

# 추가된 회문 숫자의 최대값
print(max(pn_list))

"""
Explanation: 도전과제
13195를 소수 분해하면, 5, 7, 13, 29이다. 600851475143를 소수분해했을 때 가장 큰 숫자는 무엇인가?
도전과제
1001, 2002, 3003과 같은 숫자를 회문 숫자 (palindromic number)라고 한다. 두 개의 두 자리 숫자의 곱으로 만들 수 있는 가장 큰 숫자는 9009 = 91 × 99이다. 
두 개의 세 자리 숫자의 곱으로 만들 수 있는 가장 큰 회문 숫자를 찾아라.
End of explanation
"""


