13年前の投稿で解いたプログラミング問題をシェルで解いてみる

はじめに

もう13年も前になる記事がふと目に入って、今だったらどう解くかな?とやってみました。

検証環境

1
2
3
4
5
$ uname -moi
x86_64 MacBookPro16,1 Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.1.16(1)-release (x86_64-apple-darwin21.1.0)

問題

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(難易度 超簡単, 目標時間 10分以内)
与えられた英語の大文字で構成された文字列の中の文字を、与えられた数字の分だけ左にシフトさせなさい。たとえば、’C’を2つ左にシフトさせると’A’、’Z’を2つ左にシフトさせると’X’。
与えられる英語の文字列はAからZで、Aの次はZにシフトさせるものとする。

例1)

"VQREQFGT"
2
Returns: "TOPCODER"

例2)

"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
10
Returns: "QRSTUVWXYZABCDEFGHIJKLMNOP"

例3)

"TOPCODER"
0
Returns: "TOPCODER"

例4)

"LIPPSASVPH"
4
Returns: "HELLOWORLD"

解答

シェルで解いてみました。

main.sh

1
2
3
4
L=ABCDEFGHIJKLMNOPQRSTUVWXYZ

echo "$1" \
  | tr "${L}" "$(echo "${L}" | sed -E "s/^(.*)(.{${2}})$/\2\1/")"

実行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ ./main.sh "VQREQFGT" 2
TOPCODER

$ ./main.sh "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 10
QRSTUVWXYZABCDEFGHIJKLMNOP

$ ./main.sh "TOPCODER" 0
TOPCODER

$ ./main.sh "LIPPSASVPH" 4
HELLOWORLD

ひとこと

日々コーディングを横着しているから、だんだんシェルしかかけない頭になってきている気がしています。

老害にならないように努力したい。