Тестовое задание веб программиста

Модератор: Модераторы разделов

Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Тестовое задание веб программиста

Сообщение gcc »

Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

Ну... бинарный поиск требует прямой (случайной) адресации элементов. Иначе его сложность равна линейному. Текстовый файл прямой адресации не имеет - надо либо дополнительные индексы, либо фиксированную длину записи. На выданном условии можно постороить почти бинарный поиск, но строго его так назвать нельзя.
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

я просто так написал
по-моиму это относится к математическому программирвоанию (главный смысл лежит в математики, типо, деление на два), но не к веб программирвоанию, почему не использовать СУБД если нужно обработать такие большие данные?

а это задание по поводу webа для садомазохистов
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

Код:

#!/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";


вроде работает, особо не тестил
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

написать можно, но для 10 ГБ разве это реализуемо, тем более в несколько 10 строк?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

Ну создал файл - размер 980 Мб, данный поиск находит намного меньше секунды, зрительно - сразу.
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

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;
  }
}
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

Немного не понял к чему это относится :)
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

открыть файл, "занести" все через ссылку в массив хэшей, примерно так:
(только это не массив хэшей, а гибрид хеша хешей и хеша массивов, т.е. хеша хешей массивов)

Код: Выделить всё

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]{то_что_ключ_ИЩЕМ};


если не нашли, то вторую часть перебираем.... :drunk:

или это абсолютно не так?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

1. а разве не нарушается условие:
Объем используемой памяти не должен зависеть от размера файла, только от
максимального размера записи.
2. бинарный поиск состоит в том, что:
сравниваем средний эл-т с искомым и проверяем только одну из частей, т.к. последовательность отсортирована
3. или я не понял назначение этого кода?
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

в условии не написано что последовательность отсортирована...

ну ссылка это "адресс памяти" в которой находятся данные... ну знаю или тут сработает...

сейас попробую...
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

Исходные данные и требования к реализации:

1. Объем используемой памяти не должен зависеть от размера файла, только от
максимального размера записи.

2. Формат файла:
ключ1\tзначение1\x0Aключ2\tзначение2\x0A...ключN\tзначениеN\x0A
Где:
\x0A - разделитель записей (код ASCII: 0Ah)
\t - разделитель ключа и значения (табуляция, код ASCII: 09h)
Символы разделителей гарантированно не могут встречаться в ключах или значениях.
Записи упорядочены по ключу в лексикографическом порядке с учетом регистра.
Все ключи гарантированно уникальные.

3. Ограничений на длину ключа или значения нет.

Правильная функция на файле размером 10Гб с записями длиной до 4000 байт будет
отрабатывать любой запрос менее чем за 5 секунд.

вообще-то написано ;)
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

изменил не много, поменял \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;

и в текстовом файле поменять, то работает
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

Хм... \x0a - это символ перевода строки, регистр там вроде не важен, \t - это табуляция.
Соответственно файл надо создавать с этими символами, а не писать \t. В том коде, что я привел, поддерживаются только односимвольные разделители.
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

а как его создать с этим переводом?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

Просто в текстовом редакторе пишете - \t - Tab, \x0a - Enter. Только замена табуляци на пробелы не должна быть включена и конец строки юниксовый, а не виндозный. Или в перле:
print "$key\t$value\0x0a";
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

поставил так return split( / /, $ln ); работает (не понятно почему не работало)

можите сказать где Вы использовали такой скрипт, на практике?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

вот с коментами :)
проверок на корректность данных практически нет

Код:

#!/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"; }


добавлено:
На практике? Ну, конкретно такой - нигде. Если честно - не особо вижу и ценность такого скрипта. Я вообще не раз использовал бинарный поиск. А этот скрипт вот вчера утром и написал...
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

спасибо, за пример

если не сложно, подскжаите кто-то, куда выводятся записываются эти данные с этих функций

Код: Выделить всё

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?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

seek - смещает текущий указатель в файле
read - считывает из файла (а соответственно и смещает указатель)
rec_shift - не выводит ничего и не возвращает - она изменяет состояние файла - точнее его текущего указателя

PS давно не было в инете меня, не отвечал :(
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Тестовое задание веб программиста

Сообщение diesel »

Кстати по поводу тестовых заданий: http://indiacodingpatterns.unkur.com/2008/10/27/itworks/ - представленное решение прикольное, а задачка сама по себе в меру интересна :)
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Тестовое задание веб программиста

Сообщение NickLion »

2 diesel

Код: Выделить всё

#!/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 пхп не знаю, вообще больше С++ люблю, но в теме перл...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Тестовое задание веб программиста

Сообщение diesel »

NickLion писал(а):
02.02.2009 17:52
а приведенное там решение не очень...

да ) а вот Ваше интересное:)
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

Код: Выделить всё

#!/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);


diesel писал(а):
02.02.2009 11:38
представленное решение прикольное, а задачка сама по себе в меру интересна :)

не вижу там интереса... результат - это работающая программа, а какая разница как она сделана?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Тестовое задание веб программиста

Сообщение diesel »

gcc писал(а):
02.02.2009 18:31
не вижу там интереса... результат - это работающая программа, а какая разница как она сделана?

разница есть, особенно в случае "тестовая задача для программиста".
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

оптимизировать можно на этапе разработки, или лучше код закрыть чтобы его никто не видел :)

я видел алгоритмы который пишут на Java, там примерно так как по вашей ссылке, а в то время на perl, можно решить в одну строку... или с анонимными массивами, тоже...

если работает - значит правильно

он-лайнеры, делает хэш:

Код: Выделить всё

perl -MData::Dumper -0x0a -lne '%hash = ( %hash, split "\t" ); END { print Dumper \%hash }' file
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Тестовое задание веб программиста

Сообщение diesel »

gcc писал(а):
02.02.2009 18:47
я видел алгоритмы который пишут на Java, там примерно так как по вашей ссылке, а в то время на perl, можно решить в одну строку... или с анонимными массивами, тоже...

это не тот случай.
Спасибо сказали:
Аватара пользователя
ishitori
Сообщения: 502
ОС: gentoo -> archlinux

Re: Тестовое задание веб программиста

Сообщение ishitori »

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
морнинг круассан..
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Тестовое задание веб программиста

Сообщение diesel »

ishitori писал(а):
12.02.2009 21:30
diesel писал(а):
02.02.2009 11:38
Кстати по поводу тестовых заданий: http://indiacodingpatterns.unkur.com/2008/10/27/itworks/ - представленное решение прикольное, а задачка сама по себе в меру интересна :)


а чего там прикольного? )

прикольно - в смысле веселое

ishitori писал(а):
12.02.2009 21:30
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:

чудовищно долго :)) особенно по сравнению с предыдущим вариантом :) но абракадабрность решения поражает(это типа "берем числа n, 2*n,..., проверяем делятся ли они на все, если делятся - то они помещаются в список, из которого мы берем первый элемент"?) :)
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: Тестовое задание веб программиста

Сообщение gcc »

я себе работу нашел, вот кто хочет посмотреть еще

прислали еще, попробую сделать...
но не очень хочется делать работу которую нужно сделать беслптано и чтобы все было идеально, быстро и протестировать, блин! :drunk:

я это делать никого не прошу, просто ради темы...

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