Advertisement
Guest User

Untitled

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