Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.66 KB | None | 0 0
  1. #include <array>
  2. #include <string>
  3. #include <vector>
  4. #include <iostream>
  5. #include <sstream>
  6. #include <cstring>
  7. #include <vector>
  8.  
  9. ///Kedves Csaba! Örülök, hogy látlak! Hogy vagy?
  10. ///Had vezesseleg végig egy csodálatos utazáson, ami alatt metanulod, hogy mi mit csinál ebben a programban.
  11. int seed = 111;
  12.  
  13.  
  14. char verzio[20] = "69";
  15. unsigned int alaprouter; ///A mi routerünk poziciója
  16. bool finishMode = 0; ///True, kaptunk már legalább 1 üres packet-et
  17. bool egyvegy = false;
  18.  
  19. bool createLeft = 1; ///Create-kor mindig átállítjuk. Jobbra/balra indul a packet.
  20. int lowestEmptyPacket = 9999; ///A legalacsonyabb indexü packet, ami üresen jött
  21. int maxcreate;
  22. ///Innen változatlan
  23. enum class Direction : char
  24. {
  25. LEFT = 'l',
  26. RIGHT = 'r'
  27. };
  28.  
  29.  
  30. struct Data
  31. {
  32. unsigned int currRouter;
  33. unsigned int currStoreId;
  34. unsigned int dataIndex;
  35. unsigned int messageId;
  36. unsigned int fromRouter;
  37. unsigned int toRouter;
  38. char gravity[3];
  39. Direction dir;
  40. };
  41.  
  42. struct MessagePiece
  43. {
  44. int index;
  45. std::string message;
  46.  
  47. };
  48. std::vector<MessagePiece>azenyem;
  49. void swap(MessagePiece* xp, MessagePiece* yp)
  50. {
  51. MessagePiece temp = *xp;
  52. *xp = *yp;
  53. *yp = temp;
  54. }
  55. struct Reader
  56. {
  57. std::array<unsigned int, 3> data;
  58. std::string previous;
  59. std::array<std::array<bool, 10>, 14> routerBits;
  60. std::vector<Data> dataArray;
  61. std::vector<MessagePiece> receivedPieces; ///letarolando, rendezendo
  62. bool hasEnd;
  63. };
  64.  
  65. ///Eddig változatlan
  66.  
  67. ///Possible action egy lehetséges lépés
  68. struct PossibleAction
  69. {
  70. PossibleAction(char c, int i)
  71. {
  72. action = c;
  73. moveRouter = i;
  74. value = 0;
  75. }
  76. ///Ha ez felfele, vagy lefele mutat, akkor egy mozgatás
  77. ///Ebben az esetben a moveRouter a mozgatandó router ID-ja
  78.  
  79. ///Ha c, akkor create
  80. ///Ilyenkor a createSlot tárolja az alaprouter slot-ját, ahol létre akarjuk hozni a packetet
  81. char action; //^, v, c
  82. union
  83. {
  84. int moveRouter;
  85. int createSlot;
  86. };
  87.  
  88. ///Ez lényegében egy return erték. A szimuláló függvény itt adja vissza, hogy mennyire jó nekünk az adott lépés
  89. ///Nagyobb = jobb
  90. int value;
  91. };
  92.  
  93. ///Ez a szimuláló függvény. Ne nézd az angol kommenteket, azok nekem vannak.
  94. ///A függvény megkapja a pálya állását és egy választott lehetséges akciót.
  95. ///Az akció value értékébe számolja ki a hasznossságát
  96. void simulateAction(std::array < std::array<bool, 10>, 14> routerBits, std::vector<Data> originalPackets, PossibleAction& pa)
  97. {
  98. ///Baszakodni akarunk a vektorban, de nem akarjuk az eredetit szétbaszni, ezért itt egy copy
  99. ///Copy vector
  100. std::vector<Data> packets(originalPackets);
  101.  
  102. ///Hosszabb utakon nagyobb az esélye hogy elvág a gép a saját mozgatásával
  103. ///Ezért sok kicsi haladás jobb, mint egy nagy
  104. ///Ez a tömb azt tárolja, hogy a 8 packet közül melyik mozgott. Több = jobb.
  105. ///Diversify. Each moving by 1 is better than 1 moving by 4.
  106. bool couldMove[8] = { 0 };
  107.  
  108. ///Könnyebb egy 2D tömbben dolgozni mint a routerbitsekkel
  109. ///Ebben a tömbben a '-' szabad slot, # foglalt slot, és egy szám egy packet által foglalt slot
  110. ///Most csak a routerbits-t töltjük bele
  111. ///Copy data into an array
  112. char state[14][10];
  113. for (int i = 0; i < 14; i++)
  114. for (int j = 0; j < 10; j++)
  115. state[i][j] = (routerBits[i][j]) ? '-' : '#'; //- open, #blocked
  116.  
  117. ///Ha a választott akció egy create, akkor elkészítjük a packetet a szimulálás előtt
  118. ///Generate a hypothetical packet?
  119. if (pa.action == 'c')
  120. {
  121. Data addition;
  122. addition.currRouter = alaprouter;
  123. addition.currStoreId = pa.createSlot;
  124. addition.dir = createLeft ? Direction::LEFT : Direction::RIGHT;
  125. addition.fromRouter = alaprouter;
  126. addition.toRouter = (alaprouter + 7) % 14;
  127. packets.push_back(addition);
  128. }
  129.  
  130. ///Minden packetet betöltünk az előbb említett tömbbe
  131. ///Store packets
  132. for (int i = 0; i < packets.size(); i++)
  133. state[packets[i].currRouter][packets[i].currStoreId] = '0' + i;
  134.  
  135. ///Ha a választott akció egy fel/le mozgatás, akkor ezt elvégezzük a tömbben.
  136. ///Todo szólj nekem hogy nézzem meg hogy nem-e %10 kell %14 helyett
  137. ///Shift packets?
  138. char temp;
  139. if (pa.action == '^') ///Ha felfele akarunk mozgatni
  140. {
  141. temp = state[pa.moveRouter][0];
  142. for (int i = 0; i < 9; i++)
  143. state[pa.moveRouter][i] = state[pa.moveRouter][i + 1];
  144. state[pa.moveRouter][9] = temp;
  145.  
  146. for (int i = 0; i < 10; i++)
  147. if (state[pa.moveRouter][i] >= '0' && state[pa.moveRouter][i] <= '9')
  148. {
  149. packets[state[pa.moveRouter][i] - '0'].currStoreId = (packets[state[pa.moveRouter][i] - '0'].currStoreId - 1) % 10;
  150. if (packets[state[pa.moveRouter][i] - '0'].fromRouter != alaprouter)
  151. pa.value = -1;
  152. }
  153.  
  154. }
  155. else if (pa.action == 'v') ///Ugyanaz, lefele
  156. {
  157. temp = state[pa.moveRouter][9];
  158. for (int i = 9; i > 0; i--)
  159. state[pa.moveRouter][i] = state[pa.moveRouter][i - 1];
  160. state[pa.moveRouter][0] = temp;
  161.  
  162. for (int i = 0; i < 10; i++)
  163. if (state[pa.moveRouter][i] >= '0' && state[pa.moveRouter][i] <= '9')
  164. {
  165. packets[state[pa.moveRouter][i] - '0'].currStoreId = (packets[state[pa.moveRouter][i] - '0'].currStoreId + 1) % 10;
  166. if (packets[state[pa.moveRouter][i] - '0'].fromRouter != alaprouter)
  167. pa.value = -1;
  168. }
  169.  
  170. }
  171. ///Megjegyzés: mivel a 2D tömbünk char-okat tárol, '0' kivonásával kaphatunk számokat ('5' - '0' = 5)
  172.  
  173.  
  174. ///Itt elkezdjük szimulálni.
  175. ///Ez a szimuláció csak a mi lépésünket feltételezi, nem számol az ellenségével
  176. ///Todo ezen lehet javítani
  177. ///Start simulating
  178. while (true)
  179. {
  180. togo:
  181. ///Ez a kódrészlet felel azért, hogy automatikusan felfele csússzanak a packetek.
  182. ///Automatic upwards shift
  183. for (int i = 0; i < packets.size(); i++)
  184. if (packets[i].currStoreId > 0 && state[packets[i].currRouter][packets[i].currStoreId - 1] == '-')
  185. {
  186.  
  187. state[packets[i].currRouter][packets[i].currStoreId - 1] = '0' + i;
  188.  
  189. state[packets[i].currRouter][packets[i].currStoreId] = '-';
  190.  
  191. packets[i].currStoreId--;
  192.  
  193. goto togo;
  194. }
  195.  
  196. ///Ez pedig az oldalra mozgás
  197. ///Automatic movement
  198. for (int i = 0; i < packets.size(); i++)
  199. {
  200.  
  201. int direction = 1;
  202. if (packets[i].dir == Direction::LEFT)
  203. direction = -1;
  204.  
  205. if (packets[i].currRouter != packets[i].toRouter && state[(int(packets[i].currRouter) + direction) % 14][packets[i].currStoreId] == '-')
  206. {
  207.  
  208. state[(int(packets[i].currRouter) + direction) % 14][packets[i].currStoreId] = '0' + i;
  209. state[packets[i].currRouter][packets[i].currStoreId] = '-';
  210. packets[i].currRouter = (int(packets[i].currRouter) + direction) % 14;
  211. if (packets[i].fromRouter == alaprouter)
  212. {
  213. pa.value++; ///increment action's usefulness
  214. couldMove[i] = 1;
  215. }
  216.  
  217.  
  218. goto togo;
  219.  
  220. }
  221. }
  222.  
  223.  
  224. ///A while minden körében először a felfele csúszást nézi, és csak utána az oldalra valót.
  225. ///Ha egyik sem történt meg, kilép
  226. ///Todo kurva felesleges idea while
  227. break;
  228. }
  229.  
  230. ///Emlékszel erre a 8 emelmű lófaszra?
  231. ///Ha 3 különböző packetünk mozgott, +3 pontot adunk az akciónak, stb.
  232. for (int i = 0; i < 8; i++)
  233. if (couldMove[i])
  234. pa.value++;
  235. }
  236. bool Parbaj_e(std::array < std::array<bool, 10>, 14> routerBits)
  237. {
  238. bool parbaj = false;
  239.  
  240. for (int i = 0; i < 9; i++)
  241. {
  242. int hanytorlasz = 0;
  243. for (int j = 0; j < 14; j++)
  244. {
  245. if (routerBits[i][j] == 0)
  246. {
  247. hanytorlasz++;
  248. }
  249. }
  250. if (hanytorlasz > 2)
  251. {
  252. return true;
  253. }
  254. }
  255. return false;
  256. }
  257. ///Innen megint ismerős
  258. void readData(Reader& to)
  259. {
  260. std::string line;
  261. to.dataArray.clear();
  262. /// to.receivedPieces.clear();
  263.  
  264. while (std::getline(std::cin, line))
  265. {
  266. std::cerr << line;
  267. if (!line.rfind(".", 0))
  268. return;
  269.  
  270. if (!line.rfind("WRONG", 0) ||
  271. !line.rfind("SCORE", 0) ||
  272. !line.rfind("TICK", 0))
  273. {
  274. to.hasEnd = true;
  275. std::cerr << "##end1\n" << line << "\n";
  276. to.previous = std::move(line);
  277. }
  278. else if (!line.rfind("REQUEST", 0))
  279. {
  280. std::stringstream(std::move(line).substr(8)) >> to.data[0] >> to.data[1] >> to.data[2];
  281. alaprouter = to.data[2];
  282. }
  283. else if (!line.rfind("PREVIOUS", 0))
  284. {
  285. to.previous = std::move(line).substr(9);
  286. }
  287. else if (!line.rfind("ROUTER", 0))
  288. {
  289. unsigned int routerIndex;
  290. std::istringstream(line.substr(7)) >> routerIndex >> line;
  291. auto it = line.begin();
  292. for (bool& routers : to.routerBits[routerIndex])
  293. routers = *it++ == '1';
  294. }
  295. else if (!line.rfind("DATA", 0))
  296. {
  297. Data curr;
  298. std::istringstream(std::move(line).substr(5))
  299. >> curr.currRouter
  300. >> curr.currStoreId
  301. >> curr.dataIndex
  302. >> curr.messageId
  303. >> curr.fromRouter
  304. >> curr.toRouter
  305. >> reinterpret_cast<char&>(curr.dir)
  306. >> curr.gravity;
  307.  
  308. to.dataArray.push_back(curr);
  309. }
  310. else if (!line.rfind("MESSAGE"))
  311. {
  312.  
  313. MessagePiece msg;
  314.  
  315. std::istringstream(std::move(line).substr(8)) >> msg.index >> msg.message;
  316.  
  317.  
  318. std::cerr << msg.message << "__" << msg.message.size() << "\n";
  319. if (msg.message.size() == 0)
  320. {
  321. ///Ha bejött egy 0-ás packet, akkor finishMode - többet nem create-ezünk
  322. ///A lowestEmptyPacket-ről szóló rész okkal van kikommentelve, ne foglalkozz vele
  323. finishMode = 1;
  324. if (msg.index < lowestEmptyPacket)
  325. lowestEmptyPacket = msg.index;
  326. std::cerr << "Finish Mode Started\n";
  327.  
  328.  
  329. }
  330.  
  331. to.receivedPieces.push_back(msg);
  332.  
  333. ///Ha finishmode-ban vagyunk és nincs tőlünk packet a pályán, befejezzük a játékot
  334. ///If only enemy packets left, end the game
  335. bool vegem = true;
  336. bool belep2 = true;
  337. for (int i = 0; i < to.dataArray.size(); i++)
  338. {
  339. belep2 = true;
  340. if (to.dataArray[i].fromRouter == alaprouter /*&& to.dataArray[i].dataIndex < lowestEmptyPacket*/) ///causes loss of empty packets, bad score
  341. {
  342. vegem = false;
  343.  
  344. }
  345. }
  346. if (vegem && belep2 && finishMode)
  347. {
  348. to.hasEnd = true;
  349. std::cerr << "##end2\n";
  350. }
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357. ///
  358.  
  359. ///
  360. azenyem.push_back(msg);
  361.  
  362.  
  363. }
  364. else
  365. {
  366. std::cerr << "READER ERROR HAPPENED: unrecognized command line: " << line << std::endl;
  367. to.hasEnd = true;
  368. return;
  369. }
  370. }
  371. std::cerr << "Unexpected input end." << std::endl;
  372. to.hasEnd = true;
  373. std::cerr << "##end3\n";
  374. }
  375.  
  376. int main()
  377. {
  378. std::cerr << "main\n";
  379. char teamToken[] = "tqEzVLvbq6wz_uWr6HS1";
  380.  
  381. int befutott = 0;
  382. std::string solution;
  383. std::cout << "START " << teamToken
  384. << " " << seed << " " << verzio << " " << "1v1"
  385. << std::endl;
  386.  
  387. Reader reader = {};
  388.  
  389. std::string command;
  390.  
  391. int nextCreateIndex = 0; ///A régi "faszpicsa", ez tárolja a következő kiküldendő packet indexét
  392.  
  393.  
  394.  
  395. while (true)
  396. {
  397. readData(reader);
  398. egyvegy = Parbaj_e(reader.routerBits);
  399. if (egyvegy == 1)
  400. {
  401. maxcreate = 4;
  402. }
  403. if (egyvegy == 0)
  404. {
  405. maxcreate = 3;
  406. }
  407.  
  408. if (reader.hasEnd || reader.receivedPieces.size() > 100)
  409. {
  410. std::cerr << "##end4\n";
  411. break;
  412. }
  413.  
  414. for (int i = 0; i < reader.dataArray.size(); i++)
  415. {
  416. std::cerr << "DATA " << reader.dataArray[i].currRouter << " " << reader.dataArray[i].currStoreId << " " << reader.dataArray[i].dataIndex << reader.dataArray[i].messageId << " " << reader.dataArray[i].fromRouter << " " << reader.dataArray[i].toRouter << " " << ((char)reader.dataArray[i].dir) << "/n";
  417. }
  418. for (int i = 0; i < 10; i++)
  419. {
  420. std::cerr << "ROUTER ";
  421. for (int j = 0; j < 14; j++)
  422. {
  423. std::cerr << reader.routerBits[i][j];
  424. }
  425. std::cerr << "/n";
  426. }
  427. ///**************************************************************
  428. ///Ugyanaz a számolás, a bitjeim a pályán lévő saját packetek száma
  429. ///Count our active packets
  430. int bitjeim = 0;
  431. for (int i = 0; i < reader.dataArray.size(); i++)
  432. if (reader.dataArray[i].fromRouter == alaprouter)
  433. bitjeim++;
  434.  
  435. ///A vectorban tároljuk az összes lehetséges lépésünket.
  436. ///Nincs olyan kurva sok, max 4 db. felfele mozgatás, 4 db. lefele, és kb. 5 create
  437. std::vector<PossibleAction> posActs;
  438.  
  439. ///Ha <4 packetünk van és még akarunk Create-elni
  440. ///If we can create
  441. if (bitjeim < maxcreate && !finishMode)
  442. {
  443. for (int i = 0; i < 9; i++) ///Végigmegyünk a slotokon
  444. {
  445.  
  446. if (reader.routerBits[alaprouter][i] == 1) ///Ha nem blockoja "piros" routerbit
  447. {
  448. bool slotEmpty = 1;
  449. for (int j = 0; j < reader.dataArray.size(); j++) ///És nem blockolja más packet sem
  450. {
  451. if (reader.dataArray[j].currStoreId == i && reader.dataArray[j].currRouter == alaprouter)
  452. {
  453. slotEmpty = 0;
  454. break;
  455. }
  456. }
  457.  
  458. if (slotEmpty)
  459. {
  460. ///Akkor lehetséges a Create
  461. PossibleAction pa('c', i);
  462. pa.value += 5 * (4 - bitjeim); ///Manuálisan hozzáadunk pár pontot mert jó, ha 4/4 packetünk van a pályán
  463. simulateAction(reader.routerBits, reader.dataArray, pa); ///Leszimuláljuk
  464. posActs.push_back(pa); ///Eltároljuk
  465.  
  466. }
  467.  
  468.  
  469. }
  470.  
  471.  
  472. }
  473. }
  474. ///Ennyi volt a Create. Itt jönnek a mozgások
  475. ///All possible movements
  476. for (int i = 0; i < reader.dataArray.size(); i++)
  477. {
  478.  
  479. if (reader.dataArray[i].fromRouter == alaprouter) ///Végigmegyünk az összes saját packeten
  480. {
  481. ///Leszimuláljuk a router felfele és lefele való mozgatását, eltároljuk
  482. PossibleAction pa1('^', reader.dataArray[i].currRouter);
  483.  
  484. simulateAction(reader.routerBits, reader.dataArray, pa1);
  485.  
  486. posActs.push_back(pa1);
  487.  
  488.  
  489. PossibleAction pa2('v', reader.dataArray[i].currRouter);
  490. simulateAction(reader.routerBits, reader.dataArray, pa2);
  491. posActs.push_back(pa2);
  492.  
  493. ///Igen, ha két packet ugyanazon a routeren van, akkor kétszer szimuláljuk ugyanazt a lépést, de kurvára nem számít
  494.  
  495. }
  496.  
  497. }
  498.  
  499.  
  500. ///Emlékszel a PossibleAction value értékére? Az alapján a legjobbat kiválasztjuk
  501. ///Pick best possible action
  502. int bestID = 0;
  503. for (int i = 1; i < posActs.size(); i++) ///todo if size() = 0 pass
  504. if (posActs[i].value > posActs[bestID].value)
  505. bestID = i;
  506.  
  507.  
  508. ///Run best possible action
  509. PossibleAction& pa = (posActs[bestID]); ///Csak hogy kevesebbet kelljen írni
  510.  
  511. ///A legjobb Possible Action tárolja az utasítást. c/^/v, és a számot. Ezt futtatjuk parancsként.
  512. if (pa.action == 'c')
  513. {
  514. command = "CREATE " + std::to_string(pa.createSlot) + " " + std::to_string(nextCreateIndex++);
  515. createLeft = !createLeft;
  516. }
  517. else if (pa.action == '^' || pa.action == 'v')
  518. {
  519. command = "MOVE " + std::to_string(pa.moveRouter) + " " + pa.action;
  520. }
  521.  
  522. std::cerr << "RUNCOMMAND0";
  523.  
  524.  
  525. std::cout << reader.data[0] << " " << reader.data[1] << " " << reader.data[2] << " " << command << std::endl;
  526. std::cerr << "." << finishMode << "Command: " << command << "\n";
  527. }
  528.  
  529. /*
  530. for(int i=0; i<azenyem.size(); i++)
  531. {
  532. std::cerr<<azenyem[i].message<<" "<<azenyem[i].index<<std::endl;
  533. }*/
  534.  
  535. ///Ez még mindig a te sortod
  536. ///Sort
  537. for (long unsigned int i = 0; i < azenyem.size() - 1; i++)
  538. {
  539. for (long unsigned int j = 0; j < azenyem.size() - i - 1; j++)
  540. {
  541. if (azenyem[j].index > azenyem[j + 1].index)
  542. {
  543. swap(&azenyem[j], &azenyem[j + 1]);
  544. }
  545. }
  546. }
  547. ///Megoldás kiiratása
  548. std::cerr << "Betaprotokol " << std::endl;
  549. for (int i = 0; i < azenyem.size(); i++)
  550. {
  551. std::cerr << azenyem[i].message << " " << azenyem[i].index << std::endl;
  552. solution = solution + azenyem[i].message;
  553. }
  554. ///************************
  555. std::cerr << "Betaprotokol " << std::endl;
  556.  
  557.  
  558.  
  559. command = "SOLUTION ";
  560. std::cout << reader.data[0] << " " << reader.data[1] << " " << reader.data[2] << " " << command << solution << std::endl;
  561. std::cerr << reader.data[0] << " " << reader.data[1] << " " << reader.data[2] << " " << command << solution << std::endl;
  562. std::cout << "END (latest message): " << reader.previous << std::endl;
  563. std::cerr << "END (latest message): " << reader.previous << std::endl;
  564. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement