今日の晩飯カツ丼

プログラミングに関する記事を書いてます。

[マニプロ]初めてのIo編

マニアックプログラミング略してマニプロの3つ目の記事です!
マニプロでは不定期で、数日かけて有名では無いプログラミング言語の基礎の基礎を習得して皆さんに使いやすさなどを書いていこうと思ってます。
注:ちょっと触ったくらいなので、誤った情報が混ざっている可能性があります

雑談(飛ばして構いません)

前回の記事からはや2ヶ月。。。
今世界がコロナで大変なことなってますね。株が大暴落したのが非常に怖いです。しかも特定の国とかではなく全世界でなので、、、
ただ、ここ数日は3/19辺りと比べると回復はしてるっぽいですがまだまだ低いです。
あと、志村けんさんの訃報も驚きました。

本編

3回目の言語はIoです!
入出力を思い出すような名前ですが、なんか入出力に特徴があるんかと思ったんですが特に無いようです(笑)

そもそもIoとは

オブジェクト指向型言語で、Steve Dekorteという方が友人と共にプログラミング言語の仕組みを勉強するために作った小さな言語らしいです。

因みに公式サイトがあるんですが、このサイトの雰囲気がめっちゃ好みです(笑)
iolanguage.org

Ioの特徴

アクター

初め見たときナニソレオイシイノ状態だったんですが、調べたらなんとなく分かったような気がします。
アクターという処理を行うことで、親→子→その子・・・という風にオブジェクト(?)らしきものを沢山作り、それぞれにはメールボックスとアドレスがあります。そして、大量のメッセージ(命令)を一気に受け取ると溜まった分を子に送って処理させるんです。
つまり、並行処理に凄い向いている"仕組み"のことを言います。

Ioを使ってみた

io guideDownloading,Installingから実行環境を入れてください。手順は物凄く少ないのでやり易い。あと、実行する時はターミナルで$io ほにゃららら.io で実行出来ます。

まずはHello World
"Hello World!" println

printlnが後ろにくると中々な違和感を感じますねw

1~5まで足す
ans := 0
for(i,1,5,ans=ans+i)
ans println

forに{}が存在しないだとっ!? 初めて見ましたw
これくらい簡単なプログラムならむしろJavaとかCとかよりも見易い?

おみくじ
rand := 0.5

if(rand<=0.3,"凶" println,
    if(rand<=0.8,"吉" println,"大吉"println)
)

/*
(rand<=0.3) ifTrue("凶" println) ifFalse(
    (rand<=0.8) ifTrue("吉" println) ifFalse("大吉" println)
)
こういう書き方もあります。
*/

乱数作ろうと思ったんですが、Ioは小規模にするのがモットーらしいので元からライブラリが殆ど入っていない状態らしいです。
Git HubからIoのアドオン(ライブラリ)を入れる手順がRead.mdに書いてあったのでやったんですが、明らかにアドオンはインストールされてるはずなのですが実行しても「そんなオブジェクトはないゾ」って言ってくるんですよね。。。(多分俺が悪い) なので仕方なくrandには0.5を入れておきました。

で、肝心の書き心地ですが{}が無い分何重にも重なったifが出てくるとかなり見にくい。しかも処理を()内に書くのが特徴的。
でも、下のコメントの方はifTrueとかifFalseとか書いてるので分かりやすいかも。複雑になるとごっちゃごちゃになっちゃうけど(笑)

リストで色々
list := List clone append(10, 6, 15, 3 ,20) //list作成

list := list sort //ソートします
list println //list(3,6,10,15,20)

list remove(20) //20を消します(因みにリストに存在しない値を入れてもエラーとかは出ません)
list println

list := list(30, 10, 5, 20) select(%3==0) //3の倍数のみ抽出
list println

list := list map(i,i*2+1) //全ての要素を2倍して1足す
list println

めっちゃ色々出来るやん!!! cloneでlistを作成するとは驚きです((((;゚Д゚)))))))
あと、map,selectとかはかなり有能。foreach,filterが簡略化された感じですね。

Ioを使ってみて

Ioの基礎だけやってみました。
想像してた以上のクオリティーでビックリしました(笑)
あと、{}が無いだけでこんなにもスッキリするのか、、

