조건제시법과 원소나열법

beginxyz ; Z = z+15 집합 { x*x+0.09*Z*Z <50 && abs(y)<10 ; 8 } 집합 { y*y+0.09*Z*Z <50 && abs(x)<10 ; 9 } 집합 { 정(0,0,1,8) && z<10 ; 16 } // ; 8과 ; 9를 모두 0 으로 바꾸면 개선문 탑 // 수학적 좌표조건식과 정직구원체 LEGO 블럭

이 곳 내용은 약간 어렵습니다. 아래 게시판의 내용을 먼저 읽으세요 !  컴퓨팅 사고력 역량  ==  Abstraction (추상화) Automation (자동화)

마인크래프트의 3차원 환경을 닮은 터틀크래프트 (TurtleCraft) 에서는 마우스 클릭과 키보드 코딩명령으로 블럭을 만들며 LEGO 레고 블럭으로 만들기를 하는 것처럼 코딩놀이를 합니다. 블럭을 만들 때, 블럭 하나하나를 만들어 붙히는 것을 수학 용어로 집합의 원소나열법이라고 합니다. 이 때, MIT 패펄트의 LOGO 거북명령 등이 쓰입니다 (참고로 LOGO 에서 스크래치 언어가 나왔으며 LEGO 회사의 연구지원을 받았습니다). 또 다른 방법이 주어진 조건식을 만족하는 모든 원소들의 해집합으로 만드는 것인데, 수학 용어로 집합의 조건제시법이라고 부릅니다. 집합과 논리 원소나열법 조건제시법은 현재 고등학교 1학년 수학에 나오지만, 2010년도 초반까지 중학교 1학년 수학의 집합과 자연수 단원에 나왔습니다. 집합과 논리는 절대로 고등학교때 배울 내용이 아닙니다. 집합과 논리의 개념은 초등학교 저학년부터 익혀야할 내용이며,  터틀크래프트는 집합과 논리 그리고 예전 고등학교 수학 내용이던 알고리즘과 순서도에 바탕하여, 초등 및 중등 창의코딩, 코딩과 수학의 융합인 코딩수학 교육과정을 지향합니다 ! 

아래의 [beginxyz] 단추를 먼저 누르고, 이어서 [실행] 단추를 누르세요. 

doitsxyz // SXYZ 거북 행동문자 약속 doit( 8S X 8S X 8S X 8S X ) // 8번 S하고 왼쪽 회전 X 반복 // 반복 4 { doit( 8S X ) } beginxyz ; // 조건제시법 beginxyz 시작 집합 { 정(9,11,1,6-z) ; 9 } // 각 층에 중심과 반지름 만듦

컴퓨팅 사고력 automation  ==  알고리즘 코딩 == 실행 속도 개선      그림의 영역을 sqrt, nemo, abs(z) 등으로 조건을 주어 속도를 개선

beginxyz 아래에 쓰인 조건제시법 명령의 경우에, 터틀크래프트에 있는 약 280만개의 좌표를 하나하나 조건식에 대입하여 답이 되는지 (해집합의 원소가 되는지?) 확인을 하게 됩니다.  따라서 실행 시간이 많이 걸립니다. 이 때, 속도를 개선시키는 방법이 무엇일까요? 코딩교육의 목표인 컴퓨팅 사고력 역량 키우기에서, 틀린 코드를 찾아내는 디버깅 (debugging) 역량과 알고리즘을 구조화하여 속도를 개선시키는 역량이 중요합니다. 코드는 위에서 아래로 순차구조로 실행이 되기에, 해집합에 속하지 않는 좌표들을 빨리 포기하려면, beginxyz 명령 가까운 곳에 그 좌표는 아니다라고 말할 수 있어야합니다. 이 때, 해집합이 그려지는 영역을 살펴서 판단하면 좋습니다. 영역에는 어떤 반지름 원 안에 그려졌는지? 아니면 어떤 정사각형 안에 그려지는지? 또는 어떤 높이 밖에는 그려지지 않는다! 등의 조건입니다. 예를 들어, 조건제시법으로 위의 코드에서 만들어지는 피라미드는 지하의 세계와 12층 이상에는 그려지지 않기에, 또한 중심 좌표에서 가로 세로 15  밖에는 그려지지 않기에 이렇게 명령을 첨가하면 속도가 개선됩니다.

beginxyz;

if( z<0 || z>11 ||    (z != 0  &&  nemo(x,y)>15)     ) return 0         

