Christian Archer Chase Your Dreams!

среда, 09 сентября 2009

Зачем нам нужно вдохновенье // Сделай глубже вдох // Ни для кого не откровенье // Что Шепард сдох

11:57 Я уже совсем потерян для общества?


#!/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.


@темы: ruby, personal, humour, xkcd, development

URL
По какой-то неизвестной причине помидоры считаются здесь ...
Чем ближе чемпионат, тем все веселее и веселее становится...
Насмехались. Показывали пальцами. Издевались. Гнали прочь...
Чего мы не понимаем, тем не владеем.
Вот кем хорошо в Корее быть, так ето пенсионерами. Только...
Мы так результативно лечились болью. А ты возьми и умри. ...

10.09.2009 в 10:59

10.09.2009 в 10:59
#!/usr/bin/perl

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;'
URL

10.09.2009 в 17:41

10.09.2009 в 17:41
поэтому перл и погиб — когда пишешь, думаешь "как коротко, красиво и изящно", а через месяц не можешь понять что этот код делает. а в чужом коде разобраться вообще нереально
URL

10.09.2009 в 17:42

10.09.2009 в 17:42
а что значит my перед переменными?
URL

10.09.2009 в 18:44

10.09.2009 в 18:44
объявление переменной вроде..
URL

10.09.2009 в 18:58

10.09.2009 в 18:58
my - стриктовое обьявление переменных. private по сишному. если без него, будет global переменная.

А зачем лезть в код работающего скрипта?
URL

10.09.2009 в 23:05

10.09.2009 в 23:05
А зачем лезть в код работающего скрипта?

Ну приехали...

1) посмотреть как работает
2) исправить багу, если вдруг не работает
3) сделать чтоб лучше работал
4) адаптировать такой же алгоритм под другую задачу
5) ...
inf) Profit!

код, нечитабельный для человека, нафик никому через пару дней после написания не нужен. а вот читабельный может послужить еще много где, как, зачем и почему
URL

11.09.2009 в 00:13

11.09.2009 в 00:13
>код, нечитабельный для человека, нафик никому через пару дней после написания не нужен. а вот читабельный может послужить еще много где, как, зачем и почему
Есть софт, у которого коды закрыты, но при том он пользуется большой популярностью, а есть такой, каким бы читабельным он ни был, ты в него не полезешь(тот же самые криптософт, где чтоб просто понять, как он работает нужно 9000 лет, пусть даже на человеческом языке будет написано).
URL

11.09.2009 в 08:54

11.09.2009 в 08:54
Sir_Anthony
Есть софт, у которого коды закрыты, но при том он пользуется большой популярностью

Внутри компании код открыт и переиспользуется. А там где сделано спагетти, вскоре никого не будет. Хороший пример — некоторые заброшенные области WinAPI. Одногруппник тут как раз мучается

есть такой, каким бы читабельным он ни был, ты в него не полезешь

У криптософта есть "исходник" на языке математических формул. Так-то!

Другое дело, что алгоритмы шифрования — это несколько другой класс задач. В моём примере ничего не шифруется
URL

11.09.2009 в 15:59

11.09.2009 в 15:59
В этом примере мой код тоже читабелен, даже знания похапе хватит, чтобы прочитать. А однострочник - как пример того, чего не могут питоны руби и подобные языки. Кстати, он не намного нечитабельней, или ты ; не замечаешь?
URL

11.09.2009 в 21:28

11.09.2009 в 21:28
$ARGV[0] =~ /(\d{1,2})\.(\d{1,2})\.(\d{4})/;

регэкспы — это аццки нечитабельно. во всех случаях, когда можно обойтись без регэкспов, нужно обходиться без регэкспов. (это как ассемблер)
URL

12.09.2009 в 02:18

12.09.2009 в 02:18
поздравляю, если для тебя регэкспы нечитабельны, значит программировать ты не научился. Они во всех языках одинаковы => достаточно 1 раз запомнить
URL

12.09.2009 в 08:03

12.09.2009 в 08:03
Sir_Anthony
если для тебя регэкспы нечитабельны

нечитабельны != не могу разобраться. я вижу, что делает этот. потому что он простейший. тем не менее анализ уже занимает значительное время. если взять 10 штук чуть посложнее, проще сразу забить и написать по новой

а вот скажем



было бы намного удобнее: читабельный синтаксис + отработанный механизм. именно для этого изобрели компиляторы

Они во всех языках одинаковы

ЛПП. Они все похожи, но в них дофига тонокотсей, которые отравляют жизнь. И пользовался я ими за всё время не в образовательных целях только в конфиге mod_rewrite в apache и в krename. Ни то, ни другое программированием не является
URL

12.09.2009 в 08:54

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, может конфликтовать. Лучше переименовать.
Да, и наверняка что-то подобное уже реализованно, просто гуглить получается дольше, чем один регэксп написать.
URL

12.09.2009 в 09:09

12.09.2009 в 09:09
можно конечно по одному символу читать, но это маразм, который не только ломает принцип KISS

чем? а по твоему регэкспы как работают?

Date.parse(gets, true) наверняка использует регэкспы потому что по другому никак.

зачем гадать, когда можно открыть код и увидеть регэкспы :-D а функция log() в делфи вообще на ассемблере написана. и что? написание стандартной библиотеки — это системное программирование, а не прикладное. тут другие правила несколько. когда эти правила смешиваются (как в прикладном программировании на C), приходит ужас на крыльях ночи

Твой пример намного труднее читается

_читается_ он проще. но выглядит более громоздко. тут это излишне, потому что пример прост
URL

12.09.2009 в 16:01

12.09.2009 в 16:01
В чтение символов по одному я имел в виду всякие изарвщенные функции, когда символ достается по номеру строки. Естественно, что и регэкспы по одному символу читают. Ассемблер вообще с целой строкой почти не работает(за исключением перемещений в памяти).
_читается_ он проще. но выглядит более громоздко. тут это излишне, потому что пример прост
Вот смотри, сколько надо времени, чтоб понять и запомнить, что \d обозначает число? а regexp::digits()? Больше букв -> больше запоминания. да и код начинает на 9000 строк расплываться, когда можно написать в 25.
URL

12.09.2009 в 16:14

12.09.2009 в 16:14
сколько надо времени, чтоб понять и запомнить, что \d обозначает число?
Больше букв -> больше запоминания

ну... английский для меня как второй родной, а то и первый, так что запоминать мне ничего не надо. а вот \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).
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail