Hatena::ブログ(Diary)

もうカツ丼でいいよな このページをアンテナに追加 RSSフィード Twitter

2009 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 12 |
2012 | 02 | 03 | 04 | 05 | 06 | 10 | 11 | 12 |
2013 | 01 | 02 | 04 | 06 |
2014 | 06 |

2012-02-18

[][] Problem 235 13:02  Problem 235を含むブックマーク  Problem 235のブックマークコメント

に対し、

とする。

s(5000) = -600,000,000,000

となるrを求めよ。答えは小数点以下12桁に丸めること。

続きを読む

[] RでFizzBuzz 10:51  RでFizzBuzzを含むブックマーク  RでFizzBuzzのブックマークコメント

すごい今更感。

普通にFizzBuzz

まず普通にやるならこうではないだろうか。

# 正攻法?
for(i in 1:100){
  if(!i%%3) cat("Fizz")
  if(!i%%5) cat("Buzz")
  if(i%%3 && i%%5) cat(i)
  cat("\n")
}

15で割ったり3割りや5割りを2度繰り返すのはちょっと見苦しいので、

# 15で割らない(書いて消す)
for(i in 1:100){
  cat(i,"\r")
  if(!i%%3) cat("Fizz")
  if(!i%%5) cat("Buzz")
  cat("\n")
}

(このやり方は奥村先生のところで見付けた:no title)

ただMacのRコンソールではまともに出力されない。WindowsのRguiでもダメかも。

ESSではいけた。なぜかわからないけど桁数が5桁以上になってもOKだった。

ワンライナーでFizzBuzz

そんでまあRだからベクトルでやれやという話になる。あとやっぱFizzBuzzなのでワンライナーの縛りくらい入れろやという話になるのは当然の流れだろう。

ベクトルで出力していいのなら話は簡単で、ベクトルに対する条件判定ができるifelseを使えば良い。

# ベクトルで出力
ifelse(!(i=1:100)%%15,"FizzBuzz",ifelse(!i%%3,"Fizz",ifelse(!i%%5,"Buzz",i)))

やっぱり1行ごとに改行して表示しなければFizzBuzzではないだろう、ということになればcatで包む。

# cat使用
cat(ifelse(!(i=1:100)%%15,"FizzBuzz\n",ifelse(!i%%3,"Fizz\n",ifelse(!i%%5,"Buzz\n",paste(i,"\n",sep="")))))

for使ってしまうけど書いて消す法を用いれば15で割らないワンライナーも書ける。

# 15で割らない(書いて消す)
for(i in 1:100)cat(paste(i,"\r",if(!i%%3){"Fizz"},if(!i%%5){"Buzz"},"\n",sep=""))

もっと短い、Elegant、気持ちの悪い解答お待ちしております。

参考

2012-02-12

[][] Problem 191 21:32  Problem 191を含むブックマーク  Problem 191のブックマークコメント

http://projecteuler.net/problem=191

ある学校では、きちんと出席し遅刻をしない生徒に対し賞金を出している。3日以上連続して欠席したり、1日より多く遅刻すると賞金は得られない。

n日間の各生徒の出席状況は、3つの文字、L(Late、遅刻)、O(On time、出席)、A(Absent、欠席)からなる文字列で表現できる。

4日間ならば81通りの文字列が作れるが、そのうち賞金を得られる文字列は次の43通りである。

OOOO OOOA OOOL OOAO OOAA OOAL OOLO OOLA OAOO OAOA
OAOL OAAO OAAL OALO OALA OLOO OLOA OLAO OLAA AOOO
AOOA AOOL AOAO AOAA AOAL AOLO AOLA AAOO AAOA AAOL
AALO AALA ALOO ALOA ALAO ALAA LOOO LOOA LOAO LOAA
LAOO LAOA LAAO

30日間の場合、賞金を得られる文字列は何通りあるだろうか。

続きを読む