여기서, and 와 or 논리가 사용됩니다. 많은 코딩 언어에서는 and 와 or 를 각각 && 와 || 기호로 나타냅니다. 또한 같지 않다는 것을 != 기호로 나타냅니다. 위에서 (z!=0 && nemo(x,y)>15) 는 0 층이 아니면서 가로 세로가 15 보다 큰 곳에는 파리미드의 블럭 원소가 없으니 (return 0 라는 말은 한마디로 그 곳은 꽝이다! 라는 말) 빨리 다른 좌표를 찾으라는 것입니다. nemo 외에 sqrt(x,y) 가 있는데, 이것은 x*x+y*y 값의 제곱근입니다. 참고로, nemo 네모 길이를 (9,11) 에서 재는 조건인 nemo(x-9,y-11)>5 표현을 쓰면 더 실행속도가 빨라집니다. 

 

컴퓨팅 사고력 abstraction  ==  수학적 표현 == 추상화 통한 자동화    정직구원체 LEGO 블럭 명령을 쓰거나 수식표현으로 조건제시법 만듦 

마인크래프트의 3차원 좌표 방식은 우리 수학교과서의 좌표 방식과 다릅니다. 컴퓨터 그래픽스 분야에서는 위로 올라가는 축을 y 축으로 하는데, 우리 수학에서는 그 축을 z 축으로 합니다. 아래는 마인크래프트에서의 y 축과 z 축의 방향입니다. 마인크래프트 좌표는 코딩수학에 문제가 있기에, 우리는 수학좌표를 쓰는 터틀크래프트로 코딩수학을 접근합니다.   

좌표계를 다루는 개념이 저학년 학생에게 어려울 수 있습니다. 특별히 회전변환과 좌표축 변환 그리고 늘리고 줄이는 확대 변환은 고등수학 개념으로 표현되기에 어렵습니다. 이 때, 스토리텔링 기반의 스토리코딩으로 저학년도 접근할 수 있습니다. 좌표계를 내 관점에서 레고 장난감 돌리듯이 돌리고 뒤집고, 또한 고무판이나 찰흙판 처럼 한쪽을 늘리는 은유로 접근할 수 있습니다. z=0.5*z 같은 표현은 이미 그려진 좌표 모눈종이를 z축으로 2배 늘리는 명령으로, 이렇게 직사각 모양으로 모눈 종이가 늘어나면 본래 20층인 곳의 위치가 10층 위치로 바뀌게 됩니다. 컴퓨팅 사고력의 추상화 역량은 추상적인 수학적 표현과 마찬가지로 저학년 학생에게 어려울 수 있습니다. 이 것을 MIT 패펄트 교수의 거북수학 정신과 스토리텔링 은유로 추상화에 접근할 수 있습니다. 하바드 대학의 브루너 (Bruner) 는 "any subject can be taught in some intellectually honest form to any child at any stage of development" 라는 주장과 나선형 교육과정으로 유명합니다. 3차원 코딩은 터틀크래프트의 나선형 교육과정  접근을 따라 저학년 학생도 3차원 좌표와 변환으로 프랑스 파리를 만드는 창의 작품에 도전해 봅니다 (로마 건축물은 다른 곳에 설명 됨)을 만듭니다. 아래 [beginxyz] 단추를 누르고, 이어서 [실행] 단추를 누르세요.

beginxyz ; z=(1/3)*z // z축 방향으로 양쪽에서 당겨서 3배 늘림 집합 { x*x+(z+5)*(z+5) <55 && z>0 && abs(y)<10 ; 0 } 집합 { y*y+(z+5)*(z+5) <50 && z>0 && abs(x)<10 ; 0 } // 0 번 블럭으로 z>0 위에만 터널 구멍이 나도록 함 z=3*z // 원래의 상태로 돌려 놓음 집합 { 정(0,0,1,8) && z<10 ; 9 }

위의 코드는 양쪽에서 출입할 수 있는 개선문과 같은 구조를 만듭니다. 저 아래에서는 에펠탑을 만들 것 입니다. 여기 코딩에서 핵심 아이디어는 z=(1/3)*z 과 같은 표현으로, 이 것은 모눈이 그려진 z 축을 양쪽으로 잡아 당겨서 3배로 늘어난 모눈 종이를 만들라는 것입니다. 그렇게 되면 10 이라고 쓰인 모눈 종이에 본래 30층 있던 것이 오게 됩니다. 이렇게 고무판 좌표계를 늘리고 줄이는 스토리텔링 기반 story-coding 으로 원의 방정식으로 타원을 만들 수 있습니다. 정직구원은 x-y 축을 기반으로 만들기에, z축 방향으로 서 있는 원을 만들기 어렵습니다. 이 때, 위와 같이 z 축을 늘린 후, 원의 방정식으로 타원을 만들거나, 또는 원의 방정식 수식이 어려운 저학년 학생은 먼저 구를 늘려서 3차원 타원체를 만들고 이 것을 절단시켜 타원을 만들 수 있습니다. 예를 들어, 에펠탑을 생각하면, 양쪽으로 올라가는 곡선의 모양이 타원 4조각의 한 부분과 모양이 비슷합니다. z 축 방향으로 5배 늘리는 아래의 명령을 보세요.

      z =  0.2 * z
      집합{  구(10,0,10,9)  &&  z<=10 &&  abs(y)<0.1 ; 8 }

여기서, 구(10,0,10,9) 를 만들면 z=0.2*z 영향으로 z 축으로 5배 늘어난 타원체가 됩니다. 이 것은 z<=10 과  abs(y)<1 조건으로 단면이 생성되고,  그 모양이 타원의 일부분이 됩니다. 아래의 그림과 명령을 비교하세요.

이 화면은 아래 코드에서 8을 0으로 바꾸어 골격만 나오게 한 것입니다.

beginxyz ; if( z<0 || nemo(x,y) > 20 || z>50 ) return 0 집합 { 구( 0,0,48, 2 ) ; 6 } z=0.2*z 집합{ 구(10,0,10,9) && z<=10 && abs(y)<1 ; 8 } 집합{ 구(10,0,10,10) && z<=10 && abs(y)<1 ; 9 } z=5*z 집합 { abs(x)+abs(y)<=4 && (z==15 || z==16) ; 8 } 집합 { abs(x)+abs(y)<=7 && z<=9 && z>=7 ; 9 }

조건제시법과 원소나열법 코딩의 융합 ( 컴퓨팅 사고력 기반 창의코딩 )   

조건제시법은 방정식과 부등식 등으로 조건의 수식을 직접 쓰거나, 또는 정직구원체 LEGO 블럭과 같은 명령으로 쓸 수가 있습니다. 창의적인 코딩에서는 beginxyz 아래의 조건제시법 코드를 [beginxyz] 단추로 만들고, beginxyz 위에 쓰인 원소나열법 명령을  [실행] 단추로 융합시켜 만들 수 있습니다.  예를 들어, 터북이랜드의 거북성에 예쁜 탑을 세워봅니다 (마인크래프트의 주인공이 스티브인 것 처럼, 터틀크래프트의 주인공을 터북이라고 부르며, 터북이는 닌자옷을 입은 거북에게 명령) . 아래 코드는 조건제시법과 원소나열법이 융합된 것입니다. 실행시켜 보세요.

doitsxyz ; goto(-4,3,1) 반복 2 { doit( Suu ZZZ sddt S X ) doit( SY SSX 5SX SSY S X ) } goto(0,2,6,3) ; doit( s ; 0 ) beginxyz; 집합{원(0,15,1,7) && z<15} ; 집합 { 원(0,15,14,6) && z<20; 5} 집합{원(0,15,20,5) && z<24; z-19} ;집합{ 원(0,15,24,29-z) ;16} 집합 {원(0,15,30,35-z) ; 6 } ; 집합 { 구(0,15,30,5) && z<30 ; 6 } 집합 {직(0,15,35,0,0) && z<41; 15 } 집합 {직(0,15,38,1,0) && z<39; 15 }

위의 코드에서, doitsxyz 및 doit 명령은 초등 및 중등 창의코딩에 설명이 있으니 참고하세요. 또한 반복 명령도 다른 게시판을 참고하세요. 이 코드에서 중요한 것은 집합 안에 쓰인 z 층의 변수를 통해 반지름이 다른 다양한 원들을 쌓아서 이런 탑을 만들었다는 것입니다. 3차원 구도 실제로는 2차원 원을 쌓은 것입니다. 마지막에 쓰인 직사각형 만드는 직 명령으로는 탑 위의 십자가 모양을 만들었습니다. 이런 십자가는 beginxyz 웨에서 원소 나열법으로 쉽게 만들 수도 있습니다. 원소나열법에는 doit 거북명령 외에도, 행렬 배열을 사용하는 do 벡터 dovt 명령과, 주어진 좌표 (a,b,c) 에 블럭을 만드는 cube(a,b,c) 명령 등을 통해 만들 수 있습니다.