exit('IN');

本を読んで得た学びとか

【CodeWars】10/11~10/17に解いた問題たち

記事の内容

10/11~10/17にCodeWarsで解いた問題と僕の解答を載せています。
使用言語はPHPです。(たまに違う言語も使うかも?)

Invert values (10/11)

レベル

8kyu

概要

配列の正の数を負に, 負の数を正にして返却する

書いたコード

1回目

function invert(array $a): array {
  
  $array = [];
  
  foreach ($a as $num) {
    $array[] = -$num;
  }
  
  return $array;
}

2回目

function invert(array $a): array {
  return array_map(function ($n) {return -$n;}, $a);
}

コードの解説

1回目は関数を使わずに解いた。 2回目は、array_mapを使った。
どちらのほうが読みやすいだろうか?


Shortest Word (10/12)

レベル

7kyu

概要

文字列中の最も短い単語の文字数を見つける。

書いたコード

1回目
正直かなり悪いコードだと書いてて感じた。 特に$shortest_lengthが…

function findShort($str){
  $array = [];
  $length = 0;
  $shortest_length = 999;
  
  $array = str_word_count($str, 1);
  foreach ($array as $word) {   
     $length = strlen($word);
    
    if ($shortest_length > $length) {
      $shortest_length = $length;
    }
  }
  
  return $shortest_length;
}

2回目 他の方の解答を見て真似をした。
array_map関数は便利。

function findShort($str){
  $length = array_map('strlen', str_word_count($str, 1));
  return min($length);
}

Two Oldest Ages (10/13)

7kyu

概要

配列の1番目と2番目に大きい値を返す

書いたコード

rsortの第2引数のSORT_NUMERICは必要なかったみたい。
returnの箇所はarray_sliceでやってる人もいた。
個人的には今回のように直接指定した方が1番目と2番目をreturnしているとわかる気がする。
array_sliceに慣れてないだけだろうか。

// Return the two oldest/oldest ages within the array of ages passed in.
function twoOldestAges($ages) {
  rsort($ages, SORT_NUMERIC);
  return [0 => $ages[1], 1 => $ages[0]];
}

Ones and Zeros (10/14)

レベル

7kyu

概要

0, 1から構成される配列から2進数の値を返す

書いたコード

1回目

function binaryArrayToNumber($arr) {
  $sum = 0;
  $array_length = count($arr);
  
  foreach ($arr as $binary) {
    if ($binary == 1) {
      $sum  += pow(2, $array_length - 1);
    }
    $array_length -= 1;
  }
  
  return $sum;
}

2回目
他の人の解答を真似しました。
こんなに短くかけるんですね。
bindecという関数があると知れて非常に勉強になりました。

function binaryArrayToNumber($arr) {
  return bindec(implode('', $arr));
}

Descending Order (10/15)

レベル

7kyu

概要

数字を大きい順に並べ替える

書いたコード

特に難しいということもなく。
戻り値がintになっているから、returnするときにキャストした方が確実だと思う。

function descendingOrder(int $n): int {
  $numbers = [];
  
  $numbers = str_split("$n");
  rsort($numbers);
  return implode('', $numbers);
}

The iccanobiF Sequence (10/16)

レベル

7kyu

概要

与えられた数だけフィボナッチ数列の配列を作る。
作った配列を逆順にして返す。

書いたコード

forとswitchを使ったので縦に長くなってしまった。
ただ、個人的には短く書くよりもこのぐらいの方が理解しやすいんじゃないかと思う。

function iccanobif($n) {
  $fib = [];
  
  for ($i = 0; $i < $n; $i++) {
    switch ($i) {
      case 0:
        $fib[] += 1;
        break;
      case 1:
        $fib[] += 1;
        break;
      default:
        $fib[] = $fib[$i - 1] + $fib[$i - 2 ];
        break;
    }
  }
  return array_reverse($fib);
}

Pairs of integers from m to n (10/17)

レベル

7kyu

概要

与えられた2つの数 (m, n)が与えられたとき、mからnまでの数のペアを過不足なく作る
(上手く言語化出来ない…)

書いたコード

正直すごく見辛い。
変数の名前の付け方・ループのネストが原因。
再帰処理を行うのが良いのかもしれない。

function generatePairs($m,$n){
  $pairs = [];

  for ($i = $m; $i <= $n; $i++) {
    for ($j = $m; $j <= $n; $j++) {
      $pairs[] = [$i, $j];
    }
    $m++;
  }
  return $pairs; 
}

1週間の振り返り

ほぼ7kyu。
6kyuや5kyuは朝の時間でちょこっと特にはまだ厳しいかも。

改善点 - 一行空ける箇所を統一する - 変数名は$arr, $strではなく適切な名前をつける(ただ問題文が元々そういう名前をつけている場合もある)