RainbowChallenge "ShortestRainbow"

2年生の情報メディア基礎演習II、白井担当のProcessingを用いた「ゲームプログラミング」の考察課題のひとつとして課している「できるだけ短いコードで虹を描く」課題

(通称「レインボーチャレンジ」とでもしましょうか)。

以下に解説を致します。

★便宜上「;」を1行としてカウントしています。ただしfor文と代入は1行とみなします。

まず、0923086 鈴木くんの実装例です(7行)。setup, draw関数を使っていますが、関数名の行はカウント対象外としいています。

<以下ソースコードコピペ用>

鈴木君のコード(正味7行)

void setup() {

size(100,100);

colorMode(HSB,100);

}

void draw() {

noStroke();

for (int i=0; i<100; i++) {

for (int j=0; j<100; j++) {

stroke(i,100,100);

point(i,j);

}

}

}

■須藤くんのコード(6行)

noStroke();

colorMode(HSB,100);

for (int i=0; i<100; i++) {

for (int j=0; j<100; j++) {

stroke(i,100,100);

point(i,j);

}

}

■重野くんのコード(7行)

int a;

size (300,300);

colorMode(HSB,360,100,100);

noStroke();

for (a=0; a<30; a++) {

fill(a*10,80,100);

rect(a*10,0,10,300);

}

■白倉くん高橋くんのコード(13行)

size(100,60);

fill(255, 0,0);

rect(0,0,100,10);

fill(255, 255,0);

rect(0,10,100,10);

fill(255, 0,255);

rect(0,20,100,10);

fill(0,255, 0);

rect(0,30,100,10);

fill(0, 255, 255);

rect(0,40,100,10);

fill(0, 0, 255);

rect(0,50,100,10);

■塚田くんのコード(20行、if文内代入は1行扱い)

float x=0.0;

float y=0.0;

int r,g,b;

void setup() {

size(200,200);

noStroke();

smooth();

background(162,255,246);

}

void draw() {

for (int i=0; i<7; i++) {

if (i==0) {r=255;g=0;b=0;}

if (i==1) {r=255;g=125;b=0;}

if (i==2) {r=255;g=255;b=0;}

if (i==3) {r=0;g=255;b=0;}

if (i==4) {r=0;g=0;b=255;}

if (i==5) {r=0;g=0;b=125;}

if (i==6) {r=125;g=0;b=125;}

for(int a=270; a<360; a++) {

x = cos(radians(a))*(100+i*10);

y = 200+ (sin(radians(a))*(100+i*10));

fill(r,g,b);

ellipse(x,y,10,10);

}

}

}

同様の結果を0923087 須藤くんのコードは6行で記述しています。

Processingではsetup,drawすら、必要でなければ書かなくて良い、という初期化を端折るテクニックを使っていますね。

■0923073 重野くんのコード(7行)

rectで描いていますね。noStrokeのOn/Offについても報告してくれました。

このタイプは他に、0923066 櫻井くんもレポートしています。

■0923078 白倉くんのコード(13行)

■高橋君のコード(12行)

void setup(){

size(600,300);

colorMode(HSB,360,100,100);

noStroke();

int CircleSize = 600;

int Center = 300;

background(0,0,255);

for (int i=0; i<30; i++) {

fill (i*10,100,100);

ellipse(Center,Center,CircleSize,CircleSize);

CircleSize=CircleSize-10;

}

}

void draw() {

ellipse(300,300,300,300);

fill(0,0,255);

}

■白井の解答例(7行)

float x,y;

noStroke(); smooth();

colorMode(HSB,100);

for(int a=80; a>30; a-=5) {

fill(map(a,80,30,10,100),100,100,10);

ellipse(0,100,10+a*3,10+a*3);

}

From Twitter by @sc_ks

size(300,200); for(int i=0;i<90;i++){ stroke(255-sin(radians(i))*255,255-cos(radians(i))*255,255); ellipse(150,200, 300-i,300-i); }//蒟蒻?

size(300,300); strokeWeight(10); for(int i=0;i<50;i+=10){ stroke(255-i,255-i*5,255-i*9); ellipse(0,300,400-i*2,400-i*2); }

// でけた。赤系しかでないけど

たしかにこういう解法もありますね!

なぜか0923095 高橋君もそっくり同じコード。

0923103の塚田くんはついに円弧にチャレンジ。20行にはなりましたがなかなか頑張っています。

0934094 高橋くんは、千葉商科大学 政策情報学部 田所先生による 人工言語入門 第3回Processing入門II PDF 33ページを参考にしたとのこと。12行。

http://idisk.mac.com/tadokoroatsushi/Public/proga09/proga_0427.pdf

さて、白井の回答例も載せておかなければなりませんね。

こんなかんじです(7行)。

行数的には重野くんの7行とタイです。

半透明を使って、本物に虹っぽくしてみました。

ちなみに虹って、赤が上だって知ってました?

みなさんもレインボーチャレンジ、してみてくださいね!

大変勉強になります。

【追加】

何故か外口さんがTwitterで挑戦してくれています。

なんと140文字以下、5行です。

こちらも別の作品

本当に140文字以下、4行です。

なんかすごいことになってきたな。

map関数を使えばもっとスマートに書けそうな気がします。

絵的に諦めるものを最小限にして、どこまで短いコードで表現力があるものがつくれるか。おもしろいです。