Advertisement
mosredna

AoC 2021 day 13

Dec 13th, 2021
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1. #include <Arduino.h>
  2. #include <LedControl.h>
  3. #include "data.h"
  4. #include <Wire.h>
  5. #include <LiquidCrystal.h>
  6.  
  7. /*
  8. # the data looks like this
  9. int data[][2] = {
  10.   {6,10},
  11.   {0,14},
  12.   {9,10},
  13.   ...
  14. }
  15. */
  16.  
  17. LedControl lc = LedControl(7, 9, 8);
  18. const int rs = 12, en = 11, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
  19. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
  20.  
  21. int lx = 0;
  22. int ly = 0;
  23.  
  24. bool ledData[6][47] = {{false}};
  25.  
  26. void foldX(int line){
  27.   for (size_t i = 0; i < sizeof data/sizeof data[0] ; i++)
  28.     {
  29.         if(data[i][0] > line)
  30.           data[i][0] = line - (data[i][0] - line);
  31.     }
  32. }
  33.  
  34. void foldY(int line){
  35.   for (size_t i = 0; i < sizeof data/sizeof data[0] ; i++)
  36.   {
  37.       if(data[i][1] > line)
  38.         data[i][1] = line - (data[i][1] - line);
  39.   }
  40. }
  41.  
  42. int countDots(){
  43.  
  44.   size_t columns = sizeof data/sizeof data[0];
  45.   long unique[columns];
  46.   size_t index = 0;
  47.  
  48.   for (size_t i = 0; i < columns ; i++)
  49.   {
  50.       lx = max(lx,data[i][0]);
  51.       ly = max(ly,data[i][1]);
  52.       long hash = data[i][1]*columns + data[i][0];
  53.       bool isUnique = true;
  54.       for (size_t j = 0; j < index; j++)
  55.       {
  56.         if(hash == unique[j]){
  57.           isUnique = false;
  58.           break;
  59.         }
  60.       }
  61.       if(isUnique){
  62.         unique[index]=hash;
  63.         index++;
  64.       }      
  65.   }
  66.   return index;
  67. }
  68.  
  69. static int comp(const void* p1, const void* p2) {
  70.   int* arr1 = (int*)p1;
  71.   int* arr2 = (int*)p2;
  72.   int diff1 = arr1[1] - arr2[1];
  73.   if (diff1) return diff1;
  74.   return arr1[0] - arr2[0];
  75. }
  76.  
  77. void setleds(int offset){
  78.   for (size_t y = 0; y < 6; y++)
  79.   {
  80.     for (size_t x= 0; x < 8; x++)
  81.     {
  82.       int xPos = (x+offset)%47;
  83.       lc.setLed(0,y+1,x,ledData[y][xPos]);
  84.     }
  85.   }
  86. }
  87.  
  88. void setup() {
  89.  
  90.   Serial.begin(9600);
  91.   while(!Serial);
  92.  
  93.   lc.shutdown(0,false);
  94.   lc.setIntensity(0,8);
  95.   lc.clearDisplay(0);
  96.  
  97.   lcd.begin(16, 2);
  98.   lcd.setCursor(0, 0);
  99.   lcd.print(" HELLO REDDIT! ");
  100.   lcd.setCursor(0, 1);
  101.   lcd.print( " DAY 13 PART 2 " );
  102. /*
  103.   foldY(7);
  104.   foldX(5);
  105. */
  106.   foldX(655);
  107.   foldY(447);
  108.   foldX(327);
  109.   foldY(223);
  110.   foldX(163);
  111.   foldY(111);
  112.   foldX(81);
  113.   foldY(55);
  114.   foldX(40);
  115.   foldY(27);
  116.   foldY(13);
  117.   foldY(6);
  118.  
  119.   qsort(data,  sizeof(data) / sizeof(data[0]), sizeof(data[0]), comp);
  120.   int count = countDots();
  121.   int index = 0;
  122.   size_t columns = sizeof data/sizeof data[0];
  123.  
  124.   for (int y = 0; y <= ly; y++)
  125.   {
  126.     for (int x = 0; x <= lx; x++)
  127.     {
  128.       if(data[index][0] == x && data[index][1] == y){
  129.         Serial.print("#");
  130.         ledData[y][x+8] = true;
  131.         while(data[index][0] == x && data[index][1] == y)
  132.           index++;        
  133.       }
  134.       else{
  135.         Serial.print(" ");
  136.       }
  137.     }
  138.     Serial.println();
  139.   }
  140.  
  141.   for (size_t y = 0; y < 8; y++)
  142.   {
  143.     for (size_t x= 0; x < 8; x++)
  144.     {    
  145.       lc.setLed(0,8-y,x,true);
  146.     }
  147.     delay(100);
  148.   }
  149.  
  150.   delay(500);
  151.  
  152.   for (size_t y = 0; y < 8; y++)
  153.   {
  154.     for (size_t x= 0; x < 8; x++)
  155.     {    
  156.       lc.setLed(0,8-y,x,false);
  157.     }
  158.     delay(100);
  159.   }
  160.   lc.clearDisplay(0);
  161. }
  162.  
  163. int offset = 0;
  164.  
  165. void loop() {
  166.   setleds(offset++);
  167.   delay(150);
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement