Перл настолько могуч, насколько и необъятен, часть 2

Всем привет.

Прошлый мой пост вызвал интерес небывалого доселе размаха =). Думаю, что можно попробовать ввести такую традицию в наше сообщество, как «задачки по средам».

Главное, чтобы это были несложные задачки, которые было интересно решать всем, а не только опытным программистам. Язык реализации, конечно, Perl.

Итак, задачка на сегодня: есть некое число, заранее неизвестное. Если это число оказывается дробным, то необходимо выделить из него целую часть и эту целую часть увеличить на 1.

Все, вроде бы, проще некуда.

UPD:

Всем большое спасибо за участие, вот список решений, которые оставлены были в каментах:

Пользователь sharifulin предлагает такое решение:

  1. use common::sense;
  2.  
  3. my $n = 1.229;
  4. my $n = 4;
  5.  
  6. say 1 + $1 if $n =~ /(\d+)\./; # simple and good!
  7.  
  8. say $n =~ /(\d+)\./ && $1 + 1; # not pretty :)

Ссылка кода на гитхабе: https://gist.github.com/775890

Еще есть такое решение, например:

  1. use POSIX qw/ceil/;
  2.  
  3. my $n = 1.3;
  4. my $rounded = ceil $n;

Три варианта от zloyrusskiy :

  1. perl -E '$_ = 1.1; say int != $_ ? 1 + int : $_ '
  1. use autobox::Core;
  2. my $n = 1.1;
  3. $n = $n->int->add(1) unless $n->is_int;
  4. $n->say;
  1. use 5.012;
  2.  
  3. sub strange_func { int $_[0] != $_[0] ? 1 + int $_[0] : $_[0] }
  4.  
  5. my $n = 1.1;
  6. say strange_func $n;

Еще несколько вариантов предложил awkward :

  1. $_ = 1.5;
  2. s/^(\d+)\.\d+$/$1+1/e;
  3. print;
  1. $_ = 2.5;
  2. my @a = split /\./;
  3. @a > 1 and $_ = $a[0] + 1;
  4. print;
  1. $_ = 1.2;
  2. print /\./ ? $` + 1 : $_;

И даже так:

  1. $_ = 3.2;
  2. print qx! ruby -e "print $_.ceil" !;

Еще варианты? ;-)))»

12 января, 13:14
872

Комментарии

три варианта:

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;
$_ = 1.5;
s/^(\\d+)\\.\\d+$/$1+1/e;
print;
$_ = 2.5;
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" !;
3-й вариант хорош, но требует соблюсти некую зависимость… =)))
Да, но ведь модули autobox::Core и common::sense тоже не в стандартной поставке =)
$_ = 1.2;
print /\\./ ? $` + 1 : $_;
Держи еще:

$_ = 3.1;
$_++ if s/\\..*//;
print;
perl -Minteger -nE'say$_+1'
Не годится. Если число недробное, увеличивать на 1 не нужно.

Оставьте свой комментарий