体験を伝える―『ガジェット通信』の考え方

面白いものを探しにいこう 本物を体験し体感しよう 会いたい人に会いに行こう 見たことのないものを見に行こう そしてそれをやわらかくみんなに伝えよう [→ガジェ通についてもっと詳しく] [→ガジェット通信フロアについて]

【息抜き】カードを上手く並べよう【言語不問】解答と解説

【息抜き】カードを上手く並べよう【言語不問】

本問題は、表題のテーマで、簡単なプログラムを書くものです。

それでは以下、問題とその解答を見ていきましょう。

問題

あなたは、11から99までの、89枚のカードを持っています。問題では、横幅と高さの整数が与えられます。この横幅と高さで作られるマス目に、カードを左上から順に並べていきます。

その際、縦に順番に並べ、高さいっぱいになると、次の列にカードを並べます。カードがなくなった場合は「–」を代わりに置きます。

標準入力から得られる数字は「,」で区切られた2つの数値です。1つ目は横幅、2つ目は高さになります。

標準出力に出力する際は、各行の「数値」や「–」は、「,」で区切ります。列は改行で区切ります。

(参考:各プログラミング言語の標準入出力サンプル

以下、入力例です。

11,9

以下、出力例です。

11,20,29,38,47,56,65,74,83,92,–
12,21,30,39,48,57,66,75,84,93,–
13,22,31,40,49,58,67,76,85,94,–
14,23,32,41,50,59,68,77,86,95,–
15,24,33,42,51,60,69,78,87,96,–
16,25,34,43,52,61,70,79,88,97,–
17,26,35,44,53,62,71,80,89,98,–
18,27,36,45,54,63,72,81,90,99,–
19,28,37,46,55,64,73,82,91,–,–

答え

まず、横位置をx、縦位置をy、高さをhとします。

       x
       0 1 2 3 4 …
  ┏  ┌─────…
h=9 ┃ y 0│
  ┃  1│
  ┃  2│
  ┃  3│
  ┃  4│
  ┃  ::
  ┗

その際、各マスは「y + x * h + 11」の計算式で、以下のように計算できます。

「y + x * h」で左上からの順番を求め、カードの最初の数字の「11」を足すと、そのマスに置くカードの数字になります。

      x
      0
1
2
3
4

  ┏  ┌────────────────────────…
h=9 ┃ y 0│0+0*9+11 0+1*9+11 0+2*9+11 0+3*9+11 0+4*9+11
  ┃  1│1+0*9+11 1+1*9+11 1+2*9+11 1+3*9+11 1+4*9+11
  ┃  2│2+0*9+11 2+1*9+11 2+2*9+11 2+3*9+11 2+4*9+11
  ┃  3│3+0*9+11 3+1*9+11 3+2*9+11 3+3*9+11 3+4*9+11
  ┃  4│4+0*9+11 4+1*9+11 4+2*9+11 4+4*9+11 4+4*9+11
  ┃  ::
  ┗

      x
      0
1
2
3
4

  ┏  ┌────────────────────────…
h=9 ┃ y 0│11
20
29
38
47
  ┃  1│12
21
30
39
48
  ┃  2│13
22
31
40
49
  ┃  3│14
23
32
41
50
  ┃  4│15
24
33
42
51
  ┃  ::
  ┗

また、「y + x * h + 11」で計算して100以上になった場合は、ルールに従って「–」で埋めるようにします。

以下、実例のコードです。サンドボックスで試せる、Node.js用のものです。

// https://codeiq.jp/tools/sandbox/
// Node.js

process.stdin.resume();
process.stdin.setEncoding(‘utf8’);
process.stdin.on(‘data’, function (chunk) {
var lines = chunk.toString().split(‘n’);
var arr = lines[0].split(‘,’);
var w = arr[0] * 1;
var h = arr[1] * 1;
var min = 11;
var max = 99;
var arr1 = [];
for (var y = 0; y < h; y ++) {
var arr2 = [];
for (var x = 0; x < w; x ++) {
var n = y + x * h + min;
var s = n

CodeIQ MAGAZINEの記事一覧をみる
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。