LINUX.ORG.RU

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

 , ,


5

4

Задание на сейчас. найти максимальное вхождение одного слова в другое в СЛОВАРЕ - смотри ниже!!!

Перл - со словарём не справился;

Для C++ . - У меня перебирает весь словарь за 17 секунд;

Для JS - Около минуты. Говорили что Перл старый, ни на что не способный язык. Проверим?(часть 2) (комментарий);

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

Не нужно писать решение для единичных слов. Нужно - решение для словаря.

Возьмём список русских существительных, например отсюда: https://github.com/Harrix/Russian-Nouns/releases/download/v2.0/russian_nouns_v2.0.zip

Нужно найти максимальное вхождение одного слова в другое. Полные вхождения слов - не допускаются - это вроде было ясно и понятно всем. — Это задание. Это!!!


Самое простое и наглядное решение в составлении слов это:

/(\w+) \1/

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

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

Предлагаю собрать сюда наиболее значимые решения из 1 части.

Итак:

В начале, мы просто делали из

шлакоблок + окунь = шлакоблокунь

На разных языках. Там есть решения. Затем все стали зачем то уменьшать количество строк и символов - победил Перл - но это вообще не интересно.

Теперь, самое главное:

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

Здесь все согласились что Перл хороший и годный язык, но С++ всё равно быстрее. В связи с этим, было предложено:

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


Возьмём список русских существительных, например отсюда: https://github.com/Harrix/Russian-Nouns/releases/download/v2.0/russian_nouns_v2.0.zip На основе этого списка создадим новый, со всеми новыми сочетаниями, где перекрываются не менее 3 букв. Тут даже секундомером можно замерять. У меня на моем стареньком ноуте ушло несколько минут и сгенерировалось почти 40 Мбайт из одного. У Вас есть код на Перле и C++. Можете сравнить время. Так как здесь тоже работа со строками, то у Перла есть шанс.

Но потом договорились до изменения задания:

Тут ведь уже говорили - что основное время программы - это ввод и вывод. То есть в задании нужно сделать как можно меньше выводов.

Единственное что мне приходит в голову - найти максимальное вхождение одного слова в другое. —!!! Это и стало основным и новым заданием. !!!—


Эти все задачи были решены для Перл и С++

Для Перл. 3 варианта решения. Но ни одно не берёт весь словарь:

#!/usr/bin/perl

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

$t = time();

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

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

close D;
@d2 = @d;


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

  for $v2 (@d2) {&resh3 ()}
  
M1:  
  }
  
sub resh3 {
  
  $lv = length $v;
  $lv2 = length $v2;

  if($lv>$lv2) {
  
    for($i=$lv2; $i>1; $i--) {
      $c = substr ($v, -$i,);
      $c2 = substr ($v2, 0, $i);
      if (($c eq $c2) and ($c ne $v2) and ($c ne $v)){
          $sov = length $c;
          if ($sov>$sov1){$sov1=$sov; $str="$c = $v-$v2"}
          }
        
  
      }

  
  }
  else {
    
        for($i=$lv; $i>1; $i--) {
      $c = substr ($v2, -$i,);
      $c2 = substr ($v, 0, $i);
      if (($c eq $c2) and ($c ne $v2) and ($c ne $v)){
          $sov = length $c;
          if ($sov>$sov1){$sov1=$sov; $str="$c = $v-$v2"}
          }
        
  
      }
    
    
    
    }
  
  
}
  

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 - $_"}

}
  }}
  

Для C++ . У меня перебирает весь словарь за 17 секунд.:

#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;
}


Ниже - не решения текущей задачи! Не решения. Ниже - просто выборка всех решений, на всех языках с прежней темы.

Блин. Как же сложно с людьми с недостаточным образованием. Я вот уже 6 раз написал - и всё равно будут писать про Шлокоблококунь.

php:

➜ php i.php "папа + папаха"
папаха%                                                                                                                                                                   ➜ php i.php "шлакоблок + окунь"
шлакоблокунь%                                                                                                                                                              
➜ cat i.php
<?php
for ($i = 1; $i <= mb_strlen(trim(explode('+', $argv[1])[0])) && $i <= mb_strlen(trim(explode('+',$argv[1])[1])); $i++)
    if (mb_substr(trim(explode('+', $argv[1])[0]), mb_strlen(trim(explode('+',$argv[1])[0])) - $i) === mb_substr(trim(explode('+',$argv[1])[1]), 0, $i)) 
        $j = $i;
echo (isset($j)) ?  trim(explode('+',$argv[1])[0]). mb_substr(trim(explode('+',$argv[1])[1]), $j) : 'error';

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



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

Лучше. Не лучше. - Это не разговор.

Сейчас я знаю что при работе с файлами С++ в десятки раз быстрее. 1 секунда и больше 1 минуты.

А это - уже разговор.

Я думал ну в 3 раза быстрее, ну в 4. Но никак я не думал - что в 60 раз.

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

