Тестовое задание веб программиста
Модератор: Модераторы разделов
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
Ну... бинарный поиск требует прямой (случайной) адресации элементов. Иначе его сложность равна линейному. Текстовый файл прямой адресации не имеет - надо либо дополнительные индексы, либо фиксированную длину записи. На выданном условии можно постороить почти бинарный поиск, но строго его так назвать нельзя.
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
я просто так написал
по-моиму это относится к математическому программирвоанию (главный смысл лежит в математики, типо, деление на два), но не к веб программирвоанию, почему не использовать СУБД если нужно обработать такие большие данные?
а это задание по поводу webа для садомазохистов
по-моиму это относится к математическому программирвоанию (главный смысл лежит в математики, типо, деление на два), но не к веб программирвоанию, почему не использовать СУБД если нужно обработать такие большие данные?
а это задание по поводу webа для садомазохистов
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
Код:
#!/usr/bin/perl -w
my $read_block_size = 256;
sub rec_shift {
my( $file, $dir ) = @_;
my( $buf, $ofs );
while( 1 ) {
$ofs = tell( $file );
if( !$dir ) {
read( $file, $buf, $read_block_size );
my $o = index( $buf, "\x0a" );
if( $o >= 0 ) {
seek( $file, $ofs + $o + 1, 0 );
return;
} elsif( eof( $file ) ) {
return;
}
} else {
my $r = $ofs > $read_block_size ? $read_block_size : $ofs;
seek( $file, -$r, 1 );
read( $file, $buf, $r );
seek( $file, -$r, 1 );
my $o = rindex( $buf, "\x0a" );
if( $o >= 0 ) {
seek( $file, $o + 1, 1 );
return;
} elsif( $r == $ofs ) {
seek( $file, 0, 0 );
return;
}
}
}
}
sub rec_read {
my( $file ) = @_;
my $ln = '';
my $buf;
while( 1 ) {
my $ofs = tell( $file );
read( $file, $buf, $read_block_size );
my $o = index( $buf, "\x0a" );
if( $o >= 0 ) {
seek( $file, $ofs + $o + 1, 0 );
$ln .= substr( $buf, 0, $o );
return split( /\t/, $ln );
}
$ln .= $buf;
}
}
sub filebinsearch {
my( $file, $fkey, $beg, $end ) = @_;
return undef if $beg == $end;
my $oc = int( ( $beg + $end ) / 2 ); # ( $beg + $end ) >> 1 -- 32bit :-(
seek( $file, $oc, 0 );
rec_shift( $file, 1 );
$oc = tell( $file );
my( $key, $value ) = rec_read( $file );
return $value if $key eq $fkey;
if( $key lt $fkey ) {
filebinsearch( $file, $fkey, tell( $file ), $end );
} else {
filebinsearch( $file, $fkey, $beg, $oc );
}
}
sub findinfile {
my( $filename, $key ) = @_;
my $value = undef;
my $filesize = 0;
return undef if !-f $filename;
return undef if !-r $filename;
return undef if !($filesize = -s $filename);
return undef if !open( $file, '<', $filename );
return filebinsearch( $file, $key, 0, $filesize );
}
print findinfile( $ARGV[0], $ARGV[1] ) . "\n";
вроде работает, особо не тестил
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
написать можно, но для 10 ГБ разве это реализуемо, тем более в несколько 10 строк?
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
Ну создал файл - размер 980 Мб, данный поиск находит намного меньше секунды, зрительно - сразу.
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
ok, спасибо, тогда попробую, еще может быть массив хэшей сделать...
Код: Выделить всё
@array = (
{
favorite => "apples",
'second favorite' => "оranges"
},
Код: Выделить всё
print $array[0]{favorite};
Код: Выделить всё
$data[0] = "favorite:apples, second favorite:оranges";
$data[1] = "favorite:corn, second favorite:peas, least favorite:turnip";
$data[2] = "favorite:chicken, second favorite:beef";
for $loopindex (O..$#data) {
for $element(split ',', $data[$loopindex]){
($key, $value) = split ':', $element;
$key=~s/^[\s\n]+//; #очистить от пробелов
$key=~s/[\s\n]+$//;
$value =~s/^[\s\n]+//; #очистить от пробелов
$value =~s/[\s\n]+$//;
$array[$loopindex]{$key} = $value;
}
}
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
Немного не понял к чему это относится 

-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
открыть файл, "занести" все через ссылку в массив хэшей, примерно так:
(только это не массив хэшей, а гибрид хеша хешей и хеша массивов, т.е. хеша хешей массивов)
дальше число элементов массива разделить на 2 (сколько всего элементов массива)
перебрать первую часть массива в этим:
если не нашли, то вторую часть перебираем....
или это абсолютно не так?
(только это не массив хэшей, а гибрид хеша хешей и хеша массивов, т.е. хеша хешей массивов)
Код: Выделить всё
open F, "<example" or die "can open: $!\n"; @mass=<F>; close F;
for $gr(grep{!$_{$_}++} map{/^(.*?),/} @mass){
for $line(@mass){push @{$hash{$gr}{$1}}, $2 if $line=~m!^$gr,(.*?),(.*)!}
}
дальше число элементов массива разделить на 2 (сколько всего элементов массива)
перебрать первую часть массива в этим:
Код: Выделить всё
$array[$loopindex]{то_что_ключ_ИЩЕМ};
если не нашли, то вторую часть перебираем....

или это абсолютно не так?
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
1. а разве не нарушается условие:
Объем используемой памяти не должен зависеть от размера файла, только от
максимального размера записи.
2. бинарный поиск состоит в том, что:
сравниваем средний эл-т с искомым и проверяем только одну из частей, т.к. последовательность отсортирована
3. или я не понял назначение этого кода?
Объем используемой памяти не должен зависеть от размера файла, только от
максимального размера записи.
2. бинарный поиск состоит в том, что:
сравниваем средний эл-т с искомым и проверяем только одну из частей, т.к. последовательность отсортирована
3. или я не понял назначение этого кода?
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
в условии не написано что последовательность отсортирована...
ну ссылка это "адресс памяти" в которой находятся данные... ну знаю или тут сработает...
сейас попробую...
ну ссылка это "адресс памяти" в которой находятся данные... ну знаю или тут сработает...
сейас попробую...
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
Исходные данные и требования к реализации:
1. Объем используемой памяти не должен зависеть от размера файла, только от
максимального размера записи.
2. Формат файла:
ключ1\tзначение1\x0Aключ2\tзначение2\x0A...ключN\tзначениеN\x0A
Где:
\x0A - разделитель записей (код ASCII: 0Ah)
\t - разделитель ключа и значения (табуляция, код ASCII: 09h)
Символы разделителей гарантированно не могут встречаться в ключах или значениях.
Записи упорядочены по ключу в лексикографическом порядке с учетом регистра.
Все ключи гарантированно уникальные.
3. Ограничений на длину ключа или значения нет.
Правильная функция на файле размером 10Гб с записями длиной до 4000 байт будет
отрабатывать любой запрос менее чем за 5 секунд.
вообще-то написано

-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
изменил не много, поменял \x0a на \x0A
создал файл
включаю - ничего не происходит
почему когда я использую так
то мне дампер говорит
если сделать так
и в текстовом файле поменять, то работает
Код:
#!/usr/bin/perl
my $read_block_size = 256;
sub rec_shift {
my( $file, $dir ) = @_;
my( $buf, $ofs );
while( 1 ) {
$ofs = tell( $file );
if( !$dir ) {
read( $file, $buf, $read_block_size );
my $o = index( $buf, "\x0A" );
if( $o >= 0 ) {
seek( $file, $ofs + $o + 1, 0 );
return;
} elsif( eof( $file ) ) {
return;
}
} else {
my $r = $ofs > $read_block_size ? $read_block_size : $ofs;
seek( $file, -$r, 1 );
read( $file, $buf, $r );
seek( $file, -$r, 1 );
my $o = rindex( $buf, "\x0A" );
if( $o >= 0 ) {
seek( $file, $o + 1, 1 );
return;
} elsif( $r == $ofs ) {
seek( $file, 0, 0 );
return;
}
}
}
}
sub rec_read {
my( $file ) = @_;
my $ln = '';
my $buf;
while( 1 ) {
my $ofs = tell( $file );
read( $file, $buf, $read_block_size );
my $o = index( $buf, "\x0A" );
if( $o >= 0 ) {
seek( $file, $ofs + $o + 1, 0 );
$ln .= substr( $buf, 0, $o );
return split( /\t/, $ln );
}
$ln .= $buf;
}
}
sub filebinsearch {
my( $file, $fkey, $beg, $end ) = @_;
return undef if $beg == $end;
my $oc = int( ( $beg + $end ) / 2 ); # ( $beg + $end ) >> 1 -- 32bit :-(
seek( $file, $oc, 0 );
rec_shift( $file, 1 );
$oc = tell( $file );
my( $key, $value ) = rec_read( $file );
return $value if $key eq $fkey;
if( $key lt $fkey ) {
filebinsearch( $file, $fkey, tell( $file ), $end );
} else {
filebinsearch( $file, $fkey, $beg, $oc );
}
}
sub findinfile {
my( $filename, $key ) = @_;
my $value = undef;
my $filesize = 0;
return undef if !-f $filename;
return undef if !-r $filename;
return undef if !($filesize = -s $filename);
return undef if !open( $file, '<', $filename );
return filebinsearch( $file, $key, 0, $filesize );
}
print findinfile( $ARGV[0], $ARGV[1] ) . "\n";
создал файл
Код: Выделить всё
qq1\tuu1\x0Aqq2\tuu2\x0Aqq3\tuu3\x0A
включаю - ничего не происходит
Код: Выделить всё
$ ls -a
. parse.txt perl.pl
.. parse.txt~ perl.pl~
$ ./perl.pl parse.txt qq1
^C$ ./perl.pl parse.txt qq1
^[[A^C$ ./perl.pl parse.txt qq
почему когда я использую так
Код: Выделить всё
for $loopindex (O..$#data) {
for $element(split '$\x0A', $data[$loopindex]){
($key, $value) = split '\t', $element;
$key=~s/^[\s\n]+//; #очистить от пробелов
$key=~s/[\s\n]+$//;
$value =~s/^[\s\n]+//; #очистить от пробелов
$value =~s/[\s\n]+$//;
$array[$loopindex]{$key} = $value;
}
}
# print array;
use Data::Dumper;
print Dumper(@array);
# print @array[0]{};
то мне дампер говорит
Код: Выделить всё
$ ./perl.pl
$VAR1 = {
'qq1\\tuu1\\x0A' => undef
};
$VAR2 = {
'qq2\\tuu2\\x0A' => undef
};
$VAR3 = {
'qq3\\tuu3\\x0A' => undef
};
если сделать так
Код: Выделить всё
for $element(split ',', $data[$loopindex]){
($key, $value) = split ':', $element;
и в текстовом файле поменять, то работает
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
Хм... \x0a - это символ перевода строки, регистр там вроде не важен, \t - это табуляция.
Соответственно файл надо создавать с этими символами, а не писать \t. В том коде, что я привел, поддерживаются только односимвольные разделители.
Соответственно файл надо создавать с этими символами, а не писать \t. В том коде, что я привел, поддерживаются только односимвольные разделители.
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
а как его создать с этим переводом?
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
Просто в текстовом редакторе пишете - \t - Tab, \x0a - Enter. Только замена табуляци на пробелы не должна быть включена и конец строки юниксовый, а не виндозный. Или в перле:
print "$key\t$value\0x0a";
print "$key\t$value\0x0a";
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
поставил так return split( / /, $ln ); работает (не понятно почему не работало)
можите сказать где Вы использовали такой скрипт, на практике?
можите сказать где Вы использовали такой скрипт, на практике?
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
вот с коментами 
проверок на корректность данных практически нет
пример файла не дам - я ленивый человек
, поэтому сделал тест генератор
он берет два аргумента: первый - число записей, второй - максимальная длина ключа
значение равно конкатенации длины ключа, дефиса и самого ключа
добавлено:
На практике? Ну, конкретно такой - нигде. Если честно - не особо вижу и ценность такого скрипта. Я вообще не раз использовал бинарный поиск. А этот скрипт вот вчера утром и написал...

проверок на корректность данных практически нет
Код:
#!/usr/bin/perl -w
# размер блока для чтения, чтобы не читать посимвольно
my $read_block_size = 256;
# функция для сдвига к границе записи
# принимает хэндл и направление движения
# направление = 0 - двигаемся вперед к началу следующей записи - вообще-то не используется
# = 1 - назад - к началу текущей записи
sub rec_shift {
my( $file, $dir ) = @_;
my( $buf, $ofs );
# крутимся пока не дойдем
while( 1 ) {
# получаем текущее смещение
$ofs = tell( $file );
# в зависимости от направления
if( !$dir ) {
# направление вперед, аналогично считыванию записи,
# к тому же не используется в программе, коментировать лень
read( $file, $buf, $read_block_size );
my $o = index( $buf, "\x0a" );
if( $o >= 0 ) {
seek( $file, $ofs + $o + 1, 0 );
return;
} elsif( eof( $file ) ) {
return;
}
} else {
# к началу записи - назад
# смотрим на текущее смещение и сравниваем с размером блока который хотим считать
# ессно, выбираем меньшее
my $r = $ofs > $read_block_size ? $read_block_size : $ofs;
# смещаемся назад на размер блока
seek( $file, -$r, 1 );
# читаем блок
read( $file, $buf, $r );
# снова возвращаемся на начало блока, т.к. чтение сдвинуло на прежнюю точку
seek( $file, -$r, 1 );
# ищем разделитель (ессно, с конца блока, потому что идем назад)
my $o = rindex( $buf, "\x0a" );
if( $o >= 0 ) {
# нашли! смешаемся на начало записи и все
seek( $file, $o + 1, 1 );
return;
} elsif( $r == $ofs ) {
# не нашли, но размер блока для чтения равен ранее смещению до конца текущего блока
# следовательно мы находимся в начале файла (а значит и какой-то записи)
# можно было не сдвигаться, но так, на всякий пожарный
seek( $file, 0, 0 );
return;
}
}
}
}
# считывает запись от текущего положения и смещает к началу следующей
# АХТУНГ! функция преполагает, что мы находимся в начале записи
# принимает хэндл файла
sub rec_read {
my( $file ) = @_;
# 'это и будет наша запись
my $ln = '';
my $buf;
while( 1 ) {
# получаем текущее смещение
my $ofs = tell( $file );
# считываем блок
read( $file, $buf, $read_block_size );
# ищем в нем перевод стоки - разделитель записей
my $o = index( $buf, "\x0a" );
# если нашли, то
if( $o >= 0 ) {
# смещаемся к началу следующей записи
seek( $file, $ofs + $o + 1, 0 );
# добавляем кусок буфера от начала до конца (не включая разделитель)
$ln .= substr( $buf, 0, $o );
# разделяем строку по табуляции (разделитель ключа и значения) и возвращаем такой вот массивчик
return split( /\t/, $ln );
}
# если не нашли разделитель --> добавляем весь буфер и читаем следующую порцию, повторяя все снова, пока не найдем
$ln .= $buf;
}
}
# основная функция бинарного поиска
# принимает хэндл файла, ключ, начало и конец данных для поиска
sub filebinsearch {
my( $file, $fkey, $beg, $end ) = @_;
# если конец == началу, то данных уже нет, значит ключ не найден
return undef if $beg == $end;
# вычисляем середину наших данных
my $oc = int( ( $beg + $end ) / 2 ); # ( $beg + $end ) >> 1 -- 32bit :-(
# смещаемся к середине
seek( $file, $oc, 0 );
# сдвигаемся к НАЧАЛУ записи (могли попасть куда угодно) на которой стоим
rec_shift( $file, 1 );
# запоминаем смещение начала файла
$oc = tell( $file );
# считываем ценральную запись
my( $key, $value ) = rec_read( $file );
# если попали туда, куда надо - возвращаем значение
return $value if $key eq $fkey;
# сравниваем эталонный ключ с найденным
if( $key lt $fkey ) {
# найденный ключ меньше эталонного, значит первую половину
# можно отбросить и повторить поиск только для второй части
# которая начинается с конца ранее найденной и заканичвается там,
# где и был конец исходных данных
filebinsearch( $file, $fkey, tell( $file ), $end );
} else {
# найденный ключ больше искомого --> опускаем вторую половину
# ищем только в первой, кот. начинается с начала исходных
# данных и заканчивается в начале ранее найденной записи
filebinsearch( $file, $fkey, $beg, $oc );
}
}
# собственно функция задания, которую и надо вызывать
# принимает имя файла и ключ который ищем
sub findinfile {
my( $filename, $key ) = @_;
my $value = undef;
my $filesize = 0;
# а есть ли вообще такой файл?
return undef if !-f $filename;
# а можем ли мы его прочесть?
return undef if !-r $filename;
# а в нем хоть что-то есть? попутно сохраняем размер файла
return undef if !($filesize = -s $filename);
# открываем и проверяем получилось ли это
return undef if !open( $file, '<', $filename );
# вызываем рекурсивную функцию - основа бинарного поиска
return filebinsearch( $file, $key, 0, $filesize );
}
print findinfile( $ARGV[0], $ARGV[1] ) . "\n";
пример файла не дам - я ленивый человек

он берет два аргумента: первый - число записей, второй - максимальная длина ключа
значение равно конкатенации длины ключа, дефиса и самого ключа
Код:
#!/usr/bin/perl -w
my %H = ();
my $a = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
for( my $i = 0; $i < $ARGV[0]; $i++ ) {
my $hh = '';
my $hl = 1 + int( rand( $ARGV[1] ) );
for( my $j = 0; $j < $hl; $j++ ) {
$hh .= substr( $a, int( rand( length( $a ) ) ), 1 );
}
$H{$hh} = "$hl-$hh";
}
foreach my $key ( sort keys %H ) {
print "$key\t$H{$key}\n";
}
добавлено:
На практике? Ну, конкретно такой - нигде. Если честно - не особо вижу и ценность такого скрипта. Я вообще не раз использовал бинарный поиск. А этот скрипт вот вчера утром и написал...
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
спасибо, за пример
если не сложно, подскжаите кто-то, куда выводятся записываются эти данные с этих функций
и куда записывается вывод функции rec_shift?
если не сложно, подскжаите кто-то, куда выводятся записываются эти данные с этих функций
Код: Выделить всё
seek( $file, -$r, 1 );
read( $file, $buf, $r );
seek( $file, -$r, 1 );
Код: Выделить всё
seek( $file, $oc, 0 );
rec_shift( $file, 1 );
$oc = tell( $file );
и куда записывается вывод функции rec_shift?
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
seek - смещает текущий указатель в файле
read - считывает из файла (а соответственно и смещает указатель)
rec_shift - не выводит ничего и не возвращает - она изменяет состояние файла - точнее его текущего указателя
PS давно не было в инете меня, не отвечал
read - считывает из файла (а соответственно и смещает указатель)
rec_shift - не выводит ничего и не возвращает - она изменяет состояние файла - точнее его текущего указателя
PS давно не было в инете меня, не отвечал

-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Тестовое задание веб программиста
Кстати по поводу тестовых заданий: http://indiacodingpatterns.unkur.com/2008/10/27/itworks/ - представленное решение прикольное, а задачка сама по себе в меру интересна :)
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Тестовое задание веб программиста
2 diesel
а приведенное там решение не очень...
PS пхп не знаю, вообще больше С++ люблю, но в теме перл...
Код: Выделить всё
#!/usr/bin/perl
my $n = 20;
my @num = 0..$n;
my $a = 1;
for( my $i = 2; $i <= $n; $i++ ) {
if( $num[$i] > 1 ) {
for( my $j = $i + $i; $j <= $n; $j += $i ) {
$num[$j] /= $num[$i];
}
$a *= $num[$i];
}
}
print "$a\n";
а приведенное там решение не очень...
PS пхп не знаю, вообще больше С++ люблю, но в теме перл...
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
Код: Выделить всё
#!/usr/bin/perl
use File::SortedSeek ':all';
@{$hex->[0]} = 'D';
open BIG, 'file.txt' or die $!;
$tell = alphabetic( *BIG, @{$hex->[0]} );
$line = <BIG>;
@{$hex->[1]} = split( /\t/, $line, 2 );
print @{$hex->[1]};
exit;
Код: Выделить всё
#!/usr/bin/perl
if (!$ARGV[0]) {
print 'no key';
exit; }
open my $fi, '66.txt';
sub filess {
my $ss = int((@_[0] + @_[1]) / 2);
return 0 if @_[0] == $ss or @_[1] == $ss;
seek $fi, $ss, 0;
<$fi>;
my $line = <$fi>;
my @h = split( /\t/, $line, 2 );
if ($h[0] eq $ARGV[0]) {
print $h[1];
exit;
}
return filess(@_[0], $ss) if(($ARGV[0] cmp $h[0]) == -1);
return filess($ss, @_[1]) if(($ARGV[0] cmp $h[0]) == 1);
}
filess(0, -s $fi);
не вижу там интереса... результат - это работающая программа, а какая разница как она сделана?
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
оптимизировать можно на этапе разработки, или лучше код закрыть чтобы его никто не видел 
я видел алгоритмы который пишут на Java, там примерно так как по вашей ссылке, а в то время на perl, можно решить в одну строку... или с анонимными массивами, тоже...
если работает - значит правильно
он-лайнеры, делает хэш:

я видел алгоритмы который пишут на Java, там примерно так как по вашей ссылке, а в то время на perl, можно решить в одну строку... или с анонимными массивами, тоже...
если работает - значит правильно
он-лайнеры, делает хэш:
Код: Выделить всё
perl -MData::Dumper -0x0a -lne '%hash = ( %hash, split "\t" ); END { print Dumper \%hash }' file
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
-
- Сообщения: 502
- ОС: gentoo -> archlinux
Re: Тестовое задание веб программиста
diesel писал(а): ↑02.02.2009 11:38Кстати по поводу тестовых заданий: http://indiacodingpatterns.unkur.com/2008/10/27/itworks/ - представленное решение прикольное, а задачка сама по себе в меру интересна
а чего там прикольного? )
upd: ну, алгоритм, конечно, работает, только вот код как-нибудь можно было бы оптимизировать...
например, то же самое на хаскеле (сильно не ругать - только 3-й день его изучаю):
Код: Выделить всё
findNumber n = [rez | rez <- [n, 2*n..], all (\x -> rem rez x == 0) [ m | m <- [1..n], rem n m /= 0]] !! 0
чтобы делить на все числа от 1 до 20, надо вызвать с параметром n = 20:
Код: Выделить всё
findNumber 20
морнинг круассан..
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Тестовое задание веб программиста
ishitori писал(а): ↑12.02.2009 21:30diesel писал(а): ↑02.02.2009 11:38Кстати по поводу тестовых заданий: http://indiacodingpatterns.unkur.com/2008/10/27/itworks/ - представленное решение прикольное, а задачка сама по себе в меру интересна
а чего там прикольного? )
прикольно - в смысле веселое
ishitori писал(а): ↑12.02.2009 21:30upd: ну, алгоритм, конечно, работает, только вот код как-нибудь можно было бы оптимизировать...
например, то же самое на хаскеле (сильно не ругать - только 3-й день его изучаю):
Код: Выделить всё
findNumber n = [rez | rez <- [n, 2*n..], all (\x -> rem rez x == 0) [ m | m <- [1..n], rem n m /= 0]] !! 0
чтобы делить на все числа от 1 до 20, надо вызвать с параметром n = 20:
чудовищно долго



-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: Тестовое задание веб программиста
я себе работу нашел, вот кто хочет посмотреть еще
прислали еще, попробую сделать...
но не очень хочется делать работу которую нужно сделать беслптано и чтобы все было идеально, быстро и протестировать, блин!
я это делать никого не прошу, просто ради темы...
http://unixforum.org.ua/index.php?topic=18...g19383#msg19383
(я сюда не пишу потому что поисковик проиндексирует)
прислали еще, попробую сделать...
но не очень хочется делать работу которую нужно сделать беслптано и чтобы все было идеально, быстро и протестировать, блин!

я это делать никого не прошу, просто ради темы...
http://unixforum.org.ua/index.php?topic=18...g19383#msg19383
(я сюда не пишу потому что поисковик проиндексирует)