프로그래밍 향상 강좌 4: 픽셀 로직

프로그래밍 향상 강좌의 4회째입니다.

픽셀 로직을 소재로
프로그램을 생각해 봅시다.

해설 동영상은 이쪽



픽셀 로직이란?



픽셀 로직을 아십니까?

꽤 오래된 게임에서
한 적이있는 사람도 많지 않을까.

일단 규칙은
종횡 수치의 수만큼 매스를 검게 바르는 게임.

숫자만큼 연속적으로 그려집니다.
수치가 나누어지는 곳은
최소한 1칸 이상 흰 송어가 있다.

모든 송어를 바르게 바르면
그림이 완성된다.

예를 들어 5 x 5 질량 문제로 한 줄의 숫자가
2 2라면 ■■□■■라는 바람이 된다.

수치대로 송어를 바르면
좋은 것입니다.

초급편 : 채워진 매스의 체크 함수 만들기



한 줄에 채워진 송어가 몇 칸인지 계산하십시오.
수치를 출력하는 함수 check_row 를 작성해 봅시다.

일러스트 로직처럼 하얀 매스가 사이에 오면 수치를 나누는 것.

출력은 수치의 리스트형
check_row(行のデータ):
    return 数値のリスト

예:
check_row('□■□■□■□')

1 1 1

중급편:



이미지에서 일러스트 로직 문제를 만드는 프로그램을 생각해 봅시다.

화상의 입력 데이터는 흑백 매스를 문자열 요소로 한리스트 형으로한다.
입력 데이터는 N 매스 x N 매스의 정사각형입니다.

아래와 같은 이미지 데이터의 경우
data = [
'□□■■■■□□',
'□■■□□■■□',
'■■□□□□■■',
'■■■■■■■■',
'■■□□□□□□',
'■■□□□□■■',
'□■■□□■■□',
'□□■■■■□□']

N = 8

출력 예는



해답편



초급편의 해답



1개씩 처음부터 검은 매스의 개수를 세어 간다.

검은 송어가 계속되면 +1
흰색 송어가 왔을 때, 앞이 검은 송어라면 숫자를 기록합니다.
마지막 매스가 검은 매스라면 수치를 기록.
□■■■■□□□ 4□■■■■□□■ 4 1
# 黒マスが何個あるかをチェックする
def check_row(row):
    res,checked,count = [],0,0
    while True:
        if row[checked]=='■':
            count+=1
        elif count!=0:
            res.append(count)
            count=0
        checked+=1
        if checked==len(row):
            if count!=0:
                res.append(count)
            break
    return res

check_row('□□□■□■■■□□■■■■■■■□□□')

[1, 3, 7]

중급편 해답



행 방향과 열 방향으로 나누어 검은 매스의 세기 결과를 내놓는다.

출력하는 것을 생각하는 경우
먼저 열 방향의 수치를 내보내고 나중에 행 방향의 수치를 내보낸다.

연결된 것을 문자열로 출력 (탭 구분)
data = [
'□□■■■■□□',
'□■■□□■■□',
'■■□□□□■■',
'■■■■■■■■',
'■■□□□□□□',
'■■□□□□■■',
'□■■□□■■□',
'□□■■■■□□']

N = len(data)

# 黒マスが何個あるかをチェックする
def check_row(row):
    res,checked,count = [],0,0
    while True:
        if row[checked]=='■':
            count+=1
        elif count!=0:
            res.append(count)
            count=0
        checked+=1
        if checked==len(row):
            if count!=0:
                res.append(count)
            break
    return res

# 行列の結果を格納する
result1,result2 = [],[]

# row方向
for row in data:
    tmp = check_row(row)
    result1.append(tmp)

# 列方向
for x in range(N):
    col = []
    for y in range(N):
        col.append(data[y][x])
    tmp = check_row(col)
    result2.append(tmp)

# 出力用の関数を作る
def make_num_data(res1,res2,num):
    row_len = max([len(r) for r in res1])
    col_len = max([len(c) for c in res2])
    row_num = row_len + num
    res_data = []

    # 先に列方向の出力データを作る
    for c in range(col_len):
        tmp = [' '] * row_len
        for x in range(num):
            if len(res2[x])-1>=c:
                tmp+=[str(res2[x][c])]
            else:
                tmp+= [' '] 
        res_data.append(tmp)

    # 行方向のデータをつなげる
    for n in range(num):
        tmp = []
        for r in range(row_num):
            if len(res1[n])-1>=r:
                tmp+=[str(res1[n][r])]
            else:
                tmp+= [' ']
        res_data.append(tmp)
    return res_data

# 出力用のデータを作成する
d = make_num_data(result1,result2,N)

# 出力
for y in d:
    print('\t'.join(y))

         

상급편



일러스트 로직을 푸는 프로그램을 만드십시오.

자신은 시간이 없기 때문에, 수상했습니다 www.

한가한 분은 꼭 도전해 보세요.

요약



일러스트 로직은 문제를 만드는 곳과
문제를 해결할 때 두 가지 묘미가 있습니다.

문제를 해결하려면 효율적인 검색 프로그램을 작성하지 않으면
매스 눈이 커지면 풀 수 없게되어 버리기 때문에
구현에는 시간이 걸리지 않을까라고 생각했습니다.

시간이 생기면 도전하고 싶네요.

그럼.

저자 정보



을py의 HP :
h tp // w w. 오츠 py. 네 t/

Youtube:
htps //w w. 요츠베. 코 m / 찬 l / 우카 T7x ぺq8 1G_HcJ

Twitter:
htps : // 라고 해서 r. 코 m / 오츠 py 텐

좋은 웹페이지 즐겨찾기