И дело тут скорее всего не в старости-нестарости - Версия 5.28.0 вышла 22 июня 2018[36].

А в том что Перл не компилируется.

Но, повторю. Я не думал, что это приводит к проигрышам в скорости в сотню раз.

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

Но, повторю. Я не думал, что это приводит к проигрышам в скорости в сотню раз.

Как-то уже постил о том как использовал Perl для формирования отчетов и насколько все быстро было /2000 расчетных листков за секунду НЕПЛОХО ВЕДЬ!/ …

Что касаемо вашего поста, то там где Perl быстр /речь о алгоритме/, то используйте его, где ТУПИТ используйте Си API …

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

Как-то уже постил о том как использовал Perl для формирования отчетов и насколько все быстро было /2000 расчетных листков за секунду НЕПЛОХО ВЕДЬ!/ …

Это по вертикали.

Попробовал для баловства, чтобы они были расположены по горизонтали и ТАК ЖЕ все быстро.

Представляете сколько там операций конкатенаций использовал для строк.

Попробуйте то же самое сделать на любом другом языке программирования.
Не получится за 1 сек потому как API для работы с строками везде отвратительное, а у Perl 2000-х было отличное!

Ныне не знаю даже, может уже улучшили/угробили …

К сожалению о качестве алгоритмов ныне наверное заботятся лишь для число дробилок.

М-да …

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

К сожалению о качестве алгоритмов ныне наверное заботятся лишь для число дробилок.

А вот и небольшое подтверждение суждения
https://www.opennet.ru/opennews/art.shtml?num=56229 Представлен формат сжатия изображений QOI

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

Я нашёл компилятор для Перл. - Устанавливается плохо совсем. Установлю - всех вас победю.

Дело даже не в вашей победе вовсе.

Это баловство!

Perl - ХОРОШИЙ язык программирования.
Не зря его ранее применяли для задач в основном, связанной с обработкой текста.

Каков он ныне?

Не знаю
anonymous
()

Шутка

Вот вам «домашнее задание»
https://github.com/phoboslab/jsmpeg MPEG1 Video Decoder in JavaScript

JavaScript справляется, a Perl?

А вот для сравнения скорости Perl с Си

https://github.com/phoboslab/qoi The “Quite OK Image” format for fast, lossless image compression

Всего-то 300 строк на Си

https://www.opennet.ru/opennews/art.shtml?num=56229

Представлен новый легковесный формат сжатия изображений без потерь - QOI (Quite OK Image), позволяющий очень быстро сжимать изображения в цветовых пространствах RGB и RGBA.  
При сравнении производительности с форматом PNG однопоточная эталонная реализация формата QOI на языке Си, не использующая SIMD-инструкции и ассемблерные оптимизации, по скорости кодирования в 20-50 раз превосходит библиотеки libpng 
anonymous
()
Ответ на: комментарий от kompospec

Не. Я только на «Голые титьки» по ссылкам хожу. А тут - не по русски ещё написано…

google переводчик поможет вам понять,

что в курятнике делает лиса ... 

А голые титьки ИМХО

Тьфу!
anonymous
()
Ответ на: комментарий от kompospec

А тут - не по русски ещё написано…

ИМХО для популяризации Perl о регулярных выражениях нужно лишь упомянуть «вскользь» …

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

Пока я не скомпилировал Перл - никакого результата нет.

  1. Пёрл отсатывает из-за алгоритма, а не сам по себе. Т.е. это автор того кода делает это.
  2. Пока нет сравнения с AWK, говорить не о чем.
anonymous
()
Ответ на: комментарий от anonymous

Проблема ТС в том что он не знает что такое временная сложность алгоритма; пытаясь найти волшебную палочку для перла.

demensdeum
()

Прохладная история , говорили пердун старый , а воздух оказывается испортил молодой пердовоз

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

ТС всех победил

Победил Питухон. Занавес.

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

Мы например сразу на первом курсе векторный графический редактор делали

ИПГУ им Корал Дро?

anonymous
()

Почему то все время идет обсуждение регулярных выражений …

Пластинка заела?

Perl ведь очень интересный язык и полезно было бы другим знать хотя бы немного о его возможностях.
Да и в CPAN тонны хорошего API …

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

Почему параллельные потоки в Perl не обсуждаются и много иных интересных возможностей?

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

Почему параллельные потоки в Perl не обсуждаются и много иных интересных возможностей?

Ну так подвози свою поделку.

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

Угу. Вы совсем ничего не читали? Я там просто прогонял словарь попарно все слова, ничего не делая - около минуты на Перл. 0 секунд - на С++

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

Угу. Вы совсем ничего не читали? Я там просто прогонял словарь попарно все слова, ничего не делая - около минуты на Перл. 0 секунд - на С++

Так да и так.
Спорить не буду …

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

Ну так подвози свою поделку.

Кое что о своих задач для которых использовал Perl уже рассказывал.
А кому-то что доказывать

