SvetlanPetrova

Kamino Factory code explained SoftUni

Jun 16th, 2021
703
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.util.Arrays;
  2. import java.util.Scanner;
  3.  
  4. public class KaminoFactory_09 {
  5.     public static void main(String[] args) {
  6.         Scanner scanner = new Scanner(System.in);
  7.  
  8.         //Вход от конзолата:
  9.         int length = Integer.parseInt(scanner.nextLine());
  10.         String input = scanner.nextLine();
  11.  
  12.         int rowsCounter = 0;
  13.         int printRow = 0;
  14.  
  15.         int currentSequenceSum = 0;
  16.         int greatestSum = 0;
  17.  
  18.         int currentSequence;
  19.         int greatestSequence = length;
  20.  
  21.         StringBuilder textReceiver = new StringBuilder();
  22.         StringBuilder textPrinter = new StringBuilder();
  23.  
  24.         boolean isZero = true;
  25.         boolean isOne = false;
  26.  
  27.         // Докато не въведа ключовата фраза:
  28.         while (!input.equals("Clone them!")) {
  29.  
  30.             isZero = true; // връщам в начална позиция за новия цикъл;
  31.             isOne = false; // връщам в начална позиция за новия цикъл;
  32.  
  33.             //Броя всеки нов ред от конзолата:
  34.             rowsCounter++;
  35.  
  36.             //Заменям излишните удивителни знаци с интервал:
  37.             input = input.replaceAll("!+", " ");
  38.  
  39.             // Преобразувам стринговия вход в целочислен масив, премахвайки разделителя:
  40.             int[] sequence = Arrays.stream(input.split(" ")).mapToInt(Integer::parseInt).toArray();
  41.  
  42.  
  43.             // Изчислявам сумата на числата от конкретния низ:
  44.             for (int digits : sequence) {
  45.                 currentSequenceSum += digits;
  46.                 // Генерирам текстов вариант на низа за печат:
  47.                 textReceiver.append(digits).append(" ");
  48.             }
  49.  
  50.             // Проверявам дали низът не е изграден само от нули:
  51.             for (int digit : sequence) {
  52.                 if (digit != 0) {
  53.                     isZero = false;
  54.                     break;
  55.                 }
  56.                 textPrinter = new StringBuilder(); // занулявам променливата;
  57.                 textPrinter.append(textReceiver);  // съхранявам този низ за печат;
  58.             }
  59.  
  60.             //Ако дължината на прочитане на низа е равна на 1:
  61.             if (length == 1 && sequence[0] == 1) {
  62.                 isOne = true;
  63.                 textPrinter = new StringBuilder(); // занулявам променливата;
  64.                 textPrinter.append(textReceiver);  // съхранявам този низ за печат;
  65.             }
  66.  
  67.             // Ако дължината на прочитане на низа е по-голяма от 1, намирам последователност от единици:
  68.             for (int i = 0; i < length - 1; i++) {
  69.                 if (!isZero && sequence[i] + sequence[i + 1] > 1) {
  70.                     // Маркирам на коя позиция съм намерил последователност:
  71.                     currentSequence = i + 1;
  72.  
  73.                     // Проверявам дали позицията на текущия низ е по-малка от най-малката запазена до сега:
  74.                     if (currentSequence < greatestSequence) {
  75.                         greatestSequence = currentSequence; // най-малката позиция, приема стойността на този низ;
  76.                         greatestSum = currentSequenceSum;    // най-голямата сума, приема стойността на този низ;
  77.                         textPrinter = new StringBuilder(); // занулявам променливата;
  78.                         textPrinter.append(textReceiver);  // съхранявам този низ за печат;
  79.                         printRow = rowsCounter; // съхранявам реда на който се е случило;
  80.                     }
  81.  
  82.                     /* Проверявам дали текущият низ е равен на най-добрият запазен до сега, и ако е така,
  83.                        дали сумата на числата му е по-голяма от най-голямата запазена сума: */
  84.                     if (currentSequence == greatestSequence && currentSequenceSum > greatestSum) {
  85.                         greatestSum = currentSequenceSum; // най-голямата сума приема стойността на този низ
  86.                         greatestSequence = currentSequence; // най-малката позиция, приема стойността на този низ;
  87.                         textPrinter = new StringBuilder(); // занулявам променливата;
  88.                         textPrinter.append(textReceiver);  // съхранявам този низ за печат;
  89.                         printRow = rowsCounter; // съхранявам реда на който се е случило;
  90.                     }
  91.                 }
  92.             }
  93.             currentSequenceSum = 0; // занулявам сумата за новия цикъл;
  94.             textReceiver = new StringBuilder(); // занулявам текста за новия цикъл;
  95.  
  96.             //Вход от конзолата - текст:
  97.             input = scanner.nextLine();
  98.  
  99.         } //Печат:
  100.         if (isZero) {
  101.             System.out.println("Best DNA sample 1 with sum: 0.");
  102.             System.out.print(textPrinter);
  103.         } else if (isOne) {
  104.             System.out.println("Best DNA sample 1 with sum: 1.");
  105.             System.out.print(textPrinter);
  106.         } else {
  107.             System.out.printf("Best DNA sample %d with sum: %d.\n", printRow, greatestSum);
  108.             System.out.print(textPrinter);
  109.         }
  110.     }
  111. }
RAW Paste Data