Зачем нам нужно вдохновенье // Сделай глубже вдох // Ни для кого не откровенье // Что Шепард сдох
#!/usr/bin/ruby
require 'date'
puts "Enter your birthdate (YYYY-MM-DD):"
birth = Date.parse(gets, true)
today = Date.today
age = today-birth # in days
min_age = (2 * (age - 7 * 365.25)).round
max_age = (age/2 + 7 * 365.25).round
min_birth = Date.today - min_age
max_birth = Date.today - max_age
puts "Your age pool is #{min_birth.to_s} - #{max_birth.to_s}"
if min_birth > max_birth
puts "You're too young ^__^"
end
Originally published at Chase your dream!. You can comment here or there.
10.09.2009 в 10:59
use Time::Local;
$ARGV[0] =~ /(\d{1,2})\.(\d{1,2})\.(\d{4})/;
my $birth = timegm(0,0,0,$1,$2-1,$3);
my $age = time - $birth;
my $min_age = int(2 * ($age - 7 * 365.25));
my $max_age = int($age/2 + 7 * 365.25);
my $min_birth = time - $min_age
my $max_birth = time - $max_age
print "Your age pool is $min_birth - $max_birth"
print "You're too young ^__^" if $min_birth > $max_birth;
А можно еще короче:
perl -e 'use Time::Local; $_=<>; /(\d{1,2})\.(\d{1,2})\.(\d{4})/; my $min_birth=time-(int(2 * (time-timegm(0,0,0,$1,$2,$3) - 7 * 365.25))); my $max_birth = time-(int((time-timegm(0,0,0,$1,$2,$3))/2 + 7 * 365.25)); print "Your age pool is ".localtime($min_birth)." - ".localtime($max_birth)."\n"; print "You too young ^__^\n" if $min_birth > $max_birth;'
10.09.2009 в 17:41
10.09.2009 в 17:42
10.09.2009 в 18:44
10.09.2009 в 18:58
А зачем лезть в код работающего скрипта?
10.09.2009 в 23:05
Ну приехали...
1) посмотреть как работает
2) исправить багу, если вдруг не работает
3) сделать чтоб лучше работал
4) адаптировать такой же алгоритм под другую задачу
5) ...
inf) Profit!
код, нечитабельный для человека, нафик никому через пару дней после написания не нужен. а вот читабельный может послужить еще много где, как, зачем и почему
11.09.2009 в 00:13
Есть софт, у которого коды закрыты, но при том он пользуется большой популярностью, а есть такой, каким бы читабельным он ни был, ты в него не полезешь(тот же самые криптософт, где чтоб просто понять, как он работает нужно 9000 лет, пусть даже на человеческом языке будет написано).
11.09.2009 в 08:54
Есть софт, у которого коды закрыты, но при том он пользуется большой популярностью
Внутри компании код открыт и переиспользуется. А там где сделано спагетти, вскоре никого не будет. Хороший пример — некоторые заброшенные области WinAPI. Одногруппник тут как раз мучается
есть такой, каким бы читабельным он ни был, ты в него не полезешь
У криптософта есть "исходник" на языке математических формул. Так-то!
Другое дело, что алгоритмы шифрования — это несколько другой класс задач. В моём примере ничего не шифруется
11.09.2009 в 15:59
11.09.2009 в 21:28
регэкспы — это аццки нечитабельно. во всех случаях, когда можно обойтись без регэкспов, нужно обходиться без регэкспов. (это как ассемблер)
12.09.2009 в 02:18
12.09.2009 в 08:03
если для тебя регэкспы нечитабельны
нечитабельны != не могу разобраться. я вижу, что делает этот. потому что он простейший. тем не менее анализ уже занимает значительное время. если взять 10 штук чуть посложнее, проще сразу забить и написать по новой
а вот скажем
было бы намного удобнее: читабельный синтаксис + отработанный механизм. именно для этого изобрели компиляторы
Они во всех языках одинаковы
ЛПП. Они все похожи, но в них дофига тонокотсей, которые отравляют жизнь. И пользовался я ими за всё время не в образовательных целях только в конфиге mod_rewrite в apache и в krename. Ни то, ни другое программированием не является
12.09.2009 в 08:54
Твой пример намного труднее читается из-за того, что в каждой строке из 30-40 символов только 2 полезны.
кстати, Date.parse(gets, true) наверняка использует регэкспы потому что по другому никак. можно конечно по одному символу читать, но это маразм, который не только ломает принцип KISS, но и добавляет дополнительных багов.
Если тебе так не нравится эта строчка, на тебе модуль:
#!/usr/bin/perl
package Date;
use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK);
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(parse);
our $VERSION = '1.0';
$XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
bless($self, $class);
}
sub parse {
my $self = shift;
shift; #сам не пробовал, но по логике должно шифтить в $_, если ругается, надо $_ = дописать
/(\d{1,2})\.(\d{1,2})\.(\d{4})/;
timegm(0,0,0,$1,$2-1,$3);
}
1;
Все. Подари его инку, будет работать.
Использование:
use Date;
my $birth = Date::parse(<>); # не проверял. Если здесь <> не сработает то поставить на строчку выше его.
исходя из того что это самописный модуль, а не встроенный, и использование use неизбежно, то этот модуль ничем не отличается от того, что ты применял. Можно use Date вписать куда-нибудь в инициализационные файлы, и здесь указывать будет не надо.
Не советую исппользовать модуль с названием Date, может конфликтовать. Лучше переименовать.
Да, и наверняка что-то подобное уже реализованно, просто гуглить получается дольше, чем один регэксп написать.
12.09.2009 в 09:09
чем? а по твоему регэкспы как работают?
Date.parse(gets, true) наверняка использует регэкспы потому что по другому никак.
зачем гадать, когда можно открыть код и увидеть регэкспы
Твой пример намного труднее читается
_читается_ он проще. но выглядит более громоздко. тут это излишне, потому что пример прост
12.09.2009 в 16:01
_читается_ он проще. но выглядит более громоздко. тут это излишне, потому что пример прост
Вот смотри, сколько надо времени, чтоб понять и запомнить, что \d обозначает число? а regexp::digits()? Больше букв -> больше запоминания. да и код начинает на 9000 строк расплываться, когда можно написать в 25.
12.09.2009 в 16:14
Больше букв -> больше запоминания
ну... английский для меня как второй родной, а то и первый, так что запоминать мне ничего не надо. а вот \d это не только digit, но и decimal point и еще over 9000 слов/слс на букву d
но те, для кого это не так, да... впрочем, без инглиша в компах далеко не уйти.
код начинает на 9000 строк расплываться, когда можно написать в 25
число строк — не показатель. но да, улучшения читабельности иногда уводят в другую крайность. мне вот прислали недавно
Поток 'boost::spirit::classic::impl::rule_base,int>,boost::spirit::classic::multi_pass_policies::input_iterator,boost::spirit::classic::multi_pass_policies::ref_counted,boost::spirit::classic::multi_pass_policies::buf_id_check,boost::spirit::classic::multi_pass_policies::std_deque>,boost::spirit::classic::file_position_base,std::allocator > >,boost::spirit::classic::nil_t>,boost::spirit::classic::scanner_policies,boost::spirit::classic::match_policy,boost::spirit::classic::action_policy> >,boost::spirit::classic::nil_t,boost::spirit::classic::nil_t>,boost::spirit::classic::rule,int>,boost::spirit::classic::multi_pass_policies::input_iterator,boost::spirit::classic::multi_pass_policies::ref_counted,boost::spirit::classic::multi_pass_policies::buf_id_check,boost::spirit::classic::multi_pass_policies::std_deque>,boost::spirit::classic::file_position_base,std::allocator > >,boost::spirit::classic::nil_t>,boost::spirit::classic::scanner_policies,boost::spirit::classic::match_policy,boost::spirit::classic::action_policy> >,boost::spirit::classic::nil_t,boost::spirit::classic::nil_t> const &,boost::spirit::classic::scanner,int>,boost::spirit::classic::multi_pass_policies::input_iterator,boost::spirit::classic::multi_pass' (0x5cc) завершился с кодом 0 (0x0).