ページ

2012/05/30

[競技プログラミング][C言語][AOJ0009]Prime Number

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0009&lang=jp

Prime Number

6 桁以下の正の整数 n を入力し、n 以下の素数がいくつあるかを出力するプログラムを作成して下さい。
ただし、素数とは 1 と自分自身でしか割り切れない正の整数のうち 1 をのぞいたものをいいます。
例えば 10 以下の素数は、2, 3, 5, 7 です。

Input

複数のデータセットが与えられます。各データセットに n が1行に与えられます。入力の最後まで処理して下さい。

Output

各データセットごとに、n 以下の素数の個数を1行に出力して下さい。
回答:AOJ/vol0/AOJ0009.cpp at master · wada811/AOJ
与えられた整数まで自前で素数判定してカウントすると頑張って高速化しても通らない悲劇…。
どうやら素数判定にはエラストテネスのふるいというものを使うらしい。
これを知らずに自力で頑張って上手くいかなくて半日潰れて泣いた。素数もうやだ…。
そしてこれからのAOJの問題が知ってるかどうかになってきたので萎えてきた。
いい加減C言語でやり続けるのも辛いし、
AOJをひたすら解き続けるのも面白くないのでココで一旦AOJは止めます。

同じ競技プログラミングのAtCoderは2週間に一回くらいなので続けるつもり。
言語は多分C言語ではなくなると思う。
Javascriptを学びたいけど直近の課題としてPHPがあるのでPHPでゴニョゴニョしてるかも。

2012/05/29

[競技プログラミング][C言語][AOJ0008]Sum of 4 Integers

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0008&lang=jp

Sum of 4 Integers

50 以下の正の整数 n を入力し、0 ~ 9 の範囲の整数 a, b, c, d の組で
a + b + c + d = n
を満たすものの組み合わせ数を出力するプログラムを作成して下さい。

例えば、n が 35 のとき、(a, b, c, d) は
(8,9,9,9)、(9,8,9,9)、(9,9,8,9)、(9,9,9,8) の 4 通りですので、答えは 4 となります。

Input

複数のデータセットが与えられます。
各データセットに n が1行に与えられます。入力の最後まで処理して下さい。

Output

各データセットごとに、a, b, c, d の組み合わせ個数を1行に出力して下さい。
回答:AOJ/vol0/AOJ0008.cpp at master · wada811/AOJ
超手抜き4重ループ。
コンピュータの計算が速いからやり方は気にしなくてもなんとかなるという…。

それではまた明日。

2012/05/28

[競技プログラミング][C言語][AOJ0007]Debt Hell

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0007&lang=jp

Debt Hell

某国に住んでいる友達がお金に困って、
あるヤミ金融業者から 10 万円の借金をしたまま、全く返済していないといいます。
この業者は、一週間ごとに 5% の利子を借金に加え、さらに借金の 1,000 円未満を切り上げます。

n を入力したとき、n 週間後の借金の残高を出力し終了するプログラムを作成して下さい。n は 100 以下とします。

Input

整数 n

Output

n 週間後の返済額

回答:AOJ/vol0/AOJ0007.cpp at master · wada811/AOJ
借金地獄ということで複利計算を行えば良い。
利率をかけ続けながら切り上げる。
切り上げするなら天井関数(ceil関数)使っても良かったかも。

2012/05/27

Bloggerで50記事くらい連続編集するとアカBanされて死ぬ

ブログ記事にアイキャッチ画像があるとブログのウィジェットや
Google+とFacebookのシェアで表示されて見やすいし一発で目を引くので
効果的だと思って新しい記事から画像追加しまくったら
アカBanされて昨日死にかけた。機械的にスパム判定食らうみたい。

アクセスできなくなってヘルプへ誘導されるのでそこから手続きして復活させてもらった。
めっちゃ焦るので連続編集ダメ、絶対。

2012/05/26

Bloggerのページタイトルを「記事タイトル | ブログタイトル」にする方法

ブログのページタイトルは「記事タイトル | ブログタイトル」がデファクトスタンダードのようで、
たいていのブログはこの形式になっていますし、Googleもこの形式の方が認識しやすいらしいです。
Google検索やその他のページなどでは先頭何文字かしか表示されないことも多いので
できるだけ記事タイトルを多く表示できるようにこの形式にしたほうがよさそうです。

ということでBloggerの設定をいじることにしましょう。
今回参考にしたのは以下の記事です。
Blogger ブログのページタイトルを「投稿タイトル | ブログタイトル」の順にする方法
Blogger設定画面 > テンプレート > HTMLの編集 > 続行 から以下のコードを検索します。
<title><data:blog.pageTitle/></title>
以下のコードに変更します。
<b:if cond='data:blog.pageType == &quot;item&quot;'>
  <title><data:blog.pageName/> | <data:blog.title/></title>
<b:else/>
  <b:if cond='data:blog.pageType == &quot;static_page&quot;'>
    <title><data:blog.pageName/> | <data:blog.title/></title>
  <b:else/>
    <title><data:blog.pageTitle/></title>
  </b:if>
</b:if>
2行目が記事タイトルで、5行目がBloggerの「ページ」のタイトルで、
7行目がトップページなどのその他のページのタイトルになります。

2012/05/25

[競技プログラミング][C言語][AOJ0006]Reverse Sequence

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0006&lang=jp

Reverse Sequence

文字列 str を入力したとき、その文字列を逆順に出力するプログラムを作成して下さい。
文字は半角英数字のみで、20 文字以内とします。

Input

文字列 str

Output

str の逆順
回答:AOJ/vol0/AOJ0006.cpp at master · wada811/AOJ
一文字ずつ配列に突っ込んで逆順に取り出すだけー

それではまた明日。

2012/05/24

[競技プログラミング][C言語][AOJ0005]GCD and LCM

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0005&lang=jp

GCD and LCM

20億以下の正の整数 a, b を入力したとき、
a と b の最大公約数と最小公倍数を出力して終了するプログラムを作成して下さい。
ただし、a と b の最小公倍数は 20 億を超えないものとします。

Input

複数のデータセットが与えられます。
各データセットは1行に a と b が1つのスペースで区切られて与えられます。
入力の最後まで処理して下さい。

Output

各データセットに対して、最大公約数と最小公倍数を1つのスペースで区切って1行に出力して下さい。
回答:AOJ/vol0/AOJ0005.cpp at master · wada811/AOJ · GitHub

GCD( greatest common divisor:最大公約数)最大公約数 - Wikipedia
LCM( least common multiple:最小公倍数)最小公倍数 - Wikipedia
ユークリッドの互除法 - Wikipedia
基礎知識としては以上の3つ。
GCDをユークリッドの互除法で求めて、LCM = a * b / GCD でLCMを求める。

ユークリッドの互除法のアルゴリズムはこちら↓が参考になった。
最大公約数を求める2つのアルゴリズムを書いてみた - sh-2の日記
他にもGCDを求める方法はあるみたいだけどわかりやすさでユークリッドの互除法が一番かな。

20億とか言われて面食らった。データ型の最大値を覚えていないので調べると long で大丈夫らしい。
C言語講座:色々なデータ型の最大値、最小値
LCMを求める時に上の式で計算すると一時的に long の最大値すら超えるので先にGCDで割る必要がある。

それではまた明日。

2012/05/23

[競技プログラミング][C言語][AOJ0004]Simultaneous Equation

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0004&lang=jp

Simultaneous Equation

連立方程式
ax + by = c
dx + ey = f
の解、x, y を出力して終了するプログラムを作成して下さい。
a, b, c, d, e, f はそれぞれ、 -1000 以上 1000 以下の実数とし、
連立方程式の解が一意に存在するように与えれれるものとします。

Input

複数のデータセットが与えられます。入力の最後まで処理して下さい。
1つのデータセットが1行に与えられます。
1つのデータセットに a, b, c, d, e, f が1つのスペースで区切られて与えられます。

Output

各データセットに対して、x, y を1つのスペースで区切って1行に出力して下さい。
各値は小数点以下第3位まで出力して下さい。小数点以下第4位を四捨五入して下さい。
回答:AOJ/vol0/AOJ0004.cpp at master · wada811/AOJ
行列の凄さは教えられないことが多いけど
プログラムがこのように連立方程式を計算するのに役立つって事を教えればいいのに。

fabs()で-0を0に直さないと通らないので注意。fabs()について→abs/labs/fabs関数

それではまた明日。

2012/05/22

[競技プログラミング][C言語][AOJ0003]Is it a Right Triangle?

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0003&lang=jp

Is it a Right Triangle?

1000 以下の3つの正の整数を入力し、
それぞれの長さを3辺とする三角形が直角三角形である場合には YES を、
違う場合には NO と出力して終了するプログラムを作成して下さい。

Input

複数のデータセットが与えられます。1行目にデータセット数 N が与えられます。
続いて N 行の入力が与えれます。各行に3つの整数が1つのスペースで区切られて与えられます。

Output

各データセットごとに、YES または NO を1行に出力して下さい。
回答:AOJ/vol0/AOJ0003.cpp at master · wada811/AOJ
スワップして三平方の定理で判定するだけの簡単なプログラム。

それではまた明日。

2012/05/21

[競技プログラミング][C言語][AOJ0002]Digit Number

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0002&lang=jp

Digit Number

与えられた2つの整数 a と b の和の桁数を出力して終了するプログラムを作成して下さい。

Input

複数のデータセットが与えられます。各データセットは1行に与えられます。
各データセットは2つの整数 a と b が1つのスペースで区切られて与えられます。
入力の終わりまで処理して下さい。a と b は非負の整数とします。

Output

各データセットごとに、a + b の桁数を出力して下さい。
回答:AOJ/vol0/AOJ0002.cpp at master · wada811/AOJ
久しぶりにC言語やると忘れがちなのが、scanfで読み取れる限りwhileループで処理する方法。
while(scanf("%d %d", &a, &b) != EOF){
}
というかいい加減C言語もツライし他の言語で標準入出力できるようにならないと。
Javaで標準入出力覚えちゃうのが一番早いんだろうなー。
AOJがD言語も使えるようになってたから覚えとくと色々広がりそう(読者層的な意味で)

2012/05/20

[Excel][VBA]CSVファイルを読み込む


改行を含まないが、カンマを含む可能性があるCSVは
ダブルクオートで囲んでカンマ区切りにする。
例.
"foo","bar","baz"
"hoge","fuga","piyo"
上のような形式のCSVファイルをパースする手順
(1)一行で読み込み、先頭と終端の"を除去する
(2)","でSplitして配列にする

Function LoadCSV()
    Dim FileType, Prompt As String
    Dim FileNamePath As Variant
    Dim textline, CsvArray() As String
    Dim RowCnt As Long
    Dim ch1 As Long
    
    FileType = "CSV ファイル (*.csv),*.csv"
    Prompt = "CSV File を選択してください"
    
    FileNamePath = Application.GetOpenFilename(FileType, , Prompt)
    
    'キャンセルされた
    If FileNamePath = False Then End Funciton
    
    '空いているファイル番号の取得
    ch1 = FreeFile
    
    'FileNamePath のファイルをオープンします
    Open FileNamePath For Input As #ch1
    
    'エラーが発生したらファイルを閉じます
    On Error GoTo CloseFile
    
    '表の行番号の初期化
    RowCnt = 1
    
    'ファイルの終端まで
    Do Until EOF(ch1)
        '1行読み込む
        Line Input #ch1, textline
        'CSVをパース
        textline = Mid(textline, 2, Len(textline) - 2)
        CsvArray = Split(textline, """,""")
        
        '配列渡しでセルに代入
        Range(Cells(RowCnt, 1), Cells(RowCnt, UBound(CsvArray()) + 1)) = CsvArray()
        
        RowCnt = RowCnt + 1
    Loop
    
CloseFile:
    Close #ch1 'ファイルのクローズ
    
End Function

CSVファイルフォーマットの解説:CodeZine

改行のある場合は1行ずつ読み込む方法じゃ無理だからもっと面倒。
値の中にダブルクオーテーションがある場合のエスケープなんかも考慮してない。
ある程度自由にCSV側の出力をいじれるならパースする方も楽。

2012/05/19

[競技プログラミング][C言語][AOJ0001]List of Top 3 Hills

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0001&lang=jp

List of Top 3 Hills

山や丘の高さをメートル単位で 1 から 10,000 までの範囲の整数で表した 10 個のデータがあります。
その 10 個のデータを読み込んで、その中で、高い順から3つ出力して終了するプログラムを作成して下さい。

Input

山の高さ1(整数) 
山の高さ2(整数) 
.
.
山の高さ10(整数) 

Output

最も高い山の高さ
2番目に高い山の高さ
3番目に高い山の高さ
回答:AOJ/vol0/AOJ0001.cpp at master · wada811/AOJ · GitHub
これもバブルソートで高いのを取ってくるだけ。
プログラミングの宝箱 アルゴリズムとデータ構造を参考にバブルソートの書き方を変えた。
int i;
int height[10];
int temp, flag;

do{
    flag = 0;
    for(i = 0; i < 9; i++){
        if(height[i] > height[i + 1]){
            flag = 1;
            temp = height[i + 1];
            height[i + 1] = height[i];
            height[i] = temp;
        }
    }
}while(flag);
ネットのそこいらで見たのを真似して書いたのよりコッチのほうが効率が良かったので次からはこの書き方で書く。

2012/05/13

[競技プログラミング][C言語][AtCoder]コマンド入力

C - コマンド入力

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

高橋君は友達と格闘ゲームで対戦をすることにしました。
格闘ゲームは A, B, X, Y の 4 種類のボタンを連続で入力するコマンドにより技を繰り出し戦うゲームです。
しかし、普段格闘ゲームで遊ばない高橋君にとってコマンドの入力は難しく、友達に勝てそうにありません。
そこで余っている L と R のボタンに連続した 2 つのボタン入力を
ショートカットとして割り当てることで、コマンドの入力を短縮したいと思います。
例えば、コマンドが ABXY だと 4 回ボタンを入力する必要がありますが、
L に AB、R に XY を割り当てることで LR の 2 回のボタン入力に短縮できます。
L と R を用いて入力をなるべく短くした時に必要なボタンの入力回数を求めなさい。

入力

入力は以下の形式で標準入力から与えられる。
N
c1c2…cN
1 行目にコマンドに必要なボタンの入力回数を表す N(1≦N≦1000)が与えられる。
2 行目にコマンドの内容を表す N 文字の文字列が与えられる。
i 文字目の文字である ci は、A, B, X, Y のいずれかで与えられる。

出力

ショートカットを用いてコマンド入力に必要なボタンの入力回数を最小化したときの、
ボタン入力回数を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

C: コマンド入力 - AtCoder Regular Contest #002 | AtCoder

回答

AtCoder/arc002_3.cpp at master · wada811/AtCoder

総当りでクリアってのが美しくないかなー。
アルゴリズム的なのを期待したけど解読できる回答はみんな総当りでなんかなー。
とりあえず次は総当たりでもなんでも時間内にC問題までクリアしたいところ。

2012/05/12

[書評]よくわかるiPhoneアプリ開発の教科書【iOS 5&Xcode 4.2対応版】

よくわかるiPhoneアプリ開発の教科書【iOS 5&Xcode 4.2対応版】
森巧尚
マイナビ
発売日:2012-02-23
ブクログでレビューを見る»
iPhoneアプリ開発の教科書というだけあって入門書としては最良です。
開発環境の準備から開発ツールの使い方、Objective-Cの基本、
iPhoneのパーツや機能のサンプル、実機でのテストまでが
スクリーンショットや図を交えてわかりやすく解説されています。
現在Xcodeのバージョンが上がっていますが、
ほとんど問題ありませんしサポートサイトで説明があるので安心です。
「よくわかるiPhoneアプリ開発の教科書」サポートサイト http://book.mycom.co.jp/support/pc/iphonesdk_book/
iPhoneアプリ開発したい!でもiPhone持ってない!
iPhoneって何ができるの?開発ツールの使い方がわからん!
これだけわからないとググってアレコレするにも時間が掛かるのでとりあえず買ってみた。

Androidでもそうだったんだけど開発するにあたって何ができるのかどんなパーツがあるのかを
解説してくれてる本を最初に読むのは重要ですね。
画面の作り方や部品の使い方がわかれば見た目を変更できるので
ちょっとしたプログラムを書くだけで大きな変化を出せて開発してる気分になれます。
こういう成功体験を積み重ねることで投げ出さずに開発を続けられますよ。
iPhoneアプリの開発にチャレンジしたい人、一度は挫折したけど開発したい人にはオススメ!

2012/05/09

[書評]詳解 Objective-C 2.0 第3版

詳解 Objective-C 2.0 第3版
荻原剛志
ソフトバンククリエイティブ
発売日:2011-12-28
ブクログでレビューを見る»
決して易しい内容ではないが、Objective-Cで書くなら必読だと思う。
Objective-Cは変わっているので他の言語を知っていても意味も分からない事がよくあり、
そんなObjective-Cをネットからコピペしたコードでハマって時間を使うより、
本書を時間をかけてでも読んで理解してコーディングすべきだろう。
Mac OS X Lion、iOS 5以降に導入されたメモリ管理方式のARCに完全対応しているので
既にObjective-Cを理解している人も読む価値はあると思う。

