4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

CodeWarsとはなんぞや?という方はこちら

この記事は先日執筆したものですが、その中で以下のようなことを書きました。

スクリーンショット 2024-07-03 22.44.39.png

kyuというのは難易度の指標です。

すると、以下のコメントをいただきました。

スクリーンショット 2024-07-03 22.48.51.png

これは・・・やるしかない!!!

問題

Google翻訳

スクリーンショット 2024-07-03 22.50.18.png

「2次元配列が与えられるので、左上から内にぐるぐる回って、1次元の配列にしてね」ですね。

わかりやすい図

スクリーンショット 2024-07-03 22.51.29.png

回答・考え方

問題を解きたい方はぜひやってみてください。

私の考え方(ヒントになるかも)

最も大切な、最初にやること:例示

特に、物理媒体でやることがオススメです。

例示をすることで、以下のメリットがあります。

法則性に気づく

後々テストケースになる

IMG_6375.jpeg
汚い画像ですみません💦

例示してみたところ、以下の点に気が付きました。

  • 最初は、1行目(index = 1)がそのまま入っている
  • 途中に、最後の行(index = -1)が逆順(reverse())になって入っている
  • 1行目と最後の行の間は、「間にある行」の「最後の要素」 が入っているな
  • 最後の行の後には、「間にある行」の「最初の要素」 が入っているな
  • 外周1周だけなら、アルゴリズムがわかった
  • ということは、1周ごとに分けて同様の処理をすれば、解けるんじゃないか?

よし、いけそうです。

私の回答

汚いコードですが、とりあえずクリアしたもの

const snail = (array) => {
  
  const form_outer_to_line = ([square, line]) => {

    if(square[0].length === 1) {
      line.push(square[0][0])
      return line
    }
    
    let right_line = [];
    let left_line = [];
    let inner_square = [];
    
    square.map((e, i) => {
      if(i !== 0 && i !== square.length -1) {
        right_line.push(e[e.length -1]);
        left_line.push(e[0]);
        inner_square.push(e.slice(1, -1));
      }
    })
    
    line.push(...square[0], ...right_line, ...square[square.length -1].reverse(), ...left_line.reverse())
    
    if(inner_square.length) {
      return form_outer_to_line([inner_square, line])
    } else {
      return line
    }
  }
  
  return form_outer_to_line([array, []])
}

最後に

心地よく疲れました。

CodeWarsの良いところである「他人の回答から学べる」はまた今度、エンジニア仲間とやろうと思います。

@htsign さん 教えていただきありがとうございました!

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?