読者です 読者をやめる 読者になる 読者になる

Details(CODEEVAL)

codeeval ruby

問題の意味がとても分かりにくいのですが、matrixを作成し左側をx、右側をyが陣取り、 yがいくつ左に動くとxと衝突するかというのを求める問題のようです。
問題が悪い気がします。
 

CHALLENGE DESCRIPTION:

There are two details on a M*N checkered field. The detail X covers several (at least one first cell) cells in each line. The detail Y covers several (at least one last cell) cells. Each cell is either fully covered with a detail or not.
f:id:rochefort:20170328185317p:plain

The detail Y starts moving left (without any turn) until it bumps into the X detail at least with one cell. Determine by how many cells the detail Y will be moved.

INPUT SAMPLE:

XX.YY,XXX.Y,X..YY,XX..Y
XXX.YYYY,X...Y..Y,XX..YYYY,X.....YY,XX....YY
XX...YY,X....YY,XX..YYY,X..YYYY
XXYY,X..Y,XX.Y

OUTPUT SAMPLE:

1
1
2
0

CONSTRAINTS:

  1. The matrices can be of different M*N sizes. (2 <= M <= 10, 2 <= N <= 10)
  2. Number of test cases is 40.

My Code

#!/usr/bin/env ruby -w

def y_moving_size(lines)
  min_size = lines.first.size
  lines.each do |line|
    x_index = line.rindex("X")
    y_index = line.index("Y")
    size = y_index - x_index - 1
    min_size = size if size < min_size
    return 0 if min_size == 0
  end
  min_size
end

ARGF.each_line do |line|
  puts y_moving_size(line.chomp.split(","))
end

WEB+DB Press Vol.92 読了

WEB+DB PRESS Vol.92

WEB+DB PRESS Vol.92

  • 作者: 近藤宇智朗,大和田純,谷口禎英,後藤利博,黒瀧悠太,山下和彦,河野匡貴,古橋貞之,瀬尾直利,菅原元気,吉川崇倫,鈴木康平,星北斗,三宅英明,長野雅広,のざきひろふみ,うらがみ,稲富駿,伊藤直也,うさみけんた,丸山晋平,中島聡,はまちや2,竹原,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2016/04/23
  • メディア: 大型本
  • この商品を含むブログを見る

データ収集特集、Reduxの記事が良かったです。
データ収集特集は、Cookpadの事例が取得ろぐのパターンごとに整理されていて良いです。ログ取りまくりでfluentd大活躍という印象。
ユーザーサポート用に監査ログをs3->Redshiftに突っ込んでいるなどは、ああそれやりたい分かるという感じ。Redshift以降どのように実現しているかも知りたいところ。
 
Reduxは最後のreactとの連携のところが今ひとつ腹に落ちていない印象(component, containerあたり)。Reduxそのものの雰囲気はだいたい理解できた気がする。

  // 宿題その1
  case 'COMPLETE_TODO':
    const todos = state.todos.slice(0)
    todos[action.id].completed = true
    return Object.assign({}, state, { todos: todos })

その他、Linuxのコマンド特集とかは需要あるんだろうかと思ってさらっと流した。(合わせて、bashの最新機能を整理してmodern bashの書き方を提示する内容とかなら良かったかも)

See Also

Reactのチュートリアルをやってみた - rochefort’s blog

Knight Moves(CODEEVAL)

codeeval ruby

チェスのナイトの移動位置を求める問題。
横がa-h、縦が1-8。これらの変換をしつつ、以下の数式を満たすパターンを求める。

# 現在位置を(x, y)、次の移動候補を(a,b)とした場合
|a| + |b| = 3
1 <= x + a <= 8
1 <= y + b <= 8

CHALLENGE DESCRIPTION:

In chess, the knight moves to any of the closest squares that are not on the same rank, file, or diagonal. Thus the move is in the “L” form: two squares vertically and one square horizontally, or two squares horizontally and one square vertically:
f:id:rochefort:20170328181252p:plain

INPUT SAMPLE:

The first argument is a filename that contains positions of the knight on the chessboard in the CN form, where:

  1. C is a letter from “a” to “h” and denotes a column.
  2. N is a number from 1 to 8 and denotes a row.

Each position is indicated in a new line.

g2
a1
d6
e5
b1

OUTPUT SAMPLE:

e1 e3 f4 h4
b3 c2
b5 b7 c4 c8 e4 e8 f5 f7
c4 c6 d3 d7 f3 f7 g4 g6
a3 c3 d2

CONSTRAINTS:

  1. The number of test cases is 40.

My Code

#!/usr/bin/env ruby -w

module Chess
  class Knight
    # The codepoint of `a` is 97.
    # The `a` is regarded as `1` in this program.
    CORDINATE_DIFFERENCE_NUM = 96
    def initialize
      x = [1, -1].product [2, -2]
      y = [2, -2].product [1, -1]
      @moving_patterns = x + y
    end

    def candidates(x, y)
      x = alphabet_to_cordinate(x)
      y = y.to_i
      @moving_patterns.inject([]) do |result, pattern|
        a = x + pattern[0]
        b = y + pattern[1]
        result << "#{cordinate_to_alphabet(a)}#{b}" if include_board?(a) && include_board?(b)
        result
      end
    end

    private
      def include_board?(n)
        n >= 1 && n <= 8
      end

      def alphabet_to_cordinate(str)
        str.ord - CORDINATE_DIFFERENCE_NUM
      end

      def cordinate_to_alphabet(x)
        (x + CORDINATE_DIFFERENCE_NUM).chr
      end
  end
end

knight = Chess::Knight.new
ARGF.each_line do |line|
  x, y = line.chomp.split("")
  puts knight.candidates(x, y).sort.join(" ")
end