PowerShell, 154 , 152 , 99 , 86 bytes
Gracias @TimmyD por ahorrarme la friolera de 47 bytes (también guardé 6 adicionales)
Gracias @TessellatingHeckler por guardar 13 bytes adicionales.
Último:
param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})
Original:
param($a);$x=0;(($a[-1..-$a.length])|%{$_=$_.tostring().tolower();if([regex]::matches($a,"[A-Z]").index-contains$x){$_.toupper()}else{$_};$x++})-join''
Formato normal:
Lo último (se ve mejor como dos líneas en mi opinión):
param($a)
-join($a[$a.length..0] | %{("$_".ToLower(), "$_".ToUpper())[$a[$i++] -in 65..90]})
Explicación:
param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})
param($a)
# Sets the first passed parameter to variable $a
-join( )
# Converts a char array to a string
$a[$a.length..0]
# Reverses $a as a char array
|%{ }
# Shorthand pipe to foreach loop
("$_".ToLower(),"$_".ToUpper())
# Creates an array of the looped char in lower and upper cases
[$a[$i++]-in65..90]
# Resolves to 1 if the current index of $a is upper, which would output "$_".ToUpper() which is index 1 of the previous array
Original:
param($a)
$x = 0
(($a[-1..-$a.length]) | %{
$_ = $_.tostring().tolower()
if([regex]::matches($a,"[A-Z]").index -contains $x){
$_.toupper()
}else{
$_
}
$x++
}
) -join ''
El póster por primera vez aquí, estaba motivado porque rara vez veo PowerShell, pero con 154 152 bytes en este ... ¡Puedo ver por qué! Cualquier sugerencia apreciada.
¡He aprendido que debo cambiar completamente mi forma de pensar al golf en código y es divertido!