exit('IN');

本を読んで得た学びとか

【CodeWars】10/18 ~ 10/24に解いた問題たち

内容

10/18 ~ 10/24に解いたCodeWarsの問題です。

Complementary DNA(10/18)

レベル

7kyu

概要

与えられた塩基配列の塩基対を返す。(この言葉が生物学的にあってるか不明)
AならT, CならGというふうな感じ。

書いたコード

1回目
長い, 文字列を置換するときはとりあえず配列にする, という固定観念が招いた結果。

function DNA_strand($dna) {
  $complementary_chars = [];

  foreach (str_split($dna) as $char) {
    switch ($char) {
      case "A":
        $complementary_chars[] = "T";
        break;
      case "T":
        $complementary_chars[] = "A";
        break;
      case "C":
        $complementary_chars[] = "G";
        break;
      case "G":
        $complementary_chars[] = "C";
        break;
    }
  }
  return implode($complementary_chars);
}

2回目 一番評価が高かった解答のまね。
strtrって便利なものがあるとは。
文字列置換の関数があることは知っていたけど、文字列の各文字に対して置換ができるのはわかっていなかった。

function DNA_strand($dna) { 
  return strtr($dna, "ACGT", "TGCA");
}

Simple Fun #176: Reverse Letter (10/19)

レベル

7kyu

概要

与えられた文字列からアルファベットを抜き出して逆順にして返す。

書いたコード

1回目
正規表現の否定形を知らず、一度アルファベットを抜き出して連結した。

function reverseLetter($str){
  $alphabets = [];
  preg_match_all("/[a-zA-Z]*/", $str, $alphabets);
  return strrev(implode('', $alphabets[0]));
}

2回目
^ キャレットを用いてアルファベット以外を除去したことでコード量が減った。

function reverseLetter($str){
  return strrev(preg_replace("/[^a-zA-Z]/", '', $str));
}

A Needle in the Haystack(10/20)

レベル

8kyu

概要

配列の中から"needle"の位置を見つける。 found the needle at position [needleの位置]という形で返却する。

書いたコード

array_searchの結果を文字列連結すれば一行でかけた。

function findNeedle($haystack) {
    $key = array_search('needle', $haystack);
    return "found the needle at position $key";
}

String Task(10/21)

レベル

7kyu

概要

与えられた文字列を以下の条件で加工して返す。 - 母音の削除 - 全て小文字にする - それぞれの文字の前に '.' をつける

書いたコード

他の人は、prg_replace一行で書いていた。

function string_task(string $string): string {
  $vowels = ['a', 'o', 'y', 'e', 'u', 'i'];
  
  $string = str_replace($vowels, '', strtolower($string));
  if ($string) {
    return '.' . implode('.', str_split($string));
  }
  return "";
  
}

Two to One(10/22)

レベル

7kyu

概要

2つの文字列から重複を無くし、アルファベット順に並べ替えて一つの文字列にして返す。

書いたコード

count_chars(, 3)を使えば一発でいけるようです。
なんでソート系の関数って戻り値がbooleanなんでしょうか?
戻り値をbooleanと配列で選べたら、もっと使いやすいような気がするんですが。

function longest($a, $b) {
  $array = str_split($a . $b);
  sort($array);
  return implode('', array_unique($array));
}

Numbers in strings(10/23)

レベル

7kyu

概要

文字列に含まれる最も大きい数字を返す。

書いたコード

1回目
ユニークにする必要なかった。

function solve($s) {
  $numbers_array = [];
  
  preg_match_all('/[0-9]*/', $s, $numbers_array);  
  return max(array_unique($numbers_array[0]));
}

2回目
array_uniqueを省略。
また、正規表現も[0-9]* から \d+に変更した。 +にしてしまったけど、数字が全部一桁なら動かなくなるか…?

function solve($s) {
  preg_match_all('/\d+/', $s, $numbers_array);
  return max($numbers_array[0]);
}

Growth of a Population(10/24)

レベル

7kyu

概要

何年で人口が基準を超えるかを返す。

書いたコード

function nbYear($p0, $percent, $aug, $p) {
    $year = 0;
    while($p0 < $p) {
      $p0 = $p0 + $p0 * ($percent * 0.01) + $aug;
      $year ++;
    }
    return $year;
}