Add++, 100 bytes
D,g,@,O91 65r$e
D,l,@,O123 97r$eBn
D,w,@~,S
D,f,@~,€gB]VAbU€lB]GBcB+32€*B]VAbU€OB]GBcB+€CJABc€wB@B+J
Try it online!
This is annoyingly long. Let's compare this answer to the current shortest, Dennis' Jelly answer:
żŒsQ€
Here, I've split it into three parts: ż
, Œs
and Q€
, highlighted to show the corresponding parts in the Add++ code, as so:
D,g,@,O91 65r$e
D,l,@,O123 97r$eBn
D,w,@~,S
D,f,@~,€gB]VAbU€lB]GBcB+32€*B]VAbU€OB]GBcB+€CJABc€wB@B+J
How it works
; A note on functions:
; Each function returns the value on the top of the stack
; A function has 'flags' that change its behaviour:
;
; @ - Specifies an argument to be taken
; ~ - Splats the arguments to the stack
D,u,@, ; Declare a monadic function 'u'
; Example argument: ['I']
O ; Ordinal; STACK = [73]
91 65r ; [65 ... 90]; STACK = [73 [65 66 ... 89 90]]
$e ; Contains? STACK = [1]
D,l,@, ; Declare a monadic function 'l'
; Example argument: ['i']
O ; Ordinal; STACK = [105]
123 97r ; [97 ... 122]; STACK = [105 [97 98 ... 121 122]]
$e ; Contains? STACK = [1]
Bn ; Negate; STACK = [-1]
D,w,@~, ; Declare a monadic function 'w'
; Example argument: [['N' 'n']]
S ; Deduplicate; STACK = [['N' 'n']]
D,f,@~, ; Declare a monadic function 'f'
; Example argument: ['N' 'i' 'c' 'e' '!']
€u ; Map 'u' over €ach; STACK = [1 0 0 0 0]
B] ; Wrap the stack; STACK = [[1 0 0 0 0]]
V ; Save; STACK = []
AbU ; Push argument; STACK = ['N' 'i' 'c' 'e' '!']
€l ; Map 'l' over €ach; STACK = [0 -1 -1 -1 0]
B] ; Wrap; STACK = [[0 -1 -1 -1 0]]
G ; Retrieve; STACK = [[0 -1 -1 -1 0] [1 0 0 0 0]]
BcB+ ; Column sums; STACK = [1 -1 -1 -1 0]
32€* ; Multiply €ach by 32; STACK = [32 -32 -32 -32 0]
B] ; Wrap; STACK = [[32 -32 -32 -32 0]]
V ; Save; STACK = []
AbU€OB] ; Codepoints of input; STACK = [[78 105 99 101 33]]
G ; Retrieve; STACK = [[78 105 99 101 33] [32 -32 -32 -32 0]]
BcB+ ; Column sums; STACK = [110 73 67 69 33]
€C ; Convert to chars; STACK = ['n' 'I' 'C' 'E' '!']
JABc ; Zip with argument; STACK = [['n' 'N'] ['I' 'i'] ['C' 'c'] ['E' 'e'] ['!' '!']]
€w ; Map 'w' over €ach; STACK = [['n' 'N'] ['I' 'i'] ['C' 'c'] ['E' 'e'] ['!']]
B@ ; Reverse each; STACK = [['N' 'n'] ['i' 'I'] ['c' 'C'] ['e' 'E'] ['!']]
B+ ; Sum each; STACK = ['Nn' 'iI' 'cC' 'eE' '!']
J ; Join; STACK = ['NniIcCeE!']