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)
Ответ на: комментарий от kompospec

А вот какой язык более всего монетизируем ? Для удалёнки.

Для тебя никакой. Дело не в языке ведь.

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

Ох, матушки-пересратушки. Я думал это только Рубин так тормозит адски.

Так тормозит не язык, а MoarVM которая исполняет байткод. Интересно какое время будет на JVM. Понятно, что корпоративные runtime куда влита куча денег и времени будут быстрее.

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

от слова вообще

Вот такие фразы и есть признак слабоумия.

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

Один. Аспирант! Втирал мне в 2012 году, что никогда не будет изобретён голосовой переводчик

Ну, то есть, ты экстраполировал пример одного человека на группу людей, а слабоумные при этом гуманитарии. Принято.

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

Голосовой переводчик до сих пор не изобретён. Он проигрывает человеку по всем параметрам. Так что гуманитарий прав. А жирножоп – нет.

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

А вот это интересно очень. А можно примерчик?

Сначала покажи как словарь ломает сервак.

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

Я хотел по этому поводу добавить, но подумал, что смысла нет бисер метать. У него-то изобретён давно. В гараже лежит. На регулярках.

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

Так тормозит не язык, а MoarVM которая исполняет байткод. Интересно какое время будет на JVM

Его можно в WASM, этот Раку?

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

В любых языках с VM значительное время на старте уйдет на «прогрев» самой виртуальной машины, а так же минимум несколько процентов вычислительных ресурсов уйдёт на поддержание её работы в процессе выполнения.

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

Дело не в Perl

Концепция вам не понятна потому, что я с периодичностью в 5 >страниц пишу причину возникновения этой темы: Мне нужно было >обработать Миллиард записей. И Перл не справился - считал около 3 >суток.

Так я тебе и привел привел пример параллельного исполнения в Perl6 путем добавления одного модификатора .race.

Если ты делал все в один поток на Перле, то в 16 потоков будет уже не 3 суток, а 7 часов. Что проще - переписать на C++ или вставить race и пойти домой? Да пофиг сколько он там считать будет - к утру перемолотит.

[code=perl] @res = @records.race.map(&) [/code]

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

Андрей, так значит вы гуманитарий?

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

Его можно в WASM, этот Раку?

Не знаю. Вижу что можно на JVM и JS (node.js) https://rakudo.org/downloads

Запустил на JVM, но похоже это не дает экстра прироста скорости.

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

Задача постоянная, а не единичная. То есть данные поступают каждые 3 часа.

Ну значит ты лживый жирножоп. Потому что во всех языках мира очень мало существительных.

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

Задача постоянная, а не единичная. То есть данные поступают каждые 3 часа.

Бывает. Это называется рефакторинг приложения.

anonymous
()

Кто-нибудь помогите. Словарь Мюллера ломает мне сервак.

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

Бывает. Это называется рефакторинг приложения

Для русского у него 50 тыс слов. Округлим до 200 тыс. И умножим на количество языков в мире (7139). Получим 1427800 тыс. С учётом округления в большую сторону. В словаре Мюллера, кажется, 150 тыс слов. Развитых языков мало. Существительных – около половины. Ну да ладно. С учётом всего там максимум полтора ярда слов (на самом деле раз в 8-16 меньше). При этом между собой они пересекаются слабо – от языка к языку.

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

Задача постоянная, а не единичная. То есть данные поступают каждые 3 часа.

Проще говоря ТС хочет на халяву получить эффективный алгоритм.
И при этом еще оскорбляет других людей.
М-да …

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

Проще говоря ТС хочет на халяву получить эффективный алгоритм. И при этом еще оскорбляет других людей. М-да …

Причём все вышеописанные наработки вряд ли в состоянии эффективно применить. Скорее всего там будет криво-плюс-плюс и «проходит весь словарь». Процессорное время, вычислительный ресурс, энергетический ресурс – всё в пустую.

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

В любых языках с VM значительное время на старте уйдет на «прогрев» самой виртуальной машины

Не, прогрев не считается. Только цикл.

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

Не всех. Только анонимов и гуманитариев!

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

Всех. Типичный жлоб, короче.

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

Гм.
Так куда подевались основные ВЕНТИЛЯТОРЫ ЛОР? …

anonymous
()

Компостец, тебе же сказали иди учить матчасть, че ты все трешься со своими ссылками на баннера адсенса? Модеры забаньте его уже

anonymous
()

@kompospec, имеются преобразователи регулярных выражений в сишный код.

Это бесплатный совет

Вообще то для 3 млр. ШЛАКОБЛОКОПЫЛЕСОСОВ нужно алгоритм писать на Си …

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

Вообще то для 3 млр. ШЛАКОБЛОКОПЫЛЕСОСОВ нужно алгоритм писать на Си …

… string в алгоритме для такого количества, анализируемых слов лучше не использовать …

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

… string в алгоритме для такого количества, анализируемых слов лучше не использовать …

«Из коробки» в С/С++ нет эффективного API для работы с строками …
А для ваших объемов данных нужен эффективный API …

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

Андрюша, не ведитесь на троллинг … Нас - умных разработчиков тут определяют в изгои … А как разработчик вы мне очень интересны

Владимир

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

а где я писал что это была задача объединения слов?

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

Но таки - да. Они обычно гумуунитарии

Шутка

Здесь согласен в вами.
Они были гуМуМунитарии и гуМуМуМунитариями останутся.
Ишь ты литераторы, поэты, философы … и остальные ТОВАРИЩИ возомнили себя программистами …

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

Задача постоянная, а не единичная. То есть данные поступают каждые 3 часа.

То бишь 3 млр. это данные полученные за несколько лет?
Надеюсь вы их не храните в виде одного текстового файла? …

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

Понимаете, любой нормальный технарь - философ и литератор. За 6 лет обучения в институте я написал просто хренову тучу пояснительных записок. Оно всё должно было быть на хорошем, грамотном языке. А общение с людьми в институте (для примера, со мной учился Хасис (или я с ним)) - задаёт определённый уровень…

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

Понимаете, любой нормальный технарь - философ и литератор.

Соглашусь с вами. Я тоже пишу много стихов про технарей. Да и сам я технарь. Пишу на 1С.

Владимир

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

Понимаете, любой нормальный технарь - философ и литератор.

Ну да, каждый технарь должен иметь свою ПРАВИЛЬНУЮ ТЕОРИЮ возникновения вселенной …

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

За 6 лет обучения в институте я написал просто хренову тучу пояснительных записок. Оно всё должно было быть на хорошем, грамотном языке.

Объяснения вида «это не я» на вопрос «кто сожрал всё сало» нельзя назвать литературным достижением.

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

Вы политех закончили?

Технический ВУЗ! Если заскочите в гости, покажу свой диплом

Владимир

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

Что вам нужно? что вы всё ковыряетесь? Выискиваете что-то

Знаком с этим тредом.
Ваш?

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

а где я писал что это была задача объединения слов?

Вот здесь

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

А это

Господи. Что вам нужно? что вы всё ковыряетесь? Выискиваете что-то:

https://www.google.com/search?channel=fs&client=ubuntu&q=miltorg+%D0%BC%D0%B8%D0%BB%D0%BB%D0%B8%D0%B0%D1%80%D0%B4+%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9

Задача совсем другого толка. Она называется «алгоритмы сортировки». Её гуманитарии проходят ещё в яслях.

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

у себя в гостях?

Могу к вам в деревню заскочить, если настаиваете … На новогодние каникулы. Гостинцев вам привезу.

Владимир

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

Горшки сортируют?

Мне нравится ваше чувство юмора … Настоящий технарь с дипломом!

Владимир

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

Все на горшок Игра для детей или как приучить ребенка к горшку…

Не лезь к моему другу! Лицо тебе расцарапаю …

Владимир

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