НЕ МОЕ.

М-да, «спецы».

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

А кому-то что доказывать

НЕ МОЕ.

Ну да. Лучше не надо. Мне было интересно, но теперь подошёл ретард ТС и лучше всё разумное спрятать скорее.

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

Угу. Вы совсем ничего не читали?

Вы совсем ничего не читали? Мы тут уже вторую страницу обсуждаем нормальные алгоритмы. Ну нету здесь таких же нарочных ретардов. Нету.

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

Если у вас есть Супер-Пупер решение или алгоритм - что вам мешает его выложить?

С какой целью? Чтобы доказать что Пёрдл проходит медленней из-за пробелм связанных либо с кэшем, либо со сборкой мусора. Если не считать заведомо тормозной алгоритм. У меня спецом оптимизированный под GC алгоритм. Т.е. с учётом языка сделан.

Ну так это и так понятно. Вопрос зачем выкладывать?

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

Меньше трёпа - больше кода. В.И. Ленин

т. Сталин говорил так

Нэт говнокода, нэт проблэм!
anonymous
()
Ответ на: комментарий от kompospec

То есть то что Перл интерпретируемый язык - вас не смущает вообще? Только «сборщик мусора»?

Нет, интерпретация давно побоку. Время мериется в цикле, где это уже не имеет особого значения. Ну будет там какой-то оверхед. И что с того?

anonymous
()

Ну вот, в районе 300 секунд выполняется


filename = ARGV[0]

if filename.nil? then
	puts "provide dictionary file path"
	exit 1
end

# puts "filename = #{filename}"

lines = File.readlines(filename, chomp: true)
# lines.each_with_index do |v, i|
# 	lines[i] = v.chars # convert to array of chars
# end

found = ""
fln = 0
hti = ""
xln = 0

def get_intersection ar, br, fln
    i = 0
    ar[1...].each_char do |r|
    	break if i == br.length
    	i+=1 and next if r == br[i]
    	i = 0
    end

    return "", 0 if i <= fln || i >= ar.length || i >= br.length

    return ar[...ar.length-i] +
        "[" + ar[ar.length-i...] + "]" +
        br[i...], i
end

sp = Time.now
lines.each do |f|
	lines.each do |x|
		next if f == x # skip the same
		next if fln > 0 && (f.length <= fln+2 || x.length <= fln+2)
		hti, xln = get_intersection f, x, fln
		found, fln = hti, xln unless xln == 0
		# puts "F #{found} L #{fln}" unless xln == 0
	end
end

puts "found #{fln} #{found}, after #{Time.now - sp}"

Причём основные тормоза как раз после того как найдёт это 13-символьное пересечение. А значит основные тормоза в get_intersection, судя по всему.

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

???

Машинный код - выполняется за секунды.

Перл-код - выполняется за часы.

Если из Перла сделать Машинный код - это это будет какой-то специальный, Перловский машинный код?

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

А С++ -ный машинный код остаётся С++ -сом ???

Машинный код - это машиннный код. Хороший он или плохой - это зависит только от криворукости разработчиков компилятора. Компиляторов может быть много. Хороших и разных. С оптимизацией и без.

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

Машинный код для M68k и Мультиклет из Перл, будут хорошими или плохими при использовании регулярки для реализации декодера QOI?

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

При чём тут этот парадокс и компилятор? Компилятор ничего не замещает.

Он просто переводит команды с одного языка на другой.

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

Машинный код - выполняется за секунды.

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

Но я говорил не про это. Если в плюсах скажем, идёт сравнение байта с байтом. То в Пёрле, это, скажем, сравнение объекта, его типа и значения, с другим таким объектом. Т.е. есть некий оверхед, но он (1) ожидаем (2) может быть просто оценён. Зная это оверхед, можно легко прикинуть что к чему.

P.S.: есть два примера JS (пусть и jit) – интерпретируемый, и Ruby – интерпретируемый. Разница между ними всеми, включая Питон и Пёрл – просто космическая.

P.P.S.: Пёрл не для того, что имеет смысл писать на Плюсах, как и все скрипты.

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

??? Блин. Вы правда не понимаете? Компилятор - это обычная программа. Их может быть много для разных случаев.

Вы правда это не понимаете?

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

Он просто переводит команды с одного языка на другой.

Он проводит кучу оптимизаций и превращает это дело в машинный код. Другой язык не обязателен. Машинный код – не язык.

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

Маши́нный код (платфо́рменно-ориенти́рованный код), маши́нный язы́к — система команд (набор кодов операций) конкретной вычислительной машины, …

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwiWw779k7z0AhU2AxAIHSFDBHEQFnoECAMQAQ&url=https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259C%25D0%25B0%25D1%2588%25D0%25B8%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B9_%25D0%25BA%25D0%25BE%25D0%25B4&usg=AOvVaw1B_Iz5hQwiOn5Rk80TSn1M

kompospec
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.