Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import java.time.LocalTime;
- import java.util.Scanner;
- class Element {
- private int id;
- private String time;
- private String reply;
- public Element(int id, String time, String reply) {
- this.id = id;
- this.time = time;
- this.reply = reply;
- }
- public String getTime() {
- return time;
- }
- public void setTime(String time) {
- this.time = time;
- }
- public long getNanoSeconds(String time) {
- String[] parts = time.split(",");
- LocalTime localTime = LocalTime.parse(parts[0]); // "HH:mm:ss"
- long baseNanos = localTime.toNanoOfDay(); // total nanos up to this time
- long extraNanos = Long.parseLong(parts[1]); // extra nanos from input
- return baseNanos + extraNanos;
- }
- public void changeTime(int shift) {
- String[] times = time.replace(" --> ", " ").split("\\s+");
- long nanoStart = getNanoSeconds(times[0]) + shift;
- long nanoEnd = getNanoSeconds(times[1]) + shift;
- String formattedStart = formatWithLast3Nanos(nanoStart,shift);
- String formattedEnd = formatWithLast3Nanos(nanoEnd,shift);
- setTime(formattedStart + " --> " + formattedEnd);
- }
- private String formatWithLast3Nanos(long nanos, int shift) {
- LocalTime time = LocalTime.ofNanoOfDay(nanos);
- int nano = time.getNano(); // full nanos
- int last3 = nano % 1000; // last 3 digits
- if(shift>0 && last3-shift<0)
- return String.format("%02d:%02d:%02d,%03d",
- time.getHour(), time.getMinute(), time.getSecond()+1, last3);
- else if(shift<0 && last3+shift>1000)
- return String.format("%02d:%02d:%02d,%03d",
- time.getHour(), time.getMinute(), time.getSecond()-1, last3);
- else
- return String.format("%02d:%02d:%02d,%03d",
- time.getHour(), time.getMinute(), time.getSecond(), last3);
- }
- @Override
- public String toString() {
- return String.format("%d\n%s\n%s\n",id,time,reply);
- }
- }
- public class SubtitlesTest {
- public static void main(String[] args) {
- Subtitles subtitles = new Subtitles();
- int n = subtitles.loadSubtitles(System.in);
- System.out.println("+++++ ORIGINIAL SUBTITLES +++++");
- subtitles.print();
- int shift = n * 37;
- shift = (shift % 2 == 1) ? -shift : shift;
- System.out.println(String.format("SHIFT FOR %d ms", shift));
- subtitles.shift(shift);
- System.out.println("+++++ SHIFTED SUBTITLES +++++");
- subtitles.print();
- }
- }
- class Subtitles {
- private List<Element> elements;
- public Subtitles() {
- this.elements = new ArrayList<>();
- }
- public int loadSubtitles(InputStream in) {
- Scanner scanner = new Scanner(in);
- while (scanner.hasNextLine()) {
- String line = scanner.nextLine().trim();
- if (line.isEmpty()) continue;
- int id = Integer.parseInt(line);
- String time = scanner.nextLine().trim();
- String text = scanner.nextLine().trim();
- while (scanner.hasNextLine()) {
- String nextLine = scanner.nextLine().trim();
- if (nextLine.isEmpty()) break;
- text += "\n" + nextLine;
- }
- elements.add(new Element(id, time, text));
- }
- return elements.size();
- }
- public void print() {
- StringBuilder sb= new StringBuilder();
- for(Element e : elements){
- sb.append(e.toString());
- if(e.equals(elements.get(elements.size()-1)))
- break;
- sb.append("\n");
- }
- System.out.println(sb.toString());
- }
- public void shift(int shift) {
- for(Element e: elements)
- e.changeTime(shift);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement