はじめに
CodeWarsとはなんぞや?という方はこちら
この記事は先日執筆したものですが、その中で以下のようなことを書きました。
kyu
というのは難易度の指標です。
すると、以下のコメントをいただきました。
これは・・・やるしかない!!!
問題
Google翻訳
「2次元配列が与えられるので、左上から内にぐるぐる回って、1次元の配列にしてね」ですね。
わかりやすい図
回答・考え方
問題を解きたい方はぜひやってみてください。
私の考え方(ヒントになるかも)
最も大切な、最初にやること:「例示」
特に、物理媒体でやることがオススメです。
例示をすることで、以下のメリットがあります。
法則性に気づく
後々テストケースになる
![]() |
---|
汚い画像ですみません💦 |
例示してみたところ、以下の点に気が付きました。
- 最初は、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 さん 教えていただきありがとうございました!