Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- clc
- clear
- close all
- tic
- disp('starting...')
- % Manually extracted from input
- myTicket = [83,53,73,139,127,131,97,113,61,101,107,67,79,137,89,109,103,59,149,71];
- % Note: Manually split input file into 'rules' and 'other tickets'
- x = importdata('rules.txt');
- L = size(x,1);
- R=[];
- for i=1:L
- str = x{i};
- z = strsplit(str,{': ',' or '});
- N1 = strsplit(z{2},'-');
- N2 = strsplit(z{3},'-');
- R = [R;[str2double(N1{1}),str2double(N1{2})]];
- R = [R;[str2double(N2{1}),str2double(N2{2})]];
- end
- invalidSum = 0;
- y = importdata('input.txt'); % only other tickets
- invalidTicketRow = zeros(size(y,1),1);
- for r=1:size(y,1)
- for c=1:size(y,2)
- valid = 0;
- for j=1:size(R,1)
- if y(r,c)>=R(j,1) && y(r,c)<=R(j,2)
- valid = 1;
- end
- end
- if valid==0
- invalidSum = invalidSum + y(r,c);
- invalidTicketRow(r) = 1;
- end
- end
- end
- disp(invalidSum) % Part A
- %Remove invalid tickets
- y = y(~invalidTicketRow,:);
- % Build matrix M with rules in rows and ticketfield in columns. A true
- % entry in M means the ticket field follows a rule.
- for rule = 1:20
- for ticketField = 1:20
- 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)))
- M(rule,ticketField)=true;
- end
- end
- end
- disp(M)
- % Manually derive order from matrix M by column elimination:
- % Rule --> Ticketfield
- % 16 --> 19
- % 19 --> 10
- % 10 --> 14
- % 15 --> 4
- % 4 --> 3
- % 6 --> 18
- % 3 --> 20
- % 2 --> 7
- % 5 --> 17
- % 1 --> 2
- % 13 --> 6
- % 9 --> 8
- % 14 --> 11
- % 17 --> 9
- % 12 --> 5
- % 8 --> 12
- % 20 --> 1
- % 7 --> 16
- % 11 --> 13
- % 18 --> 15
- format long
- % First 6 rules, use conversion above to get ticket fields
- disp(myTicket(2)*myTicket(7)*myTicket(20)*myTicket(3)*myTicket(17)*myTicket(18))
- toc
- disp('Finished')
Advertisement
Add Comment
Please, Sign In to add comment