Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Looking for devious one or two liner solutions to a problem



On Oct 10,  4:37pm, Kenneth Lareau wrote:
} Subject: Looking for devious one or two liner solutions to a problem
}
} In Perl, I was able to come up with the very simple function below:
} 
}    sub bump_version {
}        my ($vers, $ind) = @_;
} 
}        @vers = split /\./, $vers;
}        $vers[$ind] += 1;
}        for ($i = $ind + 1; $i < 4; $i++) {
}            $vers[$i] = 0;
}        }
} 
}        return join '.', @vers;
}    }

At the risk of turning this into a golf match ...

    sub bump_version {
      my @a = split(/\./, $_[0]);
      splice(@a, $_[1], 4, $a[$_[1]]+1, 0, 0, 0);
      join('.', @a[0..3]);
    }

In zsh you can do the same:

    bump_version() {
      local -a a; a=(${(s:.:)1})
      a[$2+1,4]=($[$a[$2+1]+1] 0 0 0)
      print ${(j:.:)${a[1,4]}}
    }

If you dispense with "local -a a;" that's 72 characters for the body,
and sticking f(){...} around it adds 5 for 77.

f(){a=(${(s:.:)1});a[$2+1,4]=($[$a[$2+1]+1] 0 0 0);print ${(j:.:)${a[1,4]}}}

If you assume "setopt ksharrays" you can cut it to 75:

f(){a=(${(s:.:)1});a[$2,3]=($[${a[$2]}+1] 0 0 0);print ${(j:.:)${a[0,3]}}}

And if you return the new version in $a (since you've already made it
non-local) and therefore don't bother printing it, 71 characters:

f(){a=(${(s:.:)1});a[$2,3]=($[${a[$2]}+1] 0 0 0);a=${(j:.:)${a[0,3]}}}



Messages sorted by: Reverse Date, Date, Thread, Author