日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

Check.IO 2日目

Check.IO の2日目

前回は「文章に含まれている数字だけの単語をカウントする」ってことで、勉強サイトの1問目にしては難しいな、ってことでした。

2日目はどんな感じかというと

Even the Last

You are given an array of integers. You should find the sum of the integers with even indexes (0th, 2nd, 4th...). Then multiply this summed number and the final element of the array together. Don't forget that the first element has an index of 0.

For an empty array, the result will always be 0 (zero).

  • Input: A list of integers.
  • Output: The number as an integer.
  • Example:
1. checkio([0, 1, 2, 3, 4, 5]) == 30
2. checkio([1, 3, 5]) == 30
3. checkio([6]) == 36
4. checkio([]) == 0
  • How it is used: Indexes and slices are important elements of coding. This will come in handy down the road!
  • Precondition:
    0 ≤ len(array) ≤ 20 all(isinstance(x, int) for x in array) all(-100 < x < 100 for x in array) py.checkio.org

これもまた難しいな…

Check.IOクオリティ

  • 0番目、3番目、5番目、…の奇数の文字をとってくる
  • 数字を足し合わせる
  • 合計と一番最後の数字と掛け合わせる ってことか。

コーティング

Pythonは1つめの文字が0番目になるんだよな。 1つ目を0にすれば、+1と-1で絶対値がそろうから処理が楽なんだろうけど、なかなか慣れません。

def checkio(array):
    num = sum(array[::2])*array[-1] if len(array)>0 else 0
    return num
  • 1つ飛ばしのコードはブラケットで数値を指定する。 [開始位置:終わり位置:飛ばす数]
  • 最後の位置は0番から1下がった数。[-1] ですね。

それと、要素が0のときをif/elseで条件分岐になりますね。

Rならどうかく?

Rはseq()関数になる。
seq(開始位置, 終わり位置, by=飛ばす数)です。

Rは終わりの位置を-1を指定できないので、rev()関数で順序を逆にして1で取ってくる。

checkio = function(array)
  seq(1, length(array), by=2)*rev(array)[1]

でも、このとき、arrayの要素が0だとエラーになるので、条件分岐をいれる

checkio = function(array)
  ifelse(length(array)==0, 0, sum(array[seq(1, length(array), by=2)])*rev(array)[1])

こんな感じ。 Pythonの方がコードがシンプルですね。