という事で今回はこれで終了! 最後に評価を書いておきます。
記事を読んで頂きありがとうございましたm(_ _)m

評価

注:自分が感じた評価ですので、酷評しても怒らないでください
習得のしやすさ★★★★★☆☆☆☆☆(日本語の文献は無いので難しいが、tutorialは英語を読まなくても出来るので若干評価をあげました)

理解のしやすさ★★★★★★★★☆☆(C,Java・・などの有名言語とほぼ変わらないので、Io初見でも何をやりたいかくらいは分かる)

読みやすさ  ★★★★★★☆☆☆☆(スッキリ感と読みやすやは別で、{}が無いので見た目はスッキリしてるがどこに処理が書かれているかがちょっとわかりにくい)

書きやすさ  ★★★★★★★★☆☆("()"とか"{}"が最低限しか無いので、割と早く書けるかと)

実用性    ★★★☆☆☆☆☆☆☆(マニプロの評価の項目になぜこれを入れたのか過去の自分に問いかけたくなる。。ただ、この言語は環境構築も楽で見た目もスッキリしてて取っ付きやすいので初心者に「これがプログラミングだよ!楽しいでしょ?」って言うには丁度よさそうなので星3)

面白いか   ★★★★★★☆☆☆☆(独特の書き方に面白さを感じました)

またやるか  ★☆☆☆☆☆☆☆☆☆(初心者に紹介する時は使うかも。でも個人では使わないかな。。)

[マニプロ]初めてのBrainfuck編

マニアックプログラミング略してマニプロの2つ目の記事です!
マニプロでは不定期で、数日かけて有名では無いプログラミング言語の基礎の基礎を習得して皆さんに使いやすさなどを書いていこうと思ってます。
注:ちょっと触ったくらいなので、誤った情報が混ざっている可能性があります

雑談(飛ばして構いません)

学校でシャトルランがあったのですが、自宅警備員の自分からするとかなりハードな競技です。
10回目:ここら辺は舐めすぎ
20回目:ちょっと苦しいかも、、
30回目:やっぱり苦しい、、
40回目:え?まだ40!?
50回目:もう無理かも;;
60回目:もう視界がぁ
70回目:なんやかんや行ける
80回目:心の俺「あとたった10で90台だぞ!!行け!!」現実「無理」

てことで結果は80回。厳しい、、、

本編

シャトルランの話はこれくらいにして、映えある2回目の言語はBrainf*ckです!!!

名前からしてヤバい。逐一、f*ckって書くのは面倒なのでそのままfuckって書きます。

そもそもBrainfuckとは

完全にネタ言語です。
難解言語として知られています。(Hello World!を出力することすら困難です)
名前の通り、脳みそがfuckされます。

Brainfuckの特徴

超難解言語

要素が少なすぎて、逆にこれ以外の特徴が見当たらないです(笑)
初めから、初期値が全て0の長〜い配列が用意されており、そこを移動したり数を足したり出力したりします。
命令できるコマンドがたったの8個しか無いので全て表にしておきます。

