Advertisement
Guest User

Untitled

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