Objective-Cは変わっているので他の言語を知っていても意味も分からない(大事なことなので(ry
宣言プロパティの属性指定や既存のクラスにメソッドを追加できるカテゴリ、
Javaで言うところのインターフェースであるプロトコル、
他の言語ではクロージャとして知られている言語機能に相当するブロックオブジェクト、
コールバック的なことができるデリゲートなど役立つ情報がいっぱいです。
これだけのまとまった情報をネット上で手に入れることは不可能だと思います。
Objective-Cやるなら必読だと思いますよ!

ソフトバンク クリエイティブ:詳解 Objective-C 2.0 第3版
ARCに完全対応!!

Mac OS X Lion、およびiOS 5以降の標準的なメモリ管理方式として
新しく導入されたAutomatic Reference Counting(ARC)に対応して全面改定。
iPhone/iPadプログラマ必携!
アップルプロダクトの標準プログラミング言語Objective-Cを徹底解説。

CHAPTER01 オブジェクトに基づくソフトウェアの作成
CHAPTER02 Objective-Cのプログラム
CHAPTER03 継承とクラス
CHAPTER04 オブジェクトの型と動的結合
CHAPTER05 リファレンスカウンタを用いたメモリ管理方式
CHAPTER06 ガーベジコレクション
CHAPTER07 宣言プロパティ
CHAPTER08 NSObjectクラスとランタイムシステム
CHAPTER09 Foundationフレームワークの重要なクラス
CHAPTER10 カテゴリ
CHAPTER11 抽象クラスとクラスクラスタ
CHAPTER12 プロトコル
CHAPTER13 オブジェクトのコピーと保存
CHAPTER14 ブロックオブジェクト
CHAPTER15 メッセージ送信のパターン
CHAPTER16 アプリケーションの構造
CHAPTER17 例題:簡易画像ビューア
CHAPTER18 例外とエラー
CHAPTER19 並列プログラミング
CHAPTER20 キー値コーディング
APPENDIX01 Foundationフレームワークの概要
APPENDIX02 Core Foundationフレームワークの概要
APPENDIX03 コーディングの指針

2012/05/04

[競技プログラミング][C言語][AOJ0000]QQ

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0000&lang=jp

QQ

以下のような表記で、九九を出力して終了するプログラムを作成して下さい。
(×記号の代わりに、小文字の x を使用すること)

1x1=1
1x2=2
.
.
9x8=72
9x9=81

Input

なし

Output

1x1=1
1x2=2
.
.
9x8=72
9x9=81
回答:AOJ/vol0/AOJ0000.cpp at master · wada811/AOJ · GitHub
ただの二重ループ。
vol100の最後より簡単で拍子抜けだった。

それでは。

2012/05/03

[競技プログラミング][C言語][AtCoder]割り切れる日付

B - 割り切れる日付

時間制限 : 2sec / スタックサイズの制限 : 10MB / メモリー制限 : 64MB

問題文

高橋君は割り切れる日付が好きです。
割り切れる日付とは、年÷月÷日の計算結果が整数になる日付のことです。
例えば今日の日付は 2012 年 5 月 2 日ですが、
2012÷5÷2=201.2 となり整数ではないので、今日の日付は割り切れる日付ではありません。

高橋君は割り切れる日付が好きでたまらないので、
次の割り切れる日付を心待ちにして、毎日今日が割り切れる日付かどうかをチェックしてしまいます。
彼に少しでも多くの仕事をしてもらうために、
入力として与えられた日付以降で最初に来る割り切れる日付を求めなさい。
ただし、入力として与えられた日付が割り切れる日付だった場合は、与えられた日付が答えになります。

入力

入力は以下の形式で標準入力から与えられる。
Y⁄M⁄D
グレゴリオ暦(現在、日本で一般的に使われている暦)に従って
年を表す Y、月を表す M、日を表す D が / で区切られて 1 行で与えられる。
Y は 4 桁、M と D は 0 埋めされた 2 桁の整数である
(M と D は、1 桁の数の場合も 1 桁目に 0 をつけて 2 桁にする)。
与えられる日付は 1000⁄01⁄01 以降、2999⁄12⁄31 以前とする。

出力

入力として与えられた日付以降で最初に割り切れる日付を、入力と同じ形式で標準出力に 1 行で出力せよ。
ただし、入力として与えられた日付が割り切れる日付だった場合は、入力と同じ日付を出力すること。
なお、最後には改行を出力せよ。

出典

割り切れる日付 - AtCoder Regular Contest #002 | アットコーダー

回答

AtCoder/arc002_2.cpp at master · wada811/AtCoder

A問題でやった閏年判定を活用して各月の日数の配列の2月の値をインクリメント。
16行目は yaer % (month * day) == 0 にすると処理時間が伸びるのであえてこの形。
25行目はいらないんだけど、外すと何故か使用メモリが大きくなるので書いてある。
別にそんなにシビアなわけじゃないけど他の問題は出来なかったし、
取り組むつもりがないのでB問題をこだわってみた。

2012/05/02

[競技プログラミング][C言語][AtCoder]うるう年

A - うるう年

時間制限 : 2sec / スタックサイズの制限 : 10MB / メモリー制限 : 64MB

問題文

高橋君は忘れっぽい性格なので、うるう年は 2 月 29 日の存在を毎回忘れてしまいます。
そこで、自動でうるう年かどうかをコンピュータに教えてもらえるようにしたいと思います。
入力として与えられた年がうるう年かそうでないかを判断しなさい。

ただし、うるう年は以下の規則で決定します。
規則 1:4 で割り切れる年はうるう年である。
規則 2:100 で割り切れる年をうるう年ではない。
規則 3:400 で割り切れる年はうるう年である。
規則 4:規則 1〜3 のいずれも満たさない場合は,うるう年ではありません。
ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。
例えば、2000 年は規則 3 を満たすのでうるう年です。
2100 年は規則 2 を満たしますが、規則 3 を満たさないのでうるう年ではありません。

入力

入力は以下の形式で標準入力から与えられる。
Y
年を表す整数 Y(1000≦Y≦2999) が 1 行で与えられる。

出力

与えられた年がうるう年ならば YES、そうでなければ NO を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

うるう年 - AtCoder Regular Contest #002 | アットコーダー

回答

AtCoder/arc002_1.cpp at master · wada811/AtCoder · GitHub

閏年の判定は何回かやったからすぐにできた。判定部分はコピペしてきたけど。
この問題は次のB問題で使うための小問みたいな感じだった。

2012/05/01

本当は(きっと)怖くないクロージャ

最近 iPhone アプリに挑戦していて、Objective-C とかいう一風変わった言語を勉強しています。
Appleワールドでしか生きられない言語のためによくわからない言語仕様をネットでちまちま調べてるほど暇じゃねーよと
最近は詳解 Objective-C 2.0 第3版を買ってセコセコと読んでいます。とても重いです。内容的にも重量的にも。

やっとブロックオブジェクトの章まで読み進めたら
Block は、「他のプログラミング言語ではクロージャ(closure)として知られている言語機能に相当」とか書かれていて、
( ´・∀・`)ヘーなんだークロージャのことかー全くこの言語は同じ事柄に対して別の名前がついてて大変だぜェー

で、クロージャ(closure)って何?

よく考えたらクロージャがなんなのか知りません。正直プログラミングClojureとゴッチャになってました。
わからないことはとりあえずググります。
クロージャ - Wikipedia
クロージャ(クロージャー、closure、閉包)はプログラミング言語における関数の一種。
引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。
本当にありがとうございました(?)

望みは絶たれたかと思ったがWikipediaの外部リンクにJavaScript 猿でもわかるクロージャ超入門という文字が!
僅かな望みをかけてリンクをクリック!Wikipediaのとどめの一撃に対して思うことに共感!
段階を踏んで一歩ずつ理解していけるのでオススメです。

とりあえずなんとなく、こういうこと↓だと理解しました。だいたいあってるらしいです。


えぇ、思い返せば関数の呼び出し回数を管理する変数を泣く泣くグローバル変数にして
気持ち悪いなーどうにかならないのかなーと思っていましたが、それを解決できるのがクロージャらしいです。
何か恐ろしいもののように仰々しく説明されるからよくわからなくて怖かったクロージャですが、
ホントは怖くなくて、身近な問題を解決できる便利なヤツでした。

浅い理解で間違ったことを書いているかもしれないので、タイトルはカッコ書きで…きっと(;´∀`)
なにか間違っていたら指摘してくださいね!

追記:どうやら上のツイートの用途だけじゃないみたいです。