大文字と小文字の反転

大文字・小文字の反転 - みずぴー日記にインスパイヤされて大文字と小文字を反転するプログラムを作ります。 元々はanarchy golf - invert caseからの問題です。 awk では何と 37 文字 (37 byte) でクリアされている方がいますが、ここではゴルフを行いません。

ここでは一度文字単位に分割し、それを大文字か小文字を判定し、大文字なら小文字に、小文字なら大文字に変換する手法をとります。

#! /usr/local/bin/nawk -f
# invert_caps.awk
# 大文字・小文字の反転をします
# usage: nawk -f invert_caps.awk str

BEGIN {
    str = ARGV[1];

    print invert_caps(str);
}

# invert_caps():    大文字と小文字を反転します
#   in:     文字列 (str)
#   out:    大文字と小文字の反転した文字列
function invert_caps(str,   num_str, arr_str, invert_str) {
    num_str = split(str, arr_str, "");

    for (i = 1; i <= num_str; i++) {
        if (is_lower(arr_str[i]) == 1) {
            invert_str = invert_str toupper(arr_str[i]);
        } else {
            invert_str = invert_str tolower(arr_str[i]);
        }
    }

    return invert_str;
}

# is_lower():   小文字かどうかを判定する
#   in:     文字列 (str)
#   out:    小文字なら 1、大文字なら 0
function is_lower(str, lower_str) {
    lower_str = tolower(str);

    if (lower_str == str && str !~ /[0-9]/) {
        return 1;
    } else {
        return 0;
    }
}

ここで is_lower() 関数は AWK Users JP :: 小文字の判定で一度使われたものです。

$ nawk -f invert_caps.awk Saito
sAITO

$ nawk -f invert_caps.awk \
    'http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_198'
HTTP://GAUC.NO-IP.ORG/AWK-USERS-JP/BLIS.CGI/dOUKAKUawk_198

もっと簡単に書けると思いますので、余力があればゴルフにチャレンジしてみてください。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png