mapをやろう

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

資訊: mapをやろう