- https://www.codewars.com/kata/5508249a98b3234f420000fb First Variation on Caesar Cipher.
Started at 20:45 05.10.2020 Monday Oct.
Finished at 22:02 05.10.2020 Monday Oct. (1hr 17minutes)
Started at 20:45 05.10.2020 Monday Oct.
Finished at 22:02 05.10.2020 Monday Oct. (1hr 17minutes)
<?php | |
// https://www.codewars.com/kata/5508249a98b3234f420000fb First Variation on Caesar Cipher. | |
function movingShift($s, $shift) { | |
$ch2n = ['A'=>1,'B'=>2,'C'=>3,'D'=>4,'E'=>5,'F'=>6,'G'=>7,'H'=>8,'I'=>9,'J'=>10,'K'=>11,'L'=>12,'M'=>13,'N'=>14,'O'=>15,'P'=>16,'Q'=>17,'R'=>18,'S'=>19,'T'=>20,'U'=>21,'V'=>22,'W'=>23,'X'=>24,'Y'=>25,'Z'=>26,]; | |
$n2ch = [1=>'A',2=>'B',3=>'C',4=>'D',5=>'E',6=>'F',7=>'G',8=>'H',9=>'I',10=>'J',11=>'K',12=>'L',13=>'M',14=>'N',15=>'O',16=>'P',17=>'Q',18=>'R',19=>'S',20=>'T',21=>'U',22=>'V',23=>'W',24=>'X',25=>'Y',26=>'Z',]; | |
$a = str_split($s); | |
$up = upcase_map($a); | |
$a = str_split(strtoupper($s)); | |
foreach($a as $k=>$v){ | |
if(preg_match('/[A-Z]/', $v)){ | |
$v = $n2ch[(($ch2n[$v] - 1) + $shift)%26 + 1]; | |
$a[$k] = $v; | |
} | |
$shift = ($shift + 1) %26; | |
} | |
$ans = crstr($a,$up); | |
$ret = splitter($ans); | |
return $ret; | |
} | |
function demovingShift($arr, $shift) { | |
$ch2n = ['A'=>1,'B'=>2,'C'=>3,'D'=>4,'E'=>5,'F'=>6,'G'=>7,'H'=>8,'I'=>9,'J'=>10,'K'=>11,'L'=>12,'M'=>13,'N'=>14,'O'=>15,'P'=>16,'Q'=>17,'R'=>18,'S'=>19,'T'=>20,'U'=>21,'V'=>22,'W'=>23,'X'=>24,'Y'=>25,'Z'=>26,]; | |
$n2ch = [1=>'A',2=>'B',3=>'C',4=>'D',5=>'E',6=>'F',7=>'G',8=>'H',9=>'I',10=>'J',11=>'K',12=>'L',13=>'M',14=>'N',15=>'O',16=>'P',17=>'Q',18=>'R',19=>'S',20=>'T',21=>'U',22=>'V',23=>'W',24=>'X',25=>'Y',26=>'Z',]; | |
$a = str_split(implode($arr)); | |
$up = upcase_map($a); | |
$a = str_split(strtoupper(implode($arr))); | |
foreach($a as $k=>$v){ | |
if(preg_match('/[A-Z]/', $v)){ | |
$v = $n2ch[( 26 + ($ch2n[$v] - 1) - $shift)%26 + 1]; | |
$a[$k] = $v; | |
} | |
$shift = ($shift + 1) %26; | |
} | |
$ans = crstr($a,$up); | |
return $ans; | |
} | |
function upcase_map($a){ | |
return array_map(function($x){ | |
return (bool) preg_match('/[A-Z]/',$x);},$a); | |
} | |
function crstr($a,$up){ | |
$ans = ""; | |
foreach($a as $k => $v){ | |
if(!$up[$k]) $v = strtolower($v); | |
$ans .= $v; | |
} | |
return $ans; | |
} | |
function splitter($str){ | |
$chunk = ceil(strlen($str)/5); | |
$ans = []; | |
while(strlen($str) >= $chunk) { | |
$ans[] = substr($str,0,$chunk); | |
$str = substr($str,$chunk); | |
} | |
if(strlen($str) > 0) $ans[] = $str; | |
while(count($ans) < 5) $ans[] = ""; | |
return $ans; | |
} |