チャレンジ:
ドイツのオタク ポッドキャストFanboysは、最新のエピソード 135で視聴者に、今後の番組のどのエピソード番号が 2 レベルの Harshad Number になるかを確認するように依頼しました。
与えられた基数のハーシャッド数は、その基数で書かれたときにその桁の合計で割り切れる整数です。
Fanboys の解釈によると、2 レベルの Harshad Number は、その桁の合計で割り切れる数であり、結果の比率自体が Harshad Number になります。
解決策(醜い、洗練されたもの):
次のコードで関数 "two.step.harshed.number(start, end)" を追加して、R でこのタスクを解決しようとしました。
# Function to calculate the two-leveled Harshed Numbers for given integer number intervall
two.step.harshed.number = function(start, end)
{
# Function to calculate a digit sum
digitsum = function (x) {sum(as.numeric(unlist(strsplit(as.character(x), split="")))) }
# Function returning a numbers value if integer, otherwise NA
checkinteger = function (x) {
if (x%%1==0) {
return (x)
}
else {
return(NA)
}
}
# Setup data frame with rows of numbers from start value to end value
db = data.frame(number=start:end)
# 1st level run
# Calculate the digit sum of those numbers
db$digitsum1 = sapply(db$number, FUN=digitsum)
# Calculate the ratio of number and it's digit sum and keep only if it's an integer
db$ratio1 = db$number / db$digitsum1
db$ratio1 = sapply(db$ratio1, FUN=checkinteger)
db = na.omit(db)
# 2st level run
# Calculate the digit sum of the previous (integer) ratio
db$digitsum2 = sapply(db$ratio1, FUN=digitsum)
# Calculate the ratio of the previous ratio and it's digit sum and keep only if it's an integer
db$ratio2 = db$ratio1 / db$digitsum2
db$ratio2 = sapply(db$ratio2, FUN=checkinteger)
db = na.omit(db)
# Return remaining number, which proved to be two-leveled Harshed Numbers
return(db$number)
}
関数を使用する場合の課題の解決策 (次のエピソードは最大 200 話):
2段階の過酷な数(136, 200)
は一連の 3 つの数字で、私には正しいように見えます。
162 180 200
質問:
これは初心者向けのコードであることは承知しています。タスクを n ステップに一般化する別の関数を作成したいと思います。つまり、関数 "n.step.harshed.number(steps, start, end)" です。 これを達成し、コードをより効率的にするためのアイデアはありますか?