Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Polcode Code Contest PHP-2010.10
- *
- * Data: 2010-11-03
- * Nick: kaliberx
- * Nazwisko: Dąbrowski
- * Imię: Grzegorz
- * Data urodzenia: 1981-xx-xx
- * e-mail: grzxxxxx.dabxxxxxx@xxxxx.com
- */
- $input = $_SERVER['argv'][1];
- $length = strlen($input);
- // DEKODOWANIE
- $rotChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
- // cache danych aby dzialalo szybciej
- $rotPos = array(
- 'A' => 0, 'B' => 1, 'C' => 2, 'D' => 3, 'E' => 4, 'F' => 5, 'G' => 6,
- 'H' => 7, 'I' => 8, 'J' => 9, 'K' => 10, 'L' => 11, 'M' => 12, 'N' => 13,
- 'O' => 14, 'P' => 15, 'Q' => 16, 'R' => 17, 'S' => 18, 'T' => 19, 'U' => 20,
- 'V' => 21, 'W' => 22, 'X' => 23, 'Y' => 24, 'Z' => 25, '0' => 26, '1' => 27,
- '2' => 28, '3' => 29, '4' => 30, '5' => 31, '6' => 32, '7' => 33, '8' => 34,
- '9' => 35, 'a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4, 'f' => 5,
- 'g' => 6, 'h' => 7, 'i' => 8, 'j' => 9, 'k' => 10, 'l' => 11, 'm' => 12,
- 'n' => 13, 'o' => 14, 'p' => 15, 'q' => 16, 'r' => 17, 's' => 18, 't' => 19,
- 'u' => 20, 'v' => 21, 'w' => 22, 'x' => 23, 'y' => 24, 'z' => 25);
- $rotCount = 36;
- $decoded = str_repeat(' ', $length);
- $a = 0;
- $b = $length;
- // ciag wejsciowy przetwarzamy znak po znaku
- for ($i = 0; $i < $length; $i++) {
- // przy liczeniu ciagu fib od razu liczymy modulo aby nie przekroczyc
- // zakresu liczb oraz wyznaczamy o ile przesunac znak aby zdekodowac
- $rotN = ($a + $b) % $rotCount;
- $a = $b;
- $b = $rotN;
- // dla danego znaku wejsciowego odczytujemy jego pozycje na podstawie
- // $rotPos, wyznaczamy nowa pozycje znaku i odczytujemy jego wartosc
- $decoded[$i] = $rotChars[($rotPos[$input[$i]] - $rotN + $rotCount) % $rotCount];
- }
- // parsowanie: mamy gwarancje, ze male litery nie wystepuja tutaj
- $ret = array();
- preg_match('/K([0-9]{1,2})/', $decoded, $matches);
- $inK = (int)$matches[1];
- preg_match('/W([0-9]{1,2})/', $decoded, $matches);
- $inW = (int)$matches[1];
- preg_match('/A([0-9])/', $decoded, $matches);
- $inA = (int)$matches[1];
- preg_match('/Z([0-9])/', $decoded, $matches);
- $inZ = (int)$matches[1];
- // WSPOLNE ZMIENNE
- $inKxinW = $inK * $inW;
- $emptyRow = str_repeat("\n", $inK + 1);
- $fillLength = $inZ - $inA + 1;
- $mod = str_pad('', $inKxinW, substr('0123456789', $inA, $fillLength));
- // RECT1
- // tablica wierszy
- $rows = array();
- // inicjalizacja
- for ($w = 0; $w < $inW; $w++) {
- $rows[$w] = $emptyRow;
- }
- // generowanie wierszy
- $w = 0;
- $k = -1;
- $dx = $inK;
- $dy = $inW - 1;
- $i = 0;
- $dir = 1;
- // dla kazdego elementu
- while ($i < $inKxinW) {
- for ($j = 0; $j < $dx; $j++) {
- $k += $dir;
- $rows[$w][$k] = $mod[$i + $j];
- }
- $i += $dx;
- for ($j = 0; $j < $dy; $j++) {
- $w += $dir;
- $rows[$w][$k] = $mod[$i + $j];
- }
- $i += $dy;
- $dir = -$dir;
- $dx--;
- $dy--;
- }
- print implode('', $rows) . "\n";
- // RECT2
- $out = '';
- $str = str_split($mod, $inW);
- for ($k = 0; $k < $inK; $k++) {
- if (!($k & 1)) {
- $str[$k] = strrev($str[$k]);
- }
- }
- // obrot o 90 stopni
- for ($w = 0; $w < $inW; $w++) {
- for ($k = 0; $k < $inK; $k++) {
- $emptyRow[$k] = $str[$k][$w];
- }
- $out .= $emptyRow;
- }
- print $out . "\n";
- // RECT3
- print wordwrap(strrev($mod), $inK, "\n", true) . "\n\n";
- //print implode("\n", str_split(strrev($mod), $inK)) . "\n\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement