Guest User

Untitled

a guest
Dec 16th, 2020
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 1.97 KB | None | 0 0
  1. clc
  2. clear
  3. close all
  4.  
  5. tic
  6. disp('starting...')
  7.  
  8. % Manually extracted from input
  9. myTicket = [83,53,73,139,127,131,97,113,61,101,107,67,79,137,89,109,103,59,149,71];
  10.  
  11. % Note: Manually split input file into 'rules' and 'other tickets'
  12. x = importdata('rules.txt');
  13. L = size(x,1);
  14. R=[];
  15. for i=1:L
  16.     str = x{i};
  17.     z   = strsplit(str,{': ',' or '});
  18.     N1  = strsplit(z{2},'-');
  19.     N2  = strsplit(z{3},'-');
  20.     R   = [R;[str2double(N1{1}),str2double(N1{2})]];
  21.     R   = [R;[str2double(N2{1}),str2double(N2{2})]];
  22. end
  23.  
  24. invalidSum          = 0;
  25. y                   = importdata('input.txt'); % only other tickets
  26. invalidTicketRow    = zeros(size(y,1),1);
  27. for r=1:size(y,1)
  28.     for c=1:size(y,2)
  29.         valid = 0;
  30.         for j=1:size(R,1)
  31.             if y(r,c)>=R(j,1) && y(r,c)<=R(j,2)
  32.                 valid = 1;
  33.             end
  34.         end
  35.         if valid==0
  36.             invalidSum = invalidSum + y(r,c);
  37.             invalidTicketRow(r) = 1;
  38.         end
  39.     end
  40. end
  41. disp(invalidSum) % Part A
  42.  
  43. %Remove invalid tickets
  44. y = y(~invalidTicketRow,:);
  45.  
  46. % Build matrix M with rules in rows and ticketfield in columns. A true
  47. % entry in M means the ticket field follows a rule.
  48. for rule = 1:20
  49.     for ticketField = 1:20
  50.        if all((y(:,ticketField) >= R((2*rule)-1,1) & y(:,ticketField) <= R((2*rule)-1,2)) | (y(:,ticketField) >= R(2*rule,1) & y(:,ticketField) <= R(2*rule,2)))
  51.            M(rule,ticketField)=true;
  52.        end
  53.     end
  54. end
  55. disp(M)
  56. % Manually derive order from matrix M by column elimination:
  57. % Rule --> Ticketfield
  58. % 16 --> 19
  59. % 19 --> 10
  60. % 10 --> 14
  61. % 15 -->  4
  62. % 4  -->  3
  63. % 6  --> 18
  64. % 3  --> 20
  65. % 2  -->  7
  66. % 5  --> 17
  67. % 1  -->  2
  68. % 13 -->  6
  69. % 9  -->  8
  70. % 14 --> 11
  71. % 17 -->  9
  72. % 12 -->  5
  73. % 8  --> 12
  74. % 20 -->  1
  75. % 7  --> 16
  76. % 11 --> 13
  77. % 18 --> 15
  78.  
  79. format long
  80. % First 6 rules, use conversion above to get ticket fields
  81. disp(myTicket(2)*myTicket(7)*myTicket(20)*myTicket(3)*myTicket(17)*myTicket(18))
  82.  
  83. toc
  84. disp('Finished')
Advertisement
Add Comment
Please, Sign In to add comment