日々のつれづれ

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

Check.IO 1日目

Check.IO の一日目

これから少しずつ進めていくのですが、今のスキルでどこまで進むのか、とても楽しみです。 (といいながら、blogを下書きで放置していたので、初めてから7か月16日目らしい。)

まずは1日目。

Sum Number

In a given text you need to sum the numbers. Only separated numbers should be counted. If a number is part of a word it shouldn't be counted.

The text consists from numbers, spaces and english letters

  • Input: A string.
  • Output: An int.
  • Example:
sum_numbers('hi') == 0
sum_numbers('who is 1st here') == 0
sum_numbers('my numbers is 2') == 2
sum_numbers('This picture is an oil on canvas '
 'painting by Danish artist Anna '
 'Petersen between 1845 and 1910 year') == 3755
sum_numbers('5 plus 6 is') == 11
sum_numbers('') == 0

py.checkio.org

いきなり難しいな

結構な問題で少しおどろいた。これが1つ目の課題??

Python」をコンソールに表示しよう!!

print('Hello Python!')

でしょ、普通は!

…これがCheck.IOクオリティ

先が思いやられるけど、楽しみです。

コーティング

まだこれぐらいなら調べなくてもできました。

  • splitで文字列を分離する(引数がないと半角スペースで分離する)
  • 分離したリストをfor分で1要素ずつとってきて、数字か文字を判定する
  • 文字なら0、数字なら1を返す、これをリストに格納する
  • リストを足し合わせる という流れです。
def sum_numbers(text):
    # your code here
    text_split = text.split()
    only_number = [int(i) if i.isnumeric() else 0 for i in text_split]
    sum_number = sum(only_number)
    return sum_number

Rならどうかく?

単語で区切って数値だけの文字を取ってくればOK。 正規表現を使うと簡単。

sum_numbers = function(text)
  grep('[[:alpha:]]',unlsit(strsplit(text, split=" ")),value=TRUE,invert=TRUE)

ここで、grep(':alpha:', ..., value=TRUE) にすると、数値を含む文字を取ってくる。だから、invert=TRUEにする。

正規表現が難しいときは、numeric()関数で文字を数値にしてもOK。 このとき、ベクトルに数字と文字が混在していると、numeirc()関数は文字をNAに変換する副作用がある。 これを使うと、ベクトルは数値とNAの文字列になるので、is.na()などを併用すると切り出せる。

sum_numbers = function(text){
  text = as.numeric(unlsit(strsplit(text, split=" ")))
  only_numbers = text[!is.na(text)]
  return(only_numbers)
}

とはいえ、文字列処理はRよりもPerlRubyなんでしょうね。