7. 例題: FizzBuzz
• 数字を 1 から順に出力する、ただし
– 3 で割り切れる場合は "Fizz"
– 5 で割り切れる場合は "Buzz"
– 両方で割り切れる場合は "FizzBuzz" を出力する
• 普通の Ruby プログラミングで FizzBuzz
n = 1
while true
case
when n % 15 == 0 then puts "FizzBuzz"
when n % 3 == 0 then puts "Fizz"
when n % 5 == 0 then puts "Buzz"
else puts n
end
n += 1
end 7
24. コード構築メソッドを起動する
• Ruby の for 文
for 変数 in コレクション do ... end
構文糖
コレクション.each do |変数| ... end
∴ コード構築メソッドを each という名前にすれば
ピリオドなしで呼び出せる
“”.each ≒ for elem in “” do end
24
25. 第一段階: アルファベットと数字で Ruby
例: コード文字列 “p 1” を構築・ eval するコード
class String
def each 文字列を構成する様子
concat 112 “”
concat 32 concat 112
concat 49
eval self “p”
concat 32
exit
end “p ”
concat 49
end
for i in
“p 1” eval
String nil do
end
25
26. class String
大文字を排除する def each
...
• String の ”S” が 2 箇所 end
end
• class String の箇所 for i in
– String クラスには定義できない String nil do
end
– トップレベルは Object クラス
トップレベルに定義すればよい
public
def each
• String nil の箇所 clear
– 文字列を返す別のメソッドにする ...
– String#clear で空文字列に end
for i in
String nil do
inspect do
end 26
27. 第二段階: 小文字 alphabetと数字で Ruby
例: “1” を出力するコード
class String public
def each def each
concat 112 clear
concat 32 concat 112
concat 49 concat 32
eval self concat 49
exit eval self
end exit
end end
for i in for i in
String nil do inspect do
end end
27
29. 数字を排除する(2)
• 例外処理の構文 現在の self
“...”
begin A ensure B end
– Java の try { A } finally { B }
concat begin
みたいなもの dup
• 式全体が A の評価結果を返す ensure
concat begin
– A を評価し 65 を作る
ensure
– B を評価し clear
end
– B の評価結果を捨てて end
A の評価結果を返す構文
• 文字列の先頭に 1 文字追加
するイディオムが作れる “A...”
新しい self
29
30. loop do break public end
catch inspect do def each
loop do break clear end
concat begin dup ensure clear
concat concat concat concat size
loop do break concat concat size end
loop do break concat concat size end
小文字アルファベットだけで Ruby を書く
loop do break concat size end
concat begin size ensure clear end end
concat begin dup ensure clear
concat concat concat concat concat concat size
loop do break concat size end
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
concat concat concat concat size
concat concat concat size
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
concat concat concat size
loop do break concat concat size end
concat concat concat size
loop do break public end
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
loop do break concat concat size end
concat concat concat concat size
loop do break concat concat size end
catch inspect do def each
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
concat concat concat size
loop do break concat concat size end
loop do break concat concat size end
loop do break clear end
loop do break concat concat size end
loop do break concat size end
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
loop do break concat concat size end
concat begin dup ensure clear
concat concat concat size
loop do break concat concat size end
loop do break concat concat size end
loop do break concat size end
concat begin size ensure clear end end
concat begin dup ensure clear
concat concat concat concat size
concat concat concat concat concat concat size
concat begin size ensure clear end end
concat begin dup ensure clear
concat concat concat size
loop do break concat concat size end
concat concat concat size
loop do break concat concat size end
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
concat concat concat size
loop do break concat concat size end
loop do break concat concat size end
loop do break concat concat size end
loop do break concat concat size end
loop do break concat size end
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
concat concat concat size
loop do break concat size end
loop do break concat concat size end
concat concat concat size
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
concat concat concat size
concat begin size ensure clear end end
loop do break concat concat size end
concat concat concat size
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
concat concat concat concat size
concat begin dup ensure clear
concat concat concat size
loop do break concat size end
concat begin size ensure clear end end
concat begin dup ensure clear
concat concat concat concat size
concat concat concat concat size
concat concat concat concat concat concat size
concat begin size ensure clear end end
concat begin dup ensure clear
concat concat concat concat size
loop do break concat concat size end
loop do break concat concat size end
loop do break concat size end
loop do break concat size end
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
loop do break concat concat size end
concat concat concat concat size
loop do break concat concat size end
loop do break concat size end
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
loop do break concat concat size end
concat concat concat size
concat concat concat size
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
loop do break concat concat size end
concat concat concat size
concat concat concat size
loop do break concat size end
concat begin size ensure clear end end
concat begin dup ensure clear
loop do break concat concat size end
loop do break concat concat size end
concat concat concat concat concat size
concat begin size ensure clear end end
loop do break eval self end
loop do exit end end end
for each in inspect do
30 copyright mmxii
yusuke end
o
h
32. 関連研究: 他言語での文字制限の例
• Perl: 記号だけ (Takesako [2005])
Quiz: これは何をするプログラムでしょう? まとめ
Let’s 予約語プログラミング♪
#!/usr/bin/perl Perl 以外の言語でも実装できますか?
sin cos and s qq qx xor s x x print uc chr lc awk ?
ord qq sleep times x xor int log cos xor eval Haskell ?
Lisp ?
and eval and print uc chr ord scalar reverse
ML ?
qq exit binmode xor qq write qw xor print uc Perl → OK !
chr ord scalar reverse qw tell my print PHP ?
Python ? 挑戦者求む!
Ruby ?
正解 → 標準出力に “LLDN” という文字列を出力するプログラム
2005/08/27 Lightweight Language Day and Night 4 2005/08/27 Lightweight Language Day and Night 18
• Javascript
– 記号だけ (Hasegawa [?])
– 顔文字だけ (Hasegawa [?])
32