[topic] タイムコードを表すクラス

以下の条件でタイムコード「時:分:秒:フレーム」を表すクラスを書いてください。

1. 最低限、「時、分、秒、フレーム、フレームレート」を引数にするコンストラクタが必要です
2.フレームレートには数値の他"ntsc"(ドロップフレーム 29.97pfs)も指定できること
3.ありえない引数に対するバリデーションはあっても無くてもかまいません。
4.生成してから、フレームレートの変更が出来ること(自身を変更しても、新しいインスタンスを生成してもかまいません。)
5.保持しているタイムコードを「時:分:秒:フレーム」という文字列に変換できること。(ただしドロップフレームの場合には「時:分:秒;フレーム」であること)

以上

ドロップフレームについては以下を参考にして下さい。
http://www.ite.or.jp/study/musen/tips/tip06.html
http://qtake.hp.infoseek.co.jp/1-4.html

Posted feedbacks - Scala

出題者です・・・
ううむ、お題が言葉たらずでした。すみません。
意図していたのは、以下のようなものです。

実行結果はこうなります。

DROP
00:00:59;28
00:00:59;29
00:01:00;02
00:01:00;03
00:01:00;04
NONDROP
00:00:59:28
00:00:59:29
00:01:00:00
00:01:00:01
00:01:00:02
DROP 10min
00:09:59;28
00:09:59;29
00:10:00;00
00:10:00;01
00:10:00;02
NONDROP 10min
00:09:59:28
00:09:59:29
00:10:00:00
00:10:00:01
00:10:00:02
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class Timecode(val frames:Int, val rate:Any) {
  def this(hh:Int, mm:Int, ss:Int, ff:Int, rate:Any) = this( rate match {
    case "ntsc" =>
      val minutes = hh * 60 + mm
      17982 * (minutes/10) + 1798 * (minutes%10) + ss * 30 + ff
    case r:Int =>
      val mrate = r * 60
      val hrate = mrate * 60
      hh * hrate + mm * mrate + ss * r + ff
  }, rate)

  def changeRate(r:Any) = new Timecode(frames, r)

  override def toString = rate match {
    case "ntsc" =>
      val hh = frames / 17982 / 6
      val mm = frames / 17982 % 6 * 10 + (frames % 17982 - 2) / 1798
      val ss = ((frames % 17982 - 2) % 1798 + 2) / 30
      val ff = ((frames % 17982 - 2) % 1798 + 2) % 30
      sprIntf("%02d:%02d:%02d;%02d", hh,mm,ss,ff)
    case r:Int =>
      val m = r * 60
      val h = m * 60
      val hh = frames / h
      val mm = (frames % h) / m
      val ss = ((frames % h) % m) / r
      val ff = ((frames % h) % m) % r
      sprIntf("%02d:%02d:%02d:%02d", hh,mm,ss,ff)
  }

  def +(add:Int) = new Timecode(frames + add, rate)
  def -(sub:Int) = new Timecode(frames - sub, rate)

  private def sprIntf(fmt:String, args:Any*) = String.format(fmt, args.map(e => e.asInstanceOf[AnyRef]).toArray)
}

object TimecodeTest extends Application {
  println("DROP")
  val t1 = new Timecode(0,0,59,27,"ntsc")
  (1 to 5).foreach {i => println(t1 + i) }

  println("NONDROP")
  val t2 = t1.changeRate(30)
  (1 to 5).foreach {i => println(t2 + i) }

  println("DROP 10min")
  val t4 = new Timecode(0,9,59,27, "ntsc")
  (1 to 5).foreach {i => println(t4 + i) }

  println("NONDROP 10min")
  val t3 = new Timecode(0,9,59,27, 30)
  (1 to 5).foreach {i => println(t3 + i) }
}

Index

Feed

Other

Link

Pathtraq

loading...