function! s:output() let this = {'lines': []} function! this.append(line) abort call add(self.lines, a:line) endfunction function! this.build() abort return join(self.lines, "\n") endfunction return this endfunction function! s:main(input) abort let o = s:output() let s = a:input[0] let r = [] let offset = char2nr('A') for i in range(strlen(s)) let ord = char2nr(s[i]) - offset let moved = (26 + ord - i % 26 - 1) % 26 let chr = nr2char(moved + offset) call add(r, chr) endfor call o.append(join(r, '')) return o.build() endfunction let s:input = getline(1, '$') enew put =s:main(s:input) 2,$print