feature image

2019年3月26日 | ブログ記事

しろうととまなぶ 超・初めてのプログラミング with Lua

1.はじめに

この記事は、新歓ブログリレー2019の18日目です。
18といえば言わずと知れた日常系の傑作、ハクメイとミコチの主人公の二人の身長を足すと18cmです。さらに、アニメが放送されたのも2018年です。まだ見てない人はアマプラとかで見れると思うので見ましょう。見た人も見ましょう
この記事では、超・初めてのプログラミングということで、今、この機会にプログラムを始めたい人を対象に、Luaという言語を例にして、初めてのプログラミングを実際に体験してもらいます。
†もくじ†
1. はじめに
2. プログラミングは趣味で勉強しよう
3. †簡単な言語†
4. Luaにおはようを言う
5. おわりに

2.プログラミングは趣味で勉強しよう

タイトルの通りです。稀に、プログラミングは大学の授業でやるでしょwと思って何も勉強しないでいると痛い目を見ることがあります。 情報通信系の1~2年次のカリキュラムを例にとってみましょう。 ちなみにこの表は東工大OCWを参考に制作しています。このサイトに行けば講義の内容や目標などが確認できるので便利です。
クオーター 講義名 内容 会得するもの 言語(去年)
1 3Q コンピューターサイエンス第一 計算をプログラムで表現する基礎を学ぶ。 変数,分岐,繰り返しなど ruby python
4Q コンピューターサイエンス第二 第一の発展 計算量,アルゴリズム(ソートなど) ruby python
2 1Q プログラミング基礎 プログラミング言語の基礎的な構成要素やデータ構造 二部探索など,データ構造 C
2Q プログラミング発展 基礎の発展、より実践的。 構造体,ポインタ,ファイル操作 C

基礎的な内容をやるのはこれだけです。
2年3Q以降はプログラムを用いて実験などをします。プログラミングそれそのものの勉強はこの辺りからなくなります。
この辺りから、より深いところも知っている前提で講義が進んでいきます。
2年2Qまでの学習でも十分といえば十分ですが、より深いところを学ぶのは主に自力になります。ガチプロになろうな!

また、学習する言語がある程度絞られているのも気になります。
趣味でプログラミングをやる分には、好きな言語をやっていいのでこれも趣味で学習するメリットでしょう。

3.†簡単な言語†

一口にプログラミング言語といってもプログラミング言語は星の数だけあるとされています。
ここはやはり学習すべき機能がもっとも少ない言語、brain f__k(放送禁止用語)を勉強していきましょう!
最初は、プログラミングの定番である、文字列"Hello! World!!!"を出力するプログラムからですね!

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //Hをprint(出力)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>//print e
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>//print l
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>//print l
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>//print o
+++++++++++++++++++++++++++++++++.> //print !
++++++++++++++++++++++++++++++++.> //print space
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //print H
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //print o
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //print r
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //print l
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //print d
+++++++++++++++++++++++++++++++++.> //print !
+++++++++++++++++++++++++++++++++.> //print !
+++++++++++++++++++++++++++++++++.> //print !
+++++++++++++++++++++++++++++++++.> //print !
+++++++++++++++++++++++++++++++++.> //print !

はい。
ちょっと世界に挨拶してる感がないですね。
と言うわけで、もうちょっとHelloWorld感が欲しいので、この手の簡単な言語の中ではHelloしてる感の強い、UnlambdaのHelloWorldを見ていきましょう!

`r``````````````.H.e.l.l.o.!.W.o.r.l.d.!.!.!i

かなりHelloWorld感が出ましたね!

ではなくて、これらの言語は難読言語に分類され、初めて学習するには不向きです。
最初にこれらをやるべきとか言われた人は多分騙されています。
時には人を疑う心を持つことも必要なのです・・・

4.Luaにおはようを言う

あまり複雑にならず、趣味などで使う場面がそこそこある、読みやすい言語はいくつかあります。
今回はその中から、Luaをピックアップして学んでいきましょう。
Luaの特徴は、他の言語のプログラムにLuaのプログラムを埋め込み、外から呼び出しても動く!と言うコンセプトです。
様々な言語から呼び出せるため、以外にも汎用性が高いです。
また、稀にゲームやツールなどのスクリプティング機能などで要求されることがあります。
例を挙げると、ゲーム、from the deapthのAIカスタマイズや多機能動画編集ツール、AviUtlのスクリプト制御機能などはLuaで書くことが可能らしいです。
プログラミング以外の趣味にも使えるのが嬉しいですね。
詳しい話はwikipediaニコニコ大百科の該当ページを参照していただくとして、この項ではLuaで簡単なプログラムを書いて、それを簡単に実行してみましょう。

4-1.Hello World

HelloWorldはこんな感じです!
Hello.luaprint("Hello! World!!!")

先ほどのbrain何たらと比べてみましょう。

Hello.b++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //Hをprint(出力)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>//print e
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>//print l
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>//print l
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>//print o
+++++++++++++++++++++++++++++++++.> //print !
++++++++++++++++++++++++++++++++.> //print space
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //print H
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //print o
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //print r
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //print l
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> //print d
+++++++++++++++++++++++++++++++++.> //print !
+++++++++++++++++++++++++++++++++.> //print !
+++++++++++++++++++++++++++++++++.> //print !
+++++++++++++++++++++++++++++++++.> //print !
+++++++++++++++++++++++++++++++++.> //print !

かなりわかりやすいですね。
では、これを実行してみましょう。
実行するには環境構築というのをする必要があるのですが、面倒臭いのでオンライン実行環境を使ってみましょう。
ideone.com
ここにアクセスすることで、オンライン上でプログラムを実行することができます。
1
Luaの他にもbrainf__kやUnlambdaなども実行できますが、とりあえずLuaを選択し、上のHello.luaのコードを入力してRunボタンを押してみましょう!
すると、以下のような感じの画面が表示されます。
2
ちゃんと挨拶できましたね。これであなたもプロ趣味グラマーです。
print()は、()の中身を出力する文です。
" "で囲んだ部分は文字列のデータとして扱われます。

4-2.数と四則計算と..

入力に数字を入れるとそれに5足した結果を出力するプログラムを作ってみましょう

Add5.Luaa=io.read("n")--入力された"n"umberを読み込んで変数aに保存
b=5--bに定数5を保存
print(a.." + ".. b .." = ".. a+b)--出力

3

出来ましたね。動かない場合はプログラムに渡す入力の欄に数字を入れ忘れている可能性があります。Editを押しstdinに数字を入れて再度実行してみましょう。
では、一行目から解説していきます。

a=io.read("n")--入力された"n"umberを読み込んで変数aに保存

io.read("n")は、関数といってLuaの機能を呼び出し、その結果に変化するものの一種です。入力から数字を読み込んでその数字になります。

aは変数と言います。a=(データ)と書くことで、何かのデータを一つ記録しておくことができます。
--以降はプログラム実行時には無視されます。これをコメントアウトと言い、プログラマーはここにその行の動作を記録する習性があります。

b=5--bに定数5を保存

bもまた変数です。一部の特別な言葉を除いて、数字や記号から始まらない、ほとんどのスペースを含まない記号列は、変数と認識されます。
gosenchouenhosiiであったり、poyopoyoであったりも変数として用いることができます。

print(a.." + ".. b .." = ".. a+b)--出力

結果をprint()で出力します。
数字や" "で囲った文字列は..を使うことで合わせることができます。これを文字列の結合と言います。
数字は四則演算ができます。+ - * /がそれぞれ+,-,×,÷に対応します。
1+2+3/4のような書き方もできます。この場合わり算が先に行われます。

4-3.fizzとbuzz

FizzBuzzとは、プログラマーがなぜか好きな謎の遊びです。
内容は以下の通りです。

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。

出典(wikipedia)
これをなぜかプログラマーは自動化したがります。何でやろうなぁ...

FizzBuzz.lualimit=100 --終了する値を保存
for i=1,limit do --1からlimitまでの全ての値に対して、対応するendまで繰り返す
    --対象の数字は一時的にiに保存される
    if(i%15==0) then --iを15で割ったあまりが0なら
        print("FizzBuzz")
    elseif(i%3==0) then --そうでなかった場合、iを3で割り切れたなら
        print("Fizz")
    elseif(i%5==0) then --そうでなかった場合、iを5で割り切れたなら
        print("Buzz")
    else  --どれでもなかった場合
        print(i)
    end  --elseに対応するendです
end --forに対応するend

4

for ~ doは対応するendまでの繰り返しを表します。この場合は、1からlimitまでの100回を繰り返します

if() thenは、()内の式が正しいのなら対応するendまたはelseまたはelseifまでを実行し、そうでないなら無視されます。
elseif() thenは、基本的にはifと同じ意味ですが、それ以前でのifやelseifの条件全てに一致していない場合のみ実行されます。
elseはそれ以前でのifやelseifの条件全てに一致していない場合のみ実行されます。

ifやelseifの()の中には条件式というものが入ります。
i%15==0ってやつですね。
%は余りを計算します。この場合はiを15で割った余りですね。
==は、前後のデータが一致するかどうかをtrueまたはfalseで返します。trueが英語のマルでfalseが英語のバツです。これがtrue、つまりマルの時ifは条件に一致したと判断します。
他に、似たようなもので><>=<=もあります。
数式での>,<,,にそれぞれ該当し、大小関係が正しく成り立つ時のみtrueを返します。

4-5.ナベアツの世界

プログラマーがなぜか好きな芸人の一人に世界のナベアツさんがいます。
彼は3で割り切れる数字または各桁の数字に1つ以上3を含む数字の時だけ数字の言い方を変えるギャグにより、かつて世を席巻し大ブームを巻き起こし名実ともに世界を手にしたとされています。[要出典]
プログラマーはよくこれを自動化したがります。そういう本能なのです。

Nabeatsu.Lualimit=100
for i=1,limit do
    if(tostring(i):match("3")==nil and not (i%3==0))then --3を含む部分が虚無で、iが3で割れないとき
    	print(i)
    else
    	print("Nabeatsu")
    end
end

5

if(tostring(i):match("3")==nil and not (i%3==0))then --3を含む部分が虚無で、iが3で割れないとき

tostring(i):match("3")はiを文字列に変換した時に"3"という文字を探し、その部分を抽出します。無かった場合はnilという虚無を返します。
andは左右が両方ともtrueの時のみtrueを返します。
notは後に続く部分がfalseならtrue,trueならfalseを返します。"反対"になるわけですね。
これらを繰り返すことで、tostring(i):match("3")==nil and not (i%3==0)、iを文字列に変換した時に3を含む部分が虚無で、かつ、iを3で割った余りが3ではない
というマルバツ問題を作ることができました。

5.終わりに

長い間お付き合いありがとうございます。今回の記事でLuaに興味が湧いたら、Lua 環境構築とかでググればオフラインでも自分のPCでLuaのプログラムを動かす方法が出てきます。
brainなんとかとかUnlambdaに興味が湧いた人はその先は地獄です。引き返しましょう
私自身は普段はUnityC#で動かしています。C#も色々便利なので気になったらそちらも勉強してみてください。
というか気になったことがあったら片っ端から首を突っ込んでみてください。首を突っ込んで損することはあんまりないです!(違法行為をすると当然損します。)
せっかくなので色んなことやりましょう!
大学生活をどう生きるかはあなた次第!

という感じの意識高そうな文句で締めさせていただきます。 
それでは、ENJOY!

あ、明日はwasabiさんの記事です。お楽しみに!

tyoxu icon
この記事を書いた人
tyoxu

素人です

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2019年4月22日
アセンブリを読んでみよう【新歓ブログリレー2019 45日目】
eiya icon eiya
2019年4月16日
Logicのすヽめ+新歓コンピ宣伝
SolunaEureka icon SolunaEureka
2019年3月16日
競技プログラミングを始めよう【新歓ブログリレー2019 8日目】
eiya icon eiya
2019年4月12日
iPadでGitお絵かきをしよう!
oribe icon oribe
2019年3月20日
大富豪やろうぜ。【新歓ブログリレー2019 12日目】
iF icon iF
2019年4月24日
gnuplotで遊ぼう
mds_boy icon mds_boy
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記