プログラミングのお題スレ Part22 (857レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
768: デフォルトの名無しさん [sage] 2025/06/21(土) 23:05:10.33 ID:awm9eire(1) AAS
>>766
766(2): デフォルトの名無しさん [] 2025/06/21(土) 16:41:25.25 ID:muNvYhtO(1) AAS
お題
2次元の配列があったときに
一番左上を起点として右上方向、左下方向、右上方向…
というふうに斜めに配列の要素をたどることを
ジグザグスキャンと名付けます

たとえば、3 * 3の配列の場合は次の順番で配列の要素にアクセスします

(1, 2, 6)
(3, 5, 7)
(4, 8, 9)

二次元の配列を入力としてジグザグスキャンを行ってください
結果を1次元の配列として出力してください


入力: (A, B, C), (D, E, F), (G, H, I)
出力: (A, B, D, G, E, C, F, H, I)

入力: (A, B, C), (D, E, F)
出力: (A, B, D, E, C, F)

入力: (A, B), (C, D), (E, F)
出力: (A, B, C, E, D, F)
Rust

fn f<T: Clone, const M: usize, const N: usize>(input: &[[T; N]; M]) -> Vec<T> {
 let mut output = Vec::<T>::new();
 for x in 0..(M + N - 1) {
  let start = if x < N { 0 } else { x + 1 - N };
  let end = if x < M { x } else { M - 1 };
  let iter = (start..=end).map(|m| input[m][x - m].clone());
  if x & 1 == 1 {
   output.extend(iter.clone());
  } else {
   output.extend(iter.rev());
  }
 }
 output
}

fn main() {
 assert_eq!(f(&[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]), ['A', 'B', 'D', 'G', 'E', 'C', 'F', 'H', 'I']);
 assert_eq!(f(&[['A', 'B', 'C'], ['D', 'E', 'F']]), ['A', 'B', 'D', 'E', 'C', 'F']);
 assert_eq!(f(&[['A', 'B'], ['C', 'D'], ['E', 'F']]), ['A', 'B', 'C', 'E', 'D', 'F']);
}
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.035s