LINUX.ORG.RU

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

 , , , ,


9

4

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

Задачка:

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

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

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

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

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

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



Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от demensdeum

Ведь смысла уже не особо много

Да, как бы, его и не было. Что вам, собственно, и объясняли всё это время.

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

А вы соответствие спецификации на машине Тьюринга проверяли? Какую реализацию Перла использовали?

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

Большой, перл не лучший вариант парсить 100Гб.

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

https://metacpan.org/dist/KappaCUDA/view/KappaCUDA.pod

Если взять новейшую видеокарту от NVidia и использовать CUDA, то может Перл и обгонит. Но тут проблема будет даже не в том, что основную работу на себя возьмёт библиотека на си. Дело в другом.

Задача у нас одноразовая. Соответственно, скрипт на Питоне, работающий 10 минут, выиграет у кода на плюсах, который работает 5 минут, если на скрипт мы потратили 2 минуты, а на плюсовую программу - 20. То есть если мы переусложним код на Перле, то мы всё равно потеряем во времени, даже если сам код будет работать быстро.

Вот я взялся за задачу в 19:16, а результат выдал в 19:30. Какой язык позволит получить результат так быстро? Только простой компилируемый язык со статической типизацией. И тут не годятся оба: и Перл, и Плюсы. Возможно, Паскаль или Фортран лучше бы подошли. Возможно, Ним. Точно не подойдут Хаскель и Раст.

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

Давай возьмём твою ссылку на тест с простыми числами: https://blog.famzah.net/2016/09/10/cpp-vs-python-vs-php-vs-java-vs-others-performance-benchmark-2016-q3/

  • Код на Python 3.7 занимает 861 Bytes.
  • Код на Perl - 770 Bytes. Но тут мы будем запинаться о доллары. Так что соизмеримо с Питоном.
  • Код на C++ - 1.74 KB. То есть он больше примерно в 2 раза.

Понятно, что статическая типизация даст прирост, но лучше, чтобы это было 10-50%, а не 100%. Понятно, что цифры взяты с потолка. Я как-то считал количество символов из аналогичного теста. У меня вышло так:

  • python 1419
  • nim 2241
  • d 2298
  • rust 2460
  • go 2660
  • java 2855
  • c 2944

Ну вот Nim и D - подходят.

Ну это всё теоретические рассуждения. Можешь сам замерить сколько у тебя уйдёт времени на поиск максимального пересечения в словаре.

Kogrom
()
Последнее исправление: Kogrom (всего исправлений: 1)
Ответ на: комментарий от Kogrom

Какой язык позволит получить результат так быстро?

По этой ссылке выходит что быстрее всех C++, по CPU Time. Но конечно никто не говорит о скорости написания приложений на данных языках, мне было бы интересно посмотреть подобное исследование.

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

Возможно. В данной теме что-то похожее на Haskell появилось только на 15-й странице. Код действительно краткий, но появился намного позже, чем примеры на Питоне, например. Скорее всего, потому хаскелистов мало, а не потому что долго подбирали удачную формулу.

Вообще, допускаю, что для работы со строками Haskell и OCaml подходят хорошо. Не просто так же на них столько трансляторов сделано.

Kogrom
()
Ответ на: комментарий от Psilocybe

Не совсем. По скорости - да, а по краткости - нет. В питоновском коде много комментариев и учёт версии. Если это убрать, то размер будет 588 байт. А у PHP - 709.

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

В данной теме что-то похожее на Haskell появилось только на 15-й странице.

Брехня. На четвёртой: Говорили что Перл старый, ни на что не способный язык. Проверим? (комментарий)

На пятой появилась целая программа: Говорили что Перл старый, ни на что не способный язык. Проверим? (комментарий)

Miguel ★★★★★
()

Какой смысл «сравнивать» ФП с другими ЯП на примере, для решения которых он и был создан? Как уже сказали, здесь есть смысл сравнивать Пёрл с sed и awk, возможно, с Питоном.

Посоревнуйтесь на Пёрле с Фортраном в вычислении интегрального синуса с устанавливаемой пользователем точностью. Здесь даже bc будет лучше.

Напишите на Пёрле, Фортране-77 и freeПаскале прогу интегрирования методом Симпсона, где подынтегральная функция вынесена в подпрограмму с фиксированным именем f(x).

Потом посмотрим, какая прога будет читабельнее.

Это, кстати, те первые задания по программированию, которые я делал в школе. Правда, Фортран был IV, а Паскаль был 6.0. Пёрла не было вообще.

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

Для всех:

#!/usr/bin/perl

use utf8;
use open qw(:std :utf8); 

$t = time();

$| = 1;
open D, 'russian_nouns.txt';

for(0..2000) {
  $vv=<D>;
  $vv =~ s/\s+$//;
  @d = (@d, $vv);
  }

close D;
@d2 = @d;


for $v (@d){
    ++$i; if (++$j>99){
    $t2 = time()-$t;
    print $i."прошло $t2 секунд. $sov1 $str\n"; $j=0;}

  for $v2 (@d2) {&resh1 ()}
  
M1:  
  }
  
  #print "$sov1 $str";
  

sub resh1 {  
    $r=''; $l='';
    for(split(//,$v2)){
      $r .= $_;
      if ($v =~ /$r$/) {$l=$r}  
      }
    #print "$v-$l-$v2\n" if length $l>4 and $v ne $l;
    
    if ($l and ($l ne $v2) and ($l ne $v)){
    $sov = length $l;
    if ($sov>$sov1){$sov1=$sov; $str="$l - $v-$v2"}
}
}


sub resh2 {
  
    if($v ne $v2) {
    $_ = "$v $v2";
    /([^ ]*?)([^ ]*) \2/;
    
    if ($2 and ($2 ne $v2) and ($2 ne $v)){
    $sov = length $2;
    if ($sov>$sov1){$sov1=$sov; $str="$2 - $_"}

}
  }
  
  
  }

sub resh {

  $str = $_;
  
  }

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

результат работы - &resh1:

100прошло 10 секунд. 5 атель - авансодатель-ателье
200прошло 21 секунд. 5 атель - авансодатель-ателье
300прошло 31 секунд. 5 атель - авансодатель-ателье
400прошло 42 секунд. 5 атель - авансодатель-ателье
500прошло 52 секунд. 6 бактер - азотобактер-бактериолог
600прошло 63 секунд. 6 бактер - азотобактер-бактериолог
700прошло 73 секунд. 6 бактер - азотобактер-бактериолог
800прошло 83 секунд. 6 бактер - азотобактер-бактериолог
900прошло 94 секунд. 6 бактер - азотобактер-бактериолог
1000прошло 104 секунд. 6 бактер - азотобактер-бактериолог
1100прошло 115 секунд. 6 бактер - азотобактер-бактериолог
1200прошло 125 секунд. 6 бактер - азотобактер-бактериолог
1300прошло 136 секунд. 6 бактер - азотобактер-бактериолог
1400прошло 146 секунд. 6 бактер - азотобактер-бактериолог
1500прошло 156 секунд. 6 бактер - азотобактер-бактериолог
1600прошло 167 секунд. 6 бактер - азотобактер-бактериолог
1700прошло 177 секунд. 6 бактер - азотобактер-бактериолог
1800прошло 188 секунд. 6 бактер - азотобактер-бактериолог
1900прошло 198 секунд. 6 бактер - азотобактер-бактериолог
2000прошло 209 секунд. 6 бактер - азотобактер-бактериолог


------------------
(program exited with code: 0)
Press return to continue

Неприемлемо долго!

kompospec
() автор топика
Последнее исправление: kompospec (всего исправлений: 1)
Ответ на: комментарий от kompospec

&resh2

100прошло 1 секунд. 5 атель - авансодатель ателье
200прошло 2 секунд. 5 атель - авансодатель ателье
300прошло 3 секунд. 5 атель - авансодатель ателье
400прошло 3 секунд. 5 атель - авансодатель ателье
500прошло 4 секунд. 6 бактер - азотобактер бактериолог
600прошло 5 секунд. 6 бактер - азотобактер бактериолог
700прошло 6 секунд. 6 бактер - азотобактер бактериолог
800прошло 7 секунд. 6 бактер - азотобактер бактериолог
900прошло 7 секунд. 6 бактер - азотобактер бактериолог
1000прошло 8 секунд. 6 бактер - азотобактер бактериолог
1100прошло 9 секунд. 6 бактер - азотобактер бактериолог
1200прошло 10 секунд. 6 бактер - азотобактер бактериолог
1300прошло 11 секунд. 6 бактер - азотобактер бактериолог
1400прошло 11 секунд. 6 бактер - азотобактер бактериолог
1500прошло 12 секунд. 6 бактер - азотобактер бактериолог
1600прошло 13 секунд. 6 бактер - азотобактер бактериолог
1700прошло 14 секунд. 6 бактер - азотобактер бактериолог
1800прошло 14 секунд. 6 бактер - азотобактер бактериолог
1900прошло 15 секунд. 6 бактер - азотобактер бактериолог
2000прошло 16 секунд. 6 бактер - азотобактер бактериолог


------------------
(program exited with code: 0)
Press return to continue

Это лучше, но тоже очень долго

kompospec
() автор топика
Последнее исправление: kompospec (всего исправлений: 1)
Ответ на: комментарий от kompospec

Оформил процесс перебора по предложенному образцу:

417      прошло: 0 секунд, длина: 4, ажур - абажур-ажурность
878657   прошло: 1 секунд, длина: 5, генез - абиогенез-генезис
4009466  прошло: 2 секунд, длина: 6, датель - авансодатель-дательница
4061251  прошло: 2 секунд, длина: 9, держатель - авансодержатель-держательница
4093816  прошло: 2 секунд, длина: 11, содержатель - авансодержатель-содержательн
ость
265157673 прошло: 25 секунд, длина: 13, производитель - воспроизводитель-
производительность

Результат: 13, производитель - воспроизводитель-производительность
Полное время переборов: 144 секунд

Первая цифра - счётчик переборов. Я использую DSL (предметно ориентированный язык), который транслируется в C++. Так что скорость примерно как у плюсов.

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

Да, весь словарь, но если одно из слов было меньше по длине, чем уже найденное максимальное перекрытие, то такую комбинацию пропускал, конечно. А, что, найдено перекрытие больше по длине?

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

Постарался вникнуть в несколько решений, которые не на регулярках. Они все одинаковые:

  1. Находим минимальное (Мин) из 2 слов и колМин;
  2. Цикл по колМин;
  3. Отрываем одну букву сзади Мин и сравниваем с концом 2 слова;
  4. Совпадение - Бинго!

А там есть в корне другие решения?

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

Не могли бы вы прогнать мою программу на своём компьютере?

Я лучше сделаю по другому. Подправлю транслированный текст, чтобы не надо было типы и библиотеки DSL-а использовать, и выложу сюда.

#include <iostream>
#include <fstream>
#include <ctime>
#include <string>
#include <vector>
using namespace std;

void check_combine(string &res, size_t &len, const string &s1, const string &s2)
{
    len = 0;
    for(auto &ch: s1)
    {
        if(len == s2.size())
        {
            break;
        }
        if(ch == s2.at(len))
        {
            len += 1;
        }
        else
        {
            len = 0;
        }
    }
    if(!len)
    {
        res = "";
    }
    else
    {
        string s3  {s2};
        s3.erase(0, len);
        res = s1;
        res += s3;
    }
}

void getlines(vector<string> &lines, fstream & f)
{
    string str;
    while(getline(f, str))
    {
        lines.push_back(str);
    }
}

int main()
{
    fstream inFile;
    inFile.open ("russian_nouns.txt", std::fstream::in);
    vector<string> lines;
    getlines(lines, inFile);
    size_t maxLen  {0};
    size_t rusMaxLen  {0};
    string maxRes  {""};
    time_t startTime = time(nullptr);
    size_t counter  {0};
    for(auto &s1: lines)
    {
        for(auto &s2: lines)
        {
            counter += 1;
            if(s1 == s2)
            {
                continue;
            }
            if(s1.size() < maxLen)
            {
                continue;
            }
            if(s2.size() < maxLen)
            {
                continue;
            }
            size_t len  {0};
            string res;
            check_combine(res, len, s1, s2);
            if(res == s1)
            {
                continue;
            }
            if(res == s2)
            {
                continue;
            }
            if(len > maxLen)
            {
                maxLen = len;
                rusMaxLen = maxLen / 2;
                time_t delta = time(nullptr) - startTime;
                string deltaStr  {s2};
                deltaStr.erase(len);
                maxRes = deltaStr + " - " + s1 + '-' + s2;
                cout << counter << "\t прошло: " << delta << " секунд, длина: ";
                cout << rusMaxLen << ", " << maxRes << '\n';
            }
        }
    }
    cout << "\n\nРезультат: " << rusMaxLen << ", " << maxRes << '\n';
    time_t delta = time(nullptr) - startTime;
    cout << "Полное время переборов: " << delta;
    inFile.close();
    return 0;
}

Код немного странный, потому что из автоматически сгенерированного сделан. Но вроде рабочий. Этот у меня всё перебрал за 120 секунд. Можете проверить у себя.

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

А вы? я С++ практически не пользуюсь чтоб понимать скинет он данные все сразу или выдаст частями в ходе выполнения. Факт в одном. Я запустил ту прогу. Попил чайку - Ни одной строки не появилось. Выключил прогу.

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

А у вас какое образование? Я просто не понимаю уровень на котором мне нужно объяснять? Про жадность вы точно ничего не знаете. А де ве по де те?

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

Ого! Де ве по де те - это школа. Правда математическая. Друган у меня был на дневном отделении КуАИ - он говорил что они это в школе ещё проходили.

kompospec
() автор топика
Последнее исправление: kompospec (всего исправлений: 1)
Ответ на: комментарий от kompospec

А тем временем с О3
2631741301 прошло: 86 секунд, длина: 1, а - ящурка-абажур
2631754737 прошло: 86 секунд, длина: 2, ка - ящурка-кабак
2631791506 прошло: 86 секунд, длина: 5, щурка - ящурка-щурка

demensdeum
()
Последнее исправление: demensdeum (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.