Skip to content

Instantly share code, notes, and snippets.

@nomnel
Last active December 15, 2015 02:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nomnel/5184600 to your computer and use it in GitHub Desktop.
Save nomnel/5184600 to your computer and use it in GitHub Desktop.
[プログラミング入門 - Rubyを使って -](http://www.ie.u-ryukyu.ac.jp/~kono/software/s04/tutorial/)の練習問題
puts "1年は#{365 * 24}時間です"
puts "10年間は#{60 * 24 * 365 * 10}分です"
puts "生まれてから#{Time.new - Time.mktime(1986, 1, 1)}秒経っている"
puts "80年生きるとして、#{(80 * 365) / 7}枚ぐらいかな"
puts "10億3400万秒生きてるとしたら#{1034000000 / 60 / 60 / 24 / 365}歳"
# おじいさんの時計
def grandfathersClock
h = Time.now.hour % 12
h = 12 if h.zero?
h.times{yield}
end
# プログラムロガー
def log(description)
puts "開始 \"#{description}\"..."
ret = yield
puts "...\"#{description}\" 終了, 返り値は: #{ret}"
end
# プログラムロガー改良版
$nestingDepth = 0
def log_improved(description)
indent = " " * $nestingDepth
$nestingDepth += 1
puts "#{indent}開始 \"#{description}\"..."
ret = yield
puts "#{indent}...\"#{description}\" 終了, 返り値は: #{ret}"
$nestingDepth -= 1
ret
end
# フルネームで挨拶
puts '姓入力して'
last_name = gets.chomp
puts '名入力して'
first_name = gets.chomp
puts "こんにちは、#{first_name + ' ' + last_name}"
# ベターな数字
puts '好きな数は?'
ans = gets.chomp.to_i
puts "それより#{ans + 1}のがよくない?"
# 怒ったボス
puts '何が望みだ?'
ans = gets.chomp
puts "なにぃ、\"#{ans}\"だとー!!おまえは首だ!!"
# 目次
linewidth = 60
puts '目次'.center linewidth
puts ''
puts '1章: 数' .ljust(linewidth/2) + 'p. 1' .rjust(linewidth/2)
puts '2章: 文字'.ljust(linewidth/2) + 'p. 72' .rjust(linewidth/2)
puts '3章: 変数'.ljust(linewidth/2) + 'p. 118'.rjust(linewidth/2)
# 99 Bottles of Beer on the Wall
def pluralize(n, singular)
n == 1 ? singular : singular + 's'
end
99.downto(1).each{|i|
puts "#{i} #{pluralize(i, 'bottle')} of beer on the wall"
puts "#{i} #{pluralize(i, 'bottle')} of beer"
puts "Take one down and pass it around"
puts "#{i - 1} #{pluralize(i-1, 'bottle')} of beer on the wall"
puts ''
}
# 耳の遠いおばあちゃん
puts 'なんじゃ?'
while true
ans = gets.chomp
if ans == ans.upcase
break if ans == 'BYE'
puts "いやー、#{1930 + rand(21)}年以来ないねー!"
else
puts 'は?! もっと大きな声で話しておくれ、坊や!'
end
end
puts 'じゃあの'
# さみしがりやの耳の遠いおばあちゃん
def gramma(bye_count)
return if bye_count >= 3
ans = gets.chomp
if ans == ans.upcase
if ans == 'BYE'
gramma(bye_count + 1)
else
puts "いやー、#{1930 + rand(21)}年以来ないねー!"
gramma(0)
end
else
puts 'は?! もっと大きな声で話しておくれ、坊や!'
gramma(0)
end
end
puts 'なんじゃ?'
gramma(0)
puts 'じゃあの'
# うるう年
def leap_year?(year)
((year % 400).zero?) || ((year % 4).zero? && (not ((year % 100).zero?)))
end
puts '開始は?'
start_year = gets.chomp.to_i
puts '終わりは?'
end_year = gets.chomp.to_i
(start_year..end_year).select{|y| leap_year? y}.each{|y| puts y}
# 入力された値をアルファベット順に並べ替えて出力する
ary = []
while true
elem = gets.chomp
break if elem == ''
ary << elem
end
ary.sort.each{|e| puts e}
# 目次を表示するプログラム配列版
linewidth = 60
puts '目次'.center linewidth
content = [['1章: 数', 'p. 1'], ['2章: 文字', 'p. 72'], ['3章: 変数', 'p. 118']]
content.each{|a| puts a[0].ljust(linewidth/2) + a[1].rjust(linewidth/2)}
# thousand, million, billion, trillion追加済み拡張版
def englishNumber(number)
return '負でない数を入力してください.' if number < 0
return 'zero' if number == 0
numString = ''
onesPlace = ['one', 'two', 'three', 'four', 'five',
'six', 'seven', 'eight', 'nine']
tensPlace = ['ten', 'twenty', 'thirty', 'forty', 'fifty',
'sixty', 'seventy', 'eighty', 'ninety']
teenagers = ['eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen',
'sixteen', 'seventeen', 'eighteen', 'nineteen']
left = number
# 単位(?)の追加はここに
[["trillion", 1000000000000],
["billion", 1000000000],
["million", 1000000],
["thousand", 1000]].each{|a|
key, value = a[0], a[1]
write = left / value
left = left - (write * value)
if write > 0
num = englishNumber(write)
numString = numString + num + ' ' + key
if left > 0
numString = numString + ' '
end
end
}
write = left / 100
left = left - (write * 100)
if write > 0
numString = numString + onesPlace[write-1] + ' hundred'
if left > 0
numString = numString + ' '
end
end
write = left / 10
left = left - (write * 10)
if write > 0
if ((write == 1) and (left > 0))
numString = numString + teenagers[left-1]
left = 0
else
numString = numString + tensPlace[write-1]
end
if left > 0
numString = numString + '-'
end
end
write = left
left = 0
if write > 0
numString = numString + onesPlace[write-1]
end
numString
end
# weddigNumberは略
# ninety-nine Bottles of Beer on the Wall
def pluralize(n, singular)
n == 1 ? singular : singular + 's'
end
99.downto(1).each{|i|
eng_num = englishNumber(i)
puts "#{eng_num} #{pluralize(i, 'bottle')} of beer on the wall"
puts "#{eng_num} #{pluralize(i, 'bottle')} of beer"
puts "Take one down and pass it around"
puts "#{englishNumber(i-1)} #{pluralize(i-1, 'bottle')} of beer on the wall"
puts ''
}
y, m, d = 1986, 1, 1
# いつ10億秒歳になるか
puts Time.mktime(y, m, d) + 1000000000
# 今何歳か
puts "今#{((Time.new - Time.mktime(y, m, d)) / (60 * 60 * 24 * 365.25)).to_i}歳ぐらい"
# OrangeTreeクラス
class OrangeTree
def initialize
@height = 1
@orangeCount = 0
@dead = false
@age = 0
end
def height
puts "#{@height}メートル"
end
def oneYearPasses
if @dead
puts "枯れちゃってるので何もないよ"
return
end
@orangeCount = 0
@age += 1
if die?
@dead = true
else
grow
produce if grown?
end
end
def countTheOranges
"#{@orangeCount}個の実が成っている"
end
def pichAnOrange
if @orangeCount > 0
@orangeCount -= 1
puts "おいしー"
else
puts "実が無いよー"
end
end
private
def die?
@age > 10
end
def grown?
@age > 3
end
def grow
@height += 1
end
def produce
@orangeCount = @age
end
end
# 赤ちゃんドラゴンと会話(Dragonの定義は省略)
norbert = Dragon.new('Norbert')
while true
mname = gets.chomp
if mnaem == "exit"
exit
elsif ["feed", "walk", "putToBed", "toss", "rock"].find{|s| s == mname}
norbert.method(mname).call
else
puts "そんなメソッドは無い"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment