프로그래밍 향상 강좌 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 텐
Reference
이 문제에 관하여(프로그래밍 향상 강좌 4: 픽셀 로직), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/otupy/items/91633c1c93a1c0c6dc12텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)