Googleクラスルーム
GeoGebraGeoGebra Classroom

mapをやろう

リストからリストへ写像して作ろう

プログラミングの鍵は条件分岐

このワークシートはMath by Codeの一部です。 <mapをやろう> 前回の関数型プログラミングの導入では、 反復のfor条件を手続き型から宣言型に移 し替えることを学んだね。 「n for n in 数の範囲」で数nの「リスト」ができた。geogebraではSequenceコマンドとして作れた。 「2*n+1 for n in 数の範囲」で数nの式を作ると、奇数の「リスト」が作れる。 関数型プログラミングでは もちろん、 sum(リスト)とすれば、リストの数値の合計が出せる。 find(リスト, "a")などでリストから要素の位置を求めたり、 concat(リスト、リスト)などでリスト連結をしたり、 push(リスト、a)などでリストに要素を追加したりすることはよくあることだね。 それだけではなない。 map(x->f(x),リスト)などとかいて、要素xからf(x)のリストをマッピングできる。 filter(x->expr(x),リスト)などとかいて、要素xのうちexpr(x)が成り立つ要素だけリストができる。 前回は乱数の行列を使って、200行5列の得点表を作ったね。 今回は乱数の2次元配列を作って、 50行5列の得点表を作り、 平均点以上なら+、 未満ならーにマッピングしたい。 juliaでリストのmapやってみよう。 2次元配列全体に対してはマッピングできない。 だから、 1行のデータリストdata[y]にまで入り込んで、 小数得点aveと比べるために得点を小数化したfloat(x)にし、 +-を返す関数updown(x)を作っておき、data[y]を+ーデータとしてmapしよう。 [IN] #============================================ num = 50 kamoku = 5 data=[[rand(0:100) for x in 1:kamoku] for y in 1:num] ave= sum([sum(data[y]) for y in 1:num])/(num*kamoku) updown(x) = float(x) >= ave ? '+' : '-' res = [ map(x->updown(x) , data[y]) for y in 1:num] println(res) #============================================ [OUT]例 [['-', '-', '+', '+', '-'], ['-', '-', '+', '+', '-'], ['-', '+', '+', '+', '-'], ['+', '+', '-', '+', '+'], ['-', '-', '+', '-', '-'], ['-', '-', '+', '-', '+'], ['+', '-', '-', '+', '+'], ['-', '-', '-', '+', '+'], ['-', '+', '-', '-', '-'], ['+', '+', '+', '+', '+'], ['+', '-', '+', '+', '+'], ['+', '-', '-', '+', '+'], ['+', '-', '-', '-', '-'], ['-', '-', '-', '-', '+'], ['+', '-', '+', '+', '+'], ['+', '-', '+', '+', '+'], ['+', '+', '+', '+', '+'], ['-', '-', '-', '-', '-'], ['-', '+', '-', '+', '-'], ['-', '-', '+', '+', '+'], ['+', '-', '+', '+', '+'], ['-', '+', '+', '-', '+'], ['-', '+', '-', '-', '-'], ['-', '+', '-', '+', '-'], ['-', '-', '+', '-', '-'], ['+', '+', '-', '+', '-'], ['+', '+', '+', '+', '+'], ['-', '-', '+', '-', '-'], ['-', '-', '-', '-', '+'], ['-', '+', '+', '-', '+'], ['+', '+', '-', '-', '-'], ['+', '+', '-', '+', '+'], ['+', '+', '-', '+', '+'], ['+', '-', '+', '-', '-'], ['-', '-', '-', '-', '+'], ['+', '+', '+', '-', '-'], ['-', '+', '+', '+', '-'], ['+', '+', '-', '-', '-'], ['-', '+', '+', '+', '-'], ['-', '-', '+', '-', '-'], ['+', '-', '-', '+', '-'], ['+', '-', '+', '-', '-'], ['-', '+', '+', '-', '-'], ['+', '-', '-', '+', '-'], ['-', '-', '+', '-', '+'], ['-', '+', '-', '+', '-'], ['+', '+', '-', '-', '+'], ['+', '+', '+', '-', '-'], ['+', '-', '+', '+', '-'], ['-', '-', '-', '+', '+']] 残念だが、geogebraにはmapコマンドそのものはない。 しかし、if文は使えるので、updown(x)という3項演算子のような関数は使わずに、 直接sequenceコマンドにifを入れ込んでみよう。 データ要素と平均を比べる場面では、Elementコマンドを使うとインデックス指定で データが取り出せるね。 [IN] #============================================ num = 50 kamoku = 5 data=Sequence(Sequence(RandomBetween(0,100),n,1,kamoku),m,1,num) ave=((Sum(Sequence(Sum(data(n)),n,1,num)))/(num kamoku)) rs=Sequence(Sequence(If(Element(data,m,n)≥ave,"+","-"),n,1,kamoku),m,1,num) #============================================ 質問:1からNまでの整数に対して、 3で割り切れるときは「Fizz」、 5で割り切れるときは「Buzz」、両方で割り切れるときは「FizzBuzz」、どちらでもないときはその整数のままを答えるコードはどう作りますか。

数のリストから記号のリストが作れちゃう