シャニマスのストレイライトの3週目Pssrには思い出アピールの演出にプログラムのコードが書かれています。この記事では有志が解読したコードをPythonで再現しつつ解説しようと思います。なお筆者はc言語の知識がほとんどない、Pythonも勉強中なので間違った解説をしてしまう可能性がある点をご了承ください。
1.和泉愛依の演出のプログラム
まずは和泉愛依の思い出演出時に表示されるコードを見てみましょう。
#include <stdio.h> int main(void){puts("Hello, world!");}
和泉愛依のプログラムは「Hello, world!」と表示する単純明快なプログラムとなっています。
明るく人当たりの良い和泉愛依らしいプログラムとなっていると感じられますね。
こちらのコードをPythonで表現すると次のようになります。
print("Hello, world!")
この1行だけで「Hello, world!」と表示できます。非常に簡単なプログラムなので初心者の人もぜひやってみてほしいです。
2.芹沢あさひの演出のプログラム
次は芹沢あさひのプログラムを見てみましょう。先ほどと同じように演出時のプログラムをまず確認してみます。
#include <stdio.h> int main(void){int i;for(i=0;i<22;++i){printf("Hello! %d/n",i);if(i==16) break;}return 0;}
芹沢あさひのプログラムは17回「Hello!」と表示するプログラムとなっています。ただこのプログラムにはc言語に疎い筆者でも気になる点がいくつかあります。
まず1つは改行、スペースをほとんど使っていないことです。コードを書くときは自分が見直しをしやすいように改行、空白を入れることがあるのですが、芹沢あさひのコードにはそれらがほとんどありません。このくらいの長さなら1行でも読めなくはないですが改行等を使わないのはあさひの自由奔放さを表しているのかもしれないですね。
2つ目はprintf(“Hello! %d/n”,i)の「/n」の部分です。プログラムでは改行をするときに「\n」とコードに入力して改行することがありますが芹沢あさひのコードでは「/n」と書かれていまう。このコードのままだと出力時に改行が行われず「Hello!」が表示されるようになります。これに関しては動画から読み取るのが難しく「/n」と「\n」の判別が難しかった、あさひがコードを書くときに間違えた、あえてそのように表現した、運営側がただ単純に間違えたなどが考えられます。
なおPythonで表現するときはこの部分を修正して改行して表示するようにします。
3つ目は17回「Hello!」を表示するのに繰り返す回数は23回にしているところです。これに関してはアイドル23人を表現している、ストレイライト、ノクチル以外のアイドル16人とプロデューサーに挨拶しているのを表現しているのではないかと一部の芹沢あさひの有識者に言われています。
ではこちらのコードをPythonで表現してみます。
i = 0
for i in range(22):
print("Hello! " + str(i))
if i == 16:
break
まずPythonでは繰り返しを表現するfor文などをつかうためにはインデント(行頭に空白を入れて字下げをする)が必要なのであさひのようなコード表現はかなり難しいと思います。
range関数は指定した数値の数だけ足していく関数です。指定しなければ最初は0から開始します。あさひのコードの (i=0;i<22;++i) 部分にあたりますね。
print文のstr(i)はPythonで文字列を連結するときは文字列同士で連結する必要があるので数値のiを文字列として扱うために書いてあります。
if文の解説はこの後の黛冬優子のプログラムの時に解説します。
3.黛冬優子の演出のプログラム
最後に黛冬優子のプログラムを見てみましょう。他の2人と比べてかなり長くなっています。
#include <stdio.h>
int main(void) {
for (int i = 0; i < 8; i++) {
for (int x = 0; x < 20; x++) {
int d = x -10;
if (d <= 0) {
d *= -1;
}
char c = '\0';
if (d <= i) {
c = '*';
}
printf("%c", c);
}
printf("\n");
}
for (int i = 0; i < 2; i++) {
for (int x = 0; x < 18; x++) {
char c = '\0';
if ((x == 10) || (x == 11)) {
c = '*';
}
printf("%c", c);
}
printf("\n");
}
printf("Merry Christmas");
return 0;
}
前の2人と比べるとかなり長くなりましたね。c言語特有の表現などがいくつかあり、c言語に疎い筆者ではうまく説明できない所が多々あるので今回はPythonで表現してから説明します。ではPythonで表現してみましょう。
i = 0
x = 0
for i in range(8):
for x in range(20):
d = x -10
if d <= 0:
d *= -1
if d <= i:
print("*", end = "")
else:
print(" ", end = "")
print("")
for i in range(2):
for x in range(18):
if x == 10 or x == 11:
print("*", end = "")
else:
print(" ",end = "")
print("")
print("Merry Christmas")
結構な長さになりましたね。これだけみても何をしているのか分かりづらいのでまずif文についてまず説明しようと思います。
if文について
if文は指定した条件が真の場合はAの処理を行い、偽の場合はBの処理を行うという条件分岐を行うものです。ストレイライトの3人の年齢を例にして説明します。
a =input("年齢を入力してください")
old = int(a)
if old == 14:
print("あなたはあさひです")
このような条件の場合は14以外の入力の場合は何も起きず14が入力されたときは「あなたはあさひです」と表示されます。次にelseを追加した処理の例を説明します。
old = 18
if old == 14:
print("あなたはあさひです")
else:
print("あなたは愛依です")
elseは条件が偽の時に処理を実行します。このプログラムではoldの値が14の時は「あなたはあさひです」と表示し、それ以外の時は「あなたは愛依です」と表示されます。
このプログラムではoldの値を18にしていますが、1,5,19,23などの数値でも「あなたは愛依です」と表示されます。次はelif(else if)を追加した処理の説明をします。
old = 19
if old == 14:
print("あなたはあさひです")
elif old == 19:
print("あなたは冬優子です")
else:
print("あなたは愛依です")
elifはifの条件が偽だったときに条件分岐をし、elifの条件が真の場合に処理を実行します。elifの条件も偽の場合はelseの処理を実行します。このプログラムではoldが14のときは「あなたはあさひです」と表示し、19のときは「あなたは冬優子です」と表示、それ以外の時は「あなたは愛依です」と表示されます。このプログラムではoldを19としていますので「あなたは冬優子です」と表示されます。if文について勉強したところで冬優子のプログラムを見直してみましょう。
冬優子のプログラムについて
冬優子のプログラムはある処理を繰り返す処理を繰り返すという多重ループと呼ばれるものになっています。まずは
for i in range(8):
for x in range(20):
d = x -10
if d <= 0:
d *= -1
if d <= i:
print("*", end = "")
else:
print(" ", end = "")
print("")
の部分の処理を見ていきましょう。ここではまずiに0を代入し次にxに0を代入します。
i = 0
x = 0
次に d = x – 10 の式を計算します。今回はxは0なのでd = 0 – 10 = -10になりますね。次はifで条件分岐をします。今回の条件はd <= 0 つまり0以下の時は真になります。今回はdの値は-10なので真になります。なのでd *= -1の処理を実行します。この処理はdの値に-1を掛ける処理です。これでdの値は10になります。
次の処理はif文で条件はd <= iですね。これはiの値がdの値以上の時、真になります。今回はiの値は0,dの値は10なので偽になります。なのでelseの処理の「半角スペースを出力する」を実行します。
これらの処理が終了したらxの値を1増加させ、d = x -10からprint(“”)までの処理を再度行います。これをxの値が19になるまで繰り返します。そしてxの値が19になるまで繰り返しprint(“”)までの処理を終えたら、iの値を1増加させxの値を0にします。この処理をxの値が7になるまで繰り返します。そしてxの値が7になり最後まで処理を終えたらこのループから抜け出し終了します。
この説明を聞いてもどうなるのかわからない人も多いと思いますので、この部分のプログラムを実際に動かしたときの出力結果をお見せします。
*
***
*****
*******
*********
***********
*************
***************
このような「*」の山が出来上がります。察しの良い人はこの時点で気づくかもしれませんが冬優子のプログラムの続きを見てみましょう。
for i in range(2):
for x in range(18):
if x == 10 or x == 11:
print("*", end = "")
else:
print(" ",end = "")
print("")
こちらも先ほどと同じように繰り返し処理を行います。これではxの値が10のときと11のときに*を出力それ以外の値の時は半角スペースを出力します。では冬優子のプログラム全体を実行したときの出力結果はどうなるでしょうか。結果はこのようになります。
*
***
*****
*******
*********
***********
*************
***************
**
**
Merry Christmas
このようにクリスマスツリーとMerry Christmasのメッセージを添えた出力がされます。
3週目の冬優子が実装された時期はクリスマスの時期でした。283プロの皆に少しでもクリスマスを楽しんでもらうための冬優子の優しさのようにも感じ取れますね。
ストレイライトは度々プログラミングに関するものがコミュタイトルなどであったりします。今回の記事でシャニマス、ストレイライト、プログラミングどれでもいいので興味を持っていただけたら幸いです。
今回はこれで終了です。今回のサンプルを用意したので、もし必要な場合は上の「Open in Colab」と書いてあるボタンをクリックしてください。なおそのままだと編集不可なので編集をしたい場合は「ドライブにコピー」をクリックしてコピーしてください。
なおGoogleColaboratoryについてわからなかったらGoogleColaboratoryを使ってみよう_導入編をご覧ください。
プログラミングに明るくないながらも気になっていたので助かりました。
ありがとう御座います!