Skip to content

Instantly share code, notes, and snippets.

@lbvf50mobile
Last active October 5, 2020 15:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lbvf50mobile/b5b23f60119aeea04b9aebbd7342d9f3 to your computer and use it in GitHub Desktop.
Save lbvf50mobile/b5b23f60119aeea04b9aebbd7342d9f3 to your computer and use it in GitHub Desktop.
Just PHP FUN 120.
<?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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment