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
いきなり難しいな
結構な問題で少しおどろいた。これが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) }