0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Crystal で AtCoder(Log #4)

Last updated at Posted at 2021-08-05

Easy_4

$⌊X×1.08⌋=N$ を満たす整数$X$を求める。$N$は1から50000での整数。
$O(1)$でもいけるが多少の紛れが生じる。
$N$から$X$を求めるより$X$から$N$を求める方が遥かに容易。
$N$が大きければ二分探索法の出番だが、今回の制約なら全探索で十分。
$X$を1から50000まで見ていって、解が見つかれが途中で終了する。

プログラムの終了 exit

Crystalにはreturn文があるが、メインプログラムには使えないとのこと。
exit(status)で終了できる。正常終了ならexit(0)。デフォルトでstatus = 0なのでexitでよい。1
each(a..b).each {|i| ... }で他言語のfor文のような事が出来るのだが、blockとかyieldとか調べていくと味わい深い2。実質的には1から50000までの数を順々に{}内に投げて、{}内ではxで受け取って処理している。

sumitrust2019_b.cr
n = read_line().to_i
(1..50000).each { |x|
  if x * 108 // 100 == n
    puts x
    exit
  end
}
puts ":("

Easy_5

  • M個からなる数列のセット$\{\{A_{i1}, A_{i2}, …, A_{iM}\}, i=1...N\}$

  • 数列$\{B_1, B_2, …, B_M\}$

  • 定数$C$

が与えられる。

$A_{i1}B_1+A_{i2}B_2+…A_{iM}B_M+C>0$を満たすセットはいくつあるか。

n回ループ times

n.times do...endでn回ループが実現する。
n.times do |i|...endで何回目のループかを取得することも出来る。0-indexだが。

複数を組み合わせるzip

zipは2つ以上の配列(正確にはIteratorあるいはEnumerable)に使えるメソッド。
a.zip(b)とすると、abのそれぞれ先頭から一つずつ順にとってきてタプルの配列にする。
Iteratorの時はlazyに、Enumerableの時はeagerlyな挙動なのか。

zip.cr
a = 1..4; b = 2..5; c = 3..6
p! a.zip(b, c) # => [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}]

zipの括弧内の要素が余るのは問題ないが、足りないとエラーなる仕様。

zip.cr
a = 1..3; b = 2..5; c = 3..10
p! a.zip(b, c) # => [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}]
p! b.zip(a, c) # => Unhandled exception: Index out of bounds (IndexError)

タプルも波括弧{}

a.zip(b)[{ai0, b0}, {ai1, b1},... , {aim, bm}]の形の配列を生成する。{x, y}はタプルと呼ばれる表現で、他言語では丸括弧()を用いるものも多いがCrystalでは波括弧{}を用いる。
{x, y}の形のタプルはクロージャ内では|x, y|という記法で受けることができる。

後置if

if cond do_somethingdo_something if condと書くことができる。do_somethingが短ければ(文頭とifが一つの視界に入る程度なら)、分かりやすい。

AC例

abc121_b.cr
n, m, c = read_line.split.map(&.to_i)
b = read_line.split.map(&.to_i)
ans = 0
n.times do
  a = read_line.split.map(&.to_i)
  ans += 1 if a.zip(b).map{|x, y| x*y}.sum + c > 0
end
puts ans
  1. https://crystal-lang.org/api/0.33.0/toplevel.html#exit(status=0):NoReturn-class-method

  2. https://ja.crystal-lang.org/reference/syntax_and_semantics/blocks_and_procs.html

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?