1

チャレンジ:

ドイツのオタク ポッドキャスト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)" です。 これを達成し、コードをより効率的にするためのアイデアはありますか?

4

1 に答える 1