LINUX.ORG.RU

Говорили что Перл старый, ни на что не способный язык. Проверим?

 , , , ,


8

3

Говорили что Перл старый, ни на что не способный язык. Проверим?

Задачка:

Необходимо для каждой пары слов получить новое слово, так, чтобы окончание первого совпадало с началом второго, например, шлакоблок + окунь = шлакоблокунь. Это слово надо вывести в стандартный поток вывода.Если слова возможно соединить несколькими способами, надо выбрать тот, что обеспечивает максимальную общую часть, например папа + папаха = папаха (а не папапаха). Необходимо написать последнее условие.

Я просто взял практически первое попавшаяся задание.

На Перле программа заняла 5 строк не считая ввода-вывода. С вводом-выводом - 7 строк.

А как у вас? На ваших Супер-пупер языках?

Перемещено xaizek из general

Перемещено hobbit из talks

Ответ на: комментарий от demensdeum

Из Перл можно сделать вот такое:

Разделяемая библиотека (application/x-sharedlib)

Оно запускается и работает. Но скорость - как у перл

Такую бяку нельзя оптимизировать?

kompospec ()
use strict;
use warnings;
use Benchmark qw( cmpthese );
use Digest::MD5;

my $txt = <<EOD x 100;
домик + микстура
петух + тухлятина
рельса + авиатор
шлакоблок + блокада
EOD

cmpthese( 1000, {
    kompospec => sub {
        open D, '<', \$txt or die $!;
        open V, '>', '/myfiles/kompospec_out'  or die $!;

        while (<D>) {
          s/([^+\s]*?)([^+\s]*)[\s+]+\2/$1$2/;
          print V;
          }
          
          close(D);
          close(V);
    },
    perl5_guy => sub {
        open my $in, '<:encoding(UTF-8)', \$txt or die $!;
        open my $out, '>:encoding(UTF-8)', '/myfiles/perl5_guy_out' or die $!;
        
        while ( <$in> ) {
            print $out s/( \w* ) \K \W+ \1 //xr;
        }
        
        close($in);
        close($out);
    },
});

foreach my $fn ( qw( kompospec_out perl5_guy_out) ) {
    open my $fh, '<:encoding(UTF-8)', "/myfiles/$fn" or die $!;
    print Digest::MD5->new->addfile($fh)->b64digest, "\n";
    close( $fh );
}

Вот пример использования модуля Benchmark. Код писал под этот сайт. Достаточно просто скопировать и можно играться. Листинг господина kompospec'а работает быстрее только на старенькой 5.22.0 версии Perl'а за счёт отсутствия слоёв с кодировочкой. Но уже в версии 5.22.2 мой код работает быстрее. Суть конечно не в скорости. Я уже писал выше, что имена дескрипторов без разыменовывающего префикса отличный способ стрельбы по ногам. Например, если удалить все close(), контрольная сумма будет считаться неверно для kompospec_out. Отсутствие слоя с кодировкой тоже косяк. Как минимум оно не даёт работать с юникодом в регвырах. Если потребуется отредактировать регвыр, может возникнуть что-то вроде:

echo жёпа | perl -pE's/./j/'

perl5_guy ★★★★ ()

Караул! Батя в здании

Входной файл

https://dropmefiles.com/z7VlC

С++

#include <iostream>
#include <fstream>
#include <time.h>
#include <pcre.h>
#include <string.h>
using namespace std;

#define kOUTPUT_ENABLED 0

int main(int argc, char *argv[]) {
  ifstream file("vxod.txt");
  ofstream outputFile("vyxod.txt");
  string linee;
  clock_t start = clock();
  const char* prce_error;
  int pcre_erroff;
  int match[9] = {0};
  char buffer[256] = {0};
  auto regex = pcre_compile("([^+ ]*?)([^+ ]*)[ +]+\\2", PCRE_UTF8, &prce_error, &pcre_erroff, 0);
  while (getline(file, linee)) {
    auto line = linee.c_str();
    auto rc = pcre_exec(regex, 0, line, strlen(line), 0, PCRE_ANCHORED, match, 9);
    int s2 = match[2*1];
    int s1 = match[2*1+1] - match[2*1];
    int s4 = match[2*2];
    int s3 = match[2*2+1] - match[2*2];
    int start = s4 + s3 + 3;
    int length = strlen(line) - start;
    sprintf(buffer, "%.*s%.*s\n",s1, line + s2,length, line + start);
    #if kOUTPUT_ENABLED
    cout << buffer;
    #endif
    outputFile << buffer;
  }
  double time = (double)(clock() - start) / CLOCKS_PER_SEC;
  cout << "Perform time: " << time << " seconds "<< endl;
};
Запускаем
clang++ wordcrossPCRE.cpp -lpcre -O3 && ./a.out
Perform time: 2.58932 seconds 
Perl слил Сишному PCRE

Хотелось бы закончить спецолимпиаду песенкой, с вашего позволения. https://www.youtube.com/watch?v=cdX8r3ZSzN4

Если ошибся, напишите, будет интересно

demensdeum ()
Ответ на: комментарий от mister_VA

Чем функция задавалась?

Ну вы нашли что спросить, я предмет-то не назову, это было в прошлом тысячелетии. Или вы думаете я с МК-90 этой весной курсач сдавал?

anc ★★★★★ ()
Ответ на: комментарий от kompospec

Через 2 года я купил свою первую машину… Шёл 1994 год.

Вы бы лучше рассказали, как докатились до акций по 20р в час. Это в следствии псих. состояния? Не доведи господи самому так оказаться.

goingUp ★★★★★ ()
Ответ на: комментарий от demensdeum

Perl слил Сишному PCRE

Дык, ожидаемо - чудес то не бывает. Удивлён что было не лень кому-то что-то доказывать. Как по мне - так тут вообще всё должно в IO упираться.

ПыСы: музончик повеселил ;)

bugfixer ()
Ответ на: комментарий от demensdeum

Я не до конца понял что вы доказали? Что при определённых манипуляциях при компиляции С++ с регулярками тоже работает быстро?

Да. И олимпиада она про все языки, а не только про Плюсы.

kompospec ()
Ответ на: комментарий от demensdeum

Я завёл новый форум и постараюсь собрать только код с этого форума. Задача осталась прежней - сравнение скоростей на основе Словаря.

kompospec ()
Ограничение на отправку комментариев: только для модераторов и автора