exit('IN');

本を読んで得た学びとか

【CodeWars】11/1~11/7に解いた問題たち

記事の概要

僕が1週間に解いたCodeWarsのまとめです。
PHP 7.0を使用しています。

Reverse words(11/1)

レベル

7kyu

概要

与えられた文字列の単語を逆にして返す。

書いたコード

1回目

function reverseWords($str) {
  $words = [];
  $words = explode(' ', $str);
  foreach($words as &$word) {
    $word = strrev($word);
  }
  return implode(' ', $words);
}

2回目

function reverseWords($str) {
  implode(' ', array_map('strrev', explode(' ', $str)));
}

Substituting Variables Into Strings: Padded Numbers(11/2)

レベル

7kyu

概要

与えられた数字が5桁になるように0で埋める。

書いたコード

sprintfを使って終わり。
最初はprintfを使おうとしていたけど、printfは返り値がintになるから使えなかった。

function solution($value){
  return sprintf("Value is %05d",$value);
};

Cryptanalysis Word Patterns(11/3)

レベル

7kyu

概要

与えられた文字列に番号を割り当てる。同じ文字には同じ番号。

書いたコード

やはりforeachのネストは読み辛い。
foreachの箇所をstr_replaceで書ければだいぶ短くできそう。

function wordPattern($word) {
  $chars = [];
  $alphabet_orders = [];
  $pattern = [];
  
  $chars = str_split(strtolower($word));
  $alphabet_orders = array_flip(array_values(array_unique($chars)));
  foreach($chars as $char) {
    foreach($alphabet_orders as $alphabet => $order) {
      if ($char == $alphabet) {
        $pattern[] = $order;        
      }
    }
  } 
  return implode('.', $pattern); 
}

Fix string case(11/4)

レベル

7kyu

概要

文字列中に含まれる大文字と小文字の数に応じて文字列を変換する。

書いたコード

相変わらずforeachのなかにifを入れてしまっている。
大文字小文字の判定を正規表現でやればもっと簡潔にできた。

function solve($s) {
  $char_array = [];
  $count_upper = 0;
  $count_lower = 0;
  
  $char_array = str_split($s);
  foreach($char_array as $char) {
    if (ctype_upper($char)) {
      $count_upper++;
    } else {
      $count_lower++;    
    }
  }
  return $count_upper > $count_lower ? strtoupper($s) : strtolower($s);
}

String repeat(11/5)

レベル

8kyu

概要

与えられた文字列を指定の数だけ繰り返す。

書いたコード

function repeatStr($n, $str)
{
  return str_repeat($str, $n);
}

Calculate average(11/6)

レベル

8kyu

概要

int型配列の要素の平均を出す。

書いたコード

一発で配列の平均を計算する関数はない?

function find_average($array) {
  return array_sum($array) / count($array);
}

Nth power rules them all!(11/7)

レベル

7kyu

概要

int型の配列の各要素を利用して計算する。

書いたコード

function modified_sum(array $array, int $n): int {
  $answer = 0;
  foreach($array as $num) {
    $answer += $num ** $n;
  }
  return $answer - array_sum($array);
}