Library‎ > ‎Processing‎ > ‎

RainbowChallenge "ShortestRainbow"

 2年生の情報メディア基礎演習II、白井担当のProcessingを用いた「ゲームプログラミング」の考察課題のひとつとして課している「できるだけ短いコードで虹を描く」課題
(通称「チャレンジ」とでもしましょうか)。
 以下に解説を致します。

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

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


同様の結果を0923087 須藤くんのコードは6行で記述しています。
Processingではsetup,drawすら、必要でなければ書かなくて良い、という初期化を端折るテクニックを使っていますね。


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


 rectで描いていますね。noStrokeのOn/Offについても報告してくれました。
 このタイプは他に、0923066 櫻井くんもレポートしています。

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


 たしかにこういう解法もありますね!
 なぜか0923095 高橋君もそっくり同じコード。

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



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




さて、白井の回答例も載せておかなければなりませんね。
こんなかんじです(7行)。
行数的には重野くんの7行とタイです。



半透明を使って、本物に虹っぽくしてみました。
ちなみに虹って、赤が上だって知ってました?

みなさんもレインボーチャレンジ、してみてくださいね!
大変勉強になります。

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

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

こちらも別の作品


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

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

 map関数を使えばもっとスマートに書けそうな気がします。
 絵的に諦めるものを最小限にして、どこまで短いコードで表現力があるものがつくれるか。おもしろいです。

















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

鈴木君のコード(正味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);
     }
   }
}


■高橋君のコード(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); }
// でけた。赤系しかでないけど

Comments