文字 役割
> 1つ右に動く
1つ左に動く
+ ポインタの値を1足す
- ポインタの値を1引く
. ポインタの値を出力
, 入力から1バイト読み込んで、ポインタが指す先に代入する
[ ポインタが指す値が0なら対応する ] の直後にジャンプする
] ポインタが指す値が0でないなら対応する [ の直後にジャンプする

wikipedia

"+"は"++"、"-"は"--"、"."は"print"、"[]"は"while"ってことです。

Brainfuckを使ってみた

https://fatiherikli.github.io/ WEB上で動かせます。
http://web-apps.nbookmark.com/ascii-converter/文字列のASCIIコードがすぐ分かるので便利です。

まずはAを出力
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
  1. を65回打つことで値が65になり、.で出力するとAと出てきます。(ASCIIコードで65がA)
次に掛け算
+++[->++++<]
//コメント:3*4

4を3回足して12にしています。
なので、−12にしたい時は、

---[->++++<]
//コメント:誤
+++[->----<]
//コメント:正
---[+>----<]
//コメント:正

Brainfuckの定石みたいなものです。これを使いこなせれば君もBrainfuck初心者卒業だ!

ようやくHello World!

Helllo World!だけでも色々な書き方がある為、人によってbyte数が違ってきます。
なので、自分なりに一番byte数が少なくなったプログラムを載せておきます。

++++++[->+++<]>[->++++>++++++>++++++>++>+++++<<<<<]>.>-------.>..+++.>----.>---.<<.+++.------.<-.>>+.
//コメント:ASCIIコード:72 101 108 108 111 32 87 111 114 108 100 33

因みに101byteです。100を切れるように頑張ったんですが、自分には無理でした。。。
軽く説明すると、

++++++[->+++<]

この部分で6*3で18を作ります。

>[->++++>++++++>++++++>++>+++++<<<<<]

この部分で18*4,18*6・・・18*5を一気に作ります。
これらはASCIIコードを近い数字たちが集まった5グループ([32,33],[108,108,111,114]など)に分け、それらの数字に近い18の倍数の数字です。

そして、その後で数字を微調整して出力しています。

これよりも短く書けたぞ!って人は是非コメントお願いしますm(_ _)m

Brainfuckを使ってみて

Brainfuckを使ってみました!
どうでしたか? 自分は意外と楽しめた気がします(笑)
パズルを解いてる感覚でした。
一見単純なネタ言語に見えても、実は、同じ値を出力するにしても人によって大きくコードが変わるっていう奥深さもあるっていう点が凄く気に入りました👍

という事で今回はこれで終了! 最後に評価を書いておきます。
記事を読んで頂きありがとうございましたm(_ _)m

評価

習得のしやすさ★★★★★★★★★★(8つしか無いからリファレンスすら存在しない(多分))

理解のしやすさ★★★★★★★★★★(8つしか無いからサルでも分かる)

読みやすさ  ★☆☆☆☆☆☆☆☆☆(可読性は壊滅的)

書きやすさ  ★☆☆☆☆☆☆☆☆☆(途中でどこがどんな値か解らなくなって頭がfuckされる)

実用性    ☆☆☆☆☆☆☆☆☆☆(ある訳が無い)

面白いか   ★★★★★★★★★★(ハマる)

またやるか  ★★★★★★★★★☆(頭の体操がてらやろうと思います)

参考にしたサイト

Brainfuck 超入門 - Qiita

[マニプロ]初めてのHaskell編(初投稿)

マニアックプログラミング略してマニプロの初投稿です🎉 (ネーミングセンスが、、)
マニプロでは不定期で、数日かけて有名では無いプログラミング言語の基礎の基礎を習得して皆さんに使いやすさなどを書いていこうと思ってます。
注:ちょっと触ったくらいなので、誤った情報が混ざっている可能性があります

A.そもそも何故そんな捻くれたことをしようと思ったんですか? → 興味本位。自分は、ストレートのみで168kmの投手よりも、超多彩な変化球を持つ148kmの投手の方がロマンを感じる人だからです。

といっても初投稿ってこともあってHatena Blogを書く練習も兼ねてそんなにマニアックではありません。今回はHaskell編です!

HaskellってAtcoderで使ってる人がたまにいるようなイメージがある。
存在自体は知ってたけど、どんなものなのかがあまり分かってなかったので、気になって基礎の基礎を習得しました。

そもそもHaskellとは

知らない人もいるでしょう。
ja.wikipedia.org

こういう時のwikipedia

Haskellの特徴

関数型言語

最大の特徴(?)ですかね。関数の組み合わせでプログラムを書きます。

遅延評価

特徴的ですね。
遅延評価というのは、評価するべき値を必要となる時まで評価しない仕組みのことを言います。
例えば、、
Java

int a = b;
int b = 1;
System.out.print(a);

Haskell

a = b
b = 10
print x

Javaだともちろんエラーが出ますが、Haskellだとあら不思議、ちゃんと1と表示されます。

モナド

モナドは、純関数型言語の欠点を埋める為に存在しています。IO処理をする為に必要らしいです。        そこまでやってないから詳しいことは分からん

強力な型システム

Haskellは強力な静的型付けです。Int,Double,Floatなどがあります。
また、それと同時に強力な型推論も行います。逐一型を宣言しなくて良いのは楽で助かります。

Haskellを使ってみた

まずはHello World!
main = do putStrLn "Hello World!"

main = do 処理 これがエントリーポイントです。

1~5まで足す
func :: Int -> Int
func x | x==1 = 1 
        | otherwise = x + func (x-1)

main = do print (func 5)

普通はfor文を使って変数に足していくと思いますが、Haskellは変数の再代入が許されておらず、for文も存在しないので再帰で実装しています。
" | "はifみたいなもので、x==1の時1を返す、otherwise(その他)の時はx + func (x-1)を返すという仕組みです。

カリー化
func :: Int -> Int -> Int
func x y = x + y

func2 :: Int -> Int
func2 a = func 2 a

main = do print (func2 5)

(省略)
func2 :: Int -> Int
func2 = func 2
(省略)

は同じで、下はカリー化されています。func2の引数aとfunc 2 aで共通していると、両辺から共通部分を省略することが出来ます。

関数合成
(省略 f,gを関数として定義)
func x = f (g x)
func x = (f.g) x

上下の式は同じ値を出力します。

すると、カリー化と関数合成を合わせることで〜

func = f.g

も上の式と同じ値を出力します!

これを応用すれば、、

(省略)
func x y = f (g x y)

func2 x y = f(g' y)
g xをg'に置き換える

func2 x y = f.g' y

func2 x = f.g'

func2 x = f.(g x)

func2 x = f' (g x)
f.をf'に置き換える

func2 = f'.g

func2 = (f.).g

となり、func x y = f (g x y) と func2 = (f.).gは同じ値を出力します。

パズルやってるみたいで面白かったです。

Haskellを使ってみて

Haskellの基礎の基礎をやってみました!
自分は有名どころの言語(Java,C#,Javascript,PHP...)しか使ったことがなかったので、Haskellが人生で初の関数型言語でした。
慣れてないからちょっと分かり難かった(笑)
でも、関数型なので命令型では普段味わうことが出来ない新鮮な書き方を学ぶことが出来て面白い!

という事で今回はこれで終了! 最後に評価を書いておきます。
記事を読んで頂きありがとうございましたm(_ _)m

評価

注:自分が感じた評価ですので、酷評しても怒らないでください
習得のしやすさ★★★★★★☆☆☆☆(日本語の文献が多く存在しているので習得はし易い。ただ、多くの人は命令型に慣れちゃっていると思うので6)

理解のしやすさ★★★★★☆☆☆☆☆(命令型に慣れているので、少し難しかった)

読みやすさ  ★★★★★★★★★☆(関数型ってこともあって、何をしたいかが関数の雰囲気で分かる)

書きやすさ  ★★★★★★★★☆☆("()"や"{}"などを書かなくて良いので、スピーディーに記述することが出来ます)

実用性    ★★★☆☆☆☆☆☆☆(金融系で使われていることもあるらしいですが、ほとんどがJava,C系だと思います)

面白いか   ★★★★☆☆☆☆☆☆(淡々とした言語なので自分の性には合わなかったかも)

またやるか  ★★★★★☆☆☆☆☆(他とは違って純関数型なので、ちょくちょく触るかも)

はじめましてm(_ _)m

はじめまして。kyobankatuと申します。

自己紹介

もうすぐ高校生です。中高一貫なので受験はありません。

好きな食べ物

寿司がなんだかんだ言って一番好き(*´ー`*) ネタはハマチと鯛が好物。

好きなゲーム

PCだと「Minecraft」 マイクラ歴は約3年。

ブラウザだと最近krunker.ioという軽いFPSゲームにハマってます。(めっちゃオモロイ)

あとは、スマホプロスピAにゃんこ大戦争。にゃんこは2,3ヶ月前に始めました

趣味

プログラミングと野球観戦が趣味。(家族は野球に興味がないので、球場に行ったことが無い;;)

プログラミングは主にJavaをしています。

 

自己紹介はこの辺で終わっておきます。

このサイトの概要

主にプログラミングに関することを書こうかなぁ〜 って思ってます。

マニアックな言語をちょこちょこ使って、色々書く予定です。

色んな言語知ってる人ってなんか憧れる。(医者兼弁護士兼スポーツ選手的な感じ)

かと言って、有名な言語について触れない訳では無いので。

あとは、気になったプログラミングに関するニュースについても書くかもしれません。

最後に

 投稿頻度はかなり低いと思いますが、せめて継続できるように頑張りますd