Перл настолько могуч, насколько и необъятен, часть 2
Всем привет.
Прошлый мой пост вызвал интерес небывалого доселе размаха =). Думаю, что можно попробовать ввести такую традицию в наше сообщество, как «задачки по средам».
Главное, чтобы это были несложные задачки, которые было интересно решать всем, а не только опытным программистам. Язык реализации, конечно, Perl.
Итак, задачка на сегодня: есть некое число, заранее неизвестное. Если это число оказывается дробным, то необходимо выделить из него целую часть и эту целую часть увеличить на 1.
Все, вроде бы, проще некуда.
UPD:
Всем большое спасибо за участие, вот список решений, которые оставлены были в каментах:
Пользователь sharifulin предлагает такое решение:
use common::sense; my $n = 1.229; my $n = 4; say 1 + $1 if $n =~ /(\d+)\./; # simple and good! say $n =~ /(\d+)\./ && $1 + 1; # not pretty :)
Ссылка кода на гитхабе: https://gist.github.com/775890
Еще есть такое решение, например:
use POSIX qw/ceil/; my $n = 1.3; my $rounded = ceil $n;
Три варианта от zloyrusskiy :
perl -E '$_ = 1.1; say int != $_ ? 1 + int : $_ '
use autobox::Core; my $n = 1.1; $n = $n->int->add(1) unless $n->is_int; $n->say;
use 5.012; sub strange_func { int $_[0] != $_[0] ? 1 + int $_[0] : $_[0] } my $n = 1.1; say strange_func $n;
Еще несколько вариантов предложил awkward :
$_ = 1.5; s/^(\d+)\.\d+$/$1+1/e; print;
$_ = 2.5; my @a = split /\./; @a > 1 and $_ = $a[0] + 1; print;
$_ = 1.2; print /\./ ? $` + 1 : $_;
И даже так:
$_ = 3.2; print qx! ruby -e "print $_.ceil" !;
Еще варианты? ;-)))»

shootnix
Комментарии
golf style:
perl -E '$_ = 1.1; say int != $_ ? 1 + int : $_ '
python style:
use autobox::Core;
my $n = 1.1;
$n = $n->int->add(1) unless $n->is_int;
$n->say;
Вариант который более логичный, но понятен только людям хорошо знакомыми с Perl (Ха-ха, прочитал вариант Александра, у него действительно намного логичнее и короче):
use 5.012;
sub strange_func { int $_[0] != $_[0] ? 1 + int $_[0] : $_[0] }
my $n = 1.1;
say strange_func $n;
s/^(\\d+)\\.\\d+$/$1+1/e;
print;
my @a = split /\\./;
print $_ = @a > 1 ? $a[0] + 1 : $_;
$_ = 2.5;
my @a = split /\\./;
@a > 1 and $_ = $a[0] + 1;
print;
Или так :D
$_ = 3.2;
print qx! ruby -e "print $_.ceil" !;
print /\\./ ? $` + 1 : $_;
$_ = 3.1;
$_++ if s/\\..*//;
print;