Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
490
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.22 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Polcode Code Contest PHP-2010.10
  4.  *
  5.  * Data: 2010-11-03
  6.  * Nick: kaliberx
  7.  * Nazwisko: Dąbrowski
  8.  * Imię: Grzegorz
  9.  * Data urodzenia: 1981-xx-xx
  10.  * e-mail: grzxxxxx.dabxxxxxx@xxxxx.com
  11.  */
  12.  
  13. $input = $_SERVER['argv'][1];
  14. $length = strlen($input);
  15.  
  16. // DEKODOWANIE
  17. $rotChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  18. // cache danych aby dzialalo szybciej
  19. $rotPos = array(
  20.   'A' => 0, 'B' => 1, 'C' => 2, 'D' => 3, 'E' => 4, 'F' => 5, 'G' => 6,
  21.   'H' => 7, 'I' => 8, 'J' => 9, 'K' => 10, 'L' => 11, 'M' => 12, 'N' => 13,
  22.   'O' => 14, 'P' => 15, 'Q' => 16, 'R' => 17, 'S' => 18, 'T' => 19, 'U' => 20,
  23.   'V' => 21, 'W' => 22, 'X' => 23, 'Y' => 24, 'Z' => 25, '0' => 26, '1' => 27,
  24.   '2' => 28, '3' => 29, '4' => 30, '5' => 31, '6' => 32, '7' => 33, '8' => 34,
  25.   '9' => 35, 'a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4, 'f' => 5,
  26.   'g' => 6, 'h' => 7, 'i' => 8, 'j' => 9, 'k' => 10, 'l' => 11, 'm' => 12,
  27.   'n' => 13, 'o' => 14, 'p' => 15, 'q' => 16, 'r' => 17, 's' => 18, 't' => 19,
  28.   'u' => 20, 'v' => 21, 'w' => 22, 'x' => 23, 'y' => 24, 'z' => 25);
  29. $rotCount = 36;
  30.  
  31. $decoded = str_repeat(' ', $length);
  32. $a = 0;
  33. $b = $length;
  34. // ciag wejsciowy przetwarzamy znak po znaku
  35. for ($i = 0; $i < $length; $i++) {
  36.   // przy liczeniu ciagu fib od razu liczymy modulo aby nie przekroczyc
  37.   // zakresu liczb oraz wyznaczamy o ile przesunac znak aby zdekodowac
  38.   $rotN = ($a + $b) % $rotCount;
  39.   $a = $b;
  40.   $b = $rotN;
  41.  
  42.   // dla danego znaku wejsciowego odczytujemy jego pozycje na podstawie
  43.   // $rotPos, wyznaczamy nowa pozycje znaku i odczytujemy jego wartosc
  44.   $decoded[$i] = $rotChars[($rotPos[$input[$i]] - $rotN + $rotCount) % $rotCount];
  45. }
  46.  
  47. // parsowanie: mamy gwarancje, ze male litery nie wystepuja tutaj
  48. $ret = array();
  49. preg_match('/K([0-9]{1,2})/', $decoded, $matches);
  50. $inK = (int)$matches[1];
  51. preg_match('/W([0-9]{1,2})/', $decoded, $matches);
  52. $inW = (int)$matches[1];
  53. preg_match('/A([0-9])/', $decoded, $matches);
  54. $inA = (int)$matches[1];
  55. preg_match('/Z([0-9])/', $decoded, $matches);
  56. $inZ = (int)$matches[1];
  57.  
  58. // WSPOLNE ZMIENNE
  59. $inKxinW = $inK * $inW;
  60. $emptyRow = str_repeat("\n", $inK + 1);
  61. $fillLength = $inZ - $inA + 1;
  62. $mod = str_pad('', $inKxinW, substr('0123456789', $inA, $fillLength));
  63.  
  64. // RECT1
  65. // tablica wierszy
  66. $rows = array();
  67. // inicjalizacja
  68. for ($w = 0; $w < $inW; $w++) {
  69.   $rows[$w] = $emptyRow;
  70. }
  71.  
  72. // generowanie wierszy
  73. $w = 0;
  74. $k = -1;
  75. $dx = $inK;
  76. $dy = $inW - 1;
  77. $i = 0;
  78. $dir = 1;
  79. // dla kazdego elementu
  80. while ($i < $inKxinW) {
  81.   for ($j = 0; $j < $dx; $j++) {
  82.     $k += $dir;
  83.     $rows[$w][$k] = $mod[$i + $j];
  84.   }
  85.   $i += $dx;
  86.   for ($j = 0; $j < $dy; $j++) {
  87.     $w += $dir;
  88.     $rows[$w][$k] = $mod[$i + $j];
  89.   }
  90.   $i += $dy;
  91.   $dir = -$dir;
  92.   $dx--;
  93.   $dy--;
  94. }
  95. print implode('', $rows) . "\n";
  96.  
  97.  
  98. // RECT2
  99. $out = '';
  100. $str = str_split($mod, $inW);
  101. for ($k = 0; $k < $inK; $k++) {
  102.   if (!($k & 1)) {
  103.     $str[$k] = strrev($str[$k]);
  104.   }
  105. }
  106. // obrot o 90 stopni
  107. for ($w = 0; $w < $inW; $w++) {
  108.   for ($k = 0; $k < $inK; $k++) {
  109.     $emptyRow[$k] = $str[$k][$w];
  110.   }
  111.   $out .= $emptyRow;
  112. }
  113. print $out . "\n";
  114.  
  115.  
  116. // RECT3
  117. print wordwrap(strrev($mod), $inK, "\n", true) . "\n\n";
  118. //print implode("\n", str_split(strrev($mod), $inK)) . "\n\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement