LINUX.ORG.RU

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

 , ,


4

3

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

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

Для 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

А я не писал что Регулярки - это просто. Наоборот. Основной мой вопрос - Зачем жадность?

Этот вопрос требует понимания Регулярок. А это - не просто. Это вам не строить из себя программиста, закончив гуммунитарный институт.

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

Это вам не строить из себя программиста, закончив гуммунитарный институт.

Тяжелый случай …

ЛОР-у не повезло  
anonymous
()
Ответ на: комментарий от kompospec

Мы с Ларри - Дартаньяны Космические инженеры.

Кстати, уважаемый, давеча нашёл один тест на интеллект. Ларри его, вестимо, в своё время прошёл. Пройдёте ли Вы?

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

Этот вопрос требует понимания Регулярок

Для тех, кто их так и не освоил и не нашёл им границы применимости.

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

А я не писал что Регулярки - это просто.

Скорее просто, чем нет. Открой уже для себя https://regexr.com/ - там все элементы объясняются.

Это вам не строить из себя программиста, закончив гуммунитарный институт.

А кто так делает? Кроме Ларри Уолла, разумеется.

гуммунитарный

К логопеду. Быстро, решительно.

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

Вот рабочий на Lua https://pastebin.com/m9ZjczUi

Для LuaJIT этот код не подходит.

prepare
prepared after 0.370174s

start
4	аб[ажур]ность
5	абс[тракт]амент
6	авансо[датель]ница
9	авансо[держатель]ница
11	аван[содержатель]ность
13	вос[производитель]ность

13	вос[производитель]ность	after 189.167206s
anonymous
()
Ответ на: комментарий от anonymous

Версия для LuaJIT отрабатывает не намного быстрее. И вышла проблемка с поддержкой Юникода

prepare
prepared after 0.364641s

start
8	аб[ажур]ность
10	абио[генез]ис
12	авансо[датель]ница
18	авансо[держатель]ница
22	аван[содержатель]ность
26	вос[производитель]ность

26	вос[производитель]ность	after 104.752549s
anonymous
()
Ответ на: комментарий от kompospec

инженер - как и я

У меня есть для вас предложение … Давайте на вашем бусе поколесим по европе. Часть бензина и провианта готов оплачивать. Мы с вами можем создать видеоблог о том, как два лучший друга-инженера путешествуют по миру, а по вечерам занимаются разработкой

Владимир

anonymous
()

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

Что так долго?
За парсинг 50000 строк за 17 секунд медаль

не дадут, а вот по ... могут  
anonymous
()
Ответ на: комментарий от kompospec

50000 * 50000 строк. Но вы - это не поймёте.

А где текст алгоритма на C++?

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

Но вы - это не поймёте.

Наверное он гуманитарий

Владимир

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

50000 * 50000 строк. Но вы - это не поймёте.

Хорошо, что не 50000 * 50000 * 50000.
Иначе было бы 17 сек * 50000 / 60 / 60 = 236.111111111 часов

Десять дней! 
anonymous
()
Ответ на: комментарий от anonymous

Занимаются разработкой очка?

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

50000 * 50000 строк. Но вы - это не поймёте.

И без объяснений понятно, что алгоритм ТУПОЙ!
Что-то из серии сравнения каждого слова со всеми остальными …

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

Что-то из серии сравнения каждого слова со всеми остальными …

Можно хэшнуть все слова до 64-битного целого. Сравнить хэши. Выбрать топчик. И потом идти от хэшей обратно к строкам. Только ТС до этого не допрёт, у него на уме метла и аэродром.

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

Можно хэшнуть все слова до 64-битного целого. Сравнить хэши. Выбрать топчик. И потом идти от хэшей обратно к строкам. Только ТС до этого не допрёт, у него на уме метла и аэродром.

Я имею ввиду простое сравнение строк на эквивалентность, а не окуней.

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

Вот стоит сервак в Санта-Монике. С него идёт поток шлакоблоков. Другой стоит в Калифорнии. С него плывут окуни. Надо это всё скомбинировать и отправить готовый шлакоблокунь в Паоли, Пенсильвания. Так в NASA и пашешь космическим инженером, света белого не видишь.

Вот, что бывает, Ларри!

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

50000 * 50000 строк. Но вы - это не поймёте.

Это ты не поймёшь, что 50000 * 50000 строк для такой задачи перебирают только дремучие болваны, которые в написании и оптимизации алгоритмов (а не быдлопортянок на твоих бейсиках, пыхах и перлах) не смыслят ровным счётом ничего.

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

наезд

Это ты не поймёшь, что 50000 * 50000 строк для такой задачи перебирают только дремучие болваны, которые в написании и оптимизации алгоритмов (а не быдлопортянок на твоих бейсиках, пыхах и перлах) не смыслят ровным счётом ничего

Скажи милчеловек, чего не зватает в PHP и perl, что есть в других «более лучших» языках?

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

Скажи милчеловек, чего не зватает в PHP и perl, что есть в других «более лучших» языках?

Как минимум вменяемой модели исполнения и отсутствия ряби спецсимволов в глазах (например, $ перед каждым именем переменной — уродство дичайшее). Это как минимум. Дальше можно перечислять ещё долго. Лично меня больше всего ещё коробят отсутствие (без дополнительных телодвижений) таких вещей, как lexical scope, асинхронных вызовов и ФВП как методов списка, для которого которым они вызываются. То есть нельзя сделать, условно говоря, list.filter(fun).map(fun2).fold(fun3, 0), можно только сделать fold(map(filter(list, fun2), fun2), fun3, 0), что тоже является тем ещё уродством и в сочетании с рябью спецсимволов затрудняет как написание функциональных конструкций, так и понимание написанного.

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

Непонятно про «вменяемость» модели исполнения, ну байткод. Что байткод есть невменяемость?

Далее $|%|@ перед каждым именем переменной - ты смотришь на это глазами человек с кириллической прошивкой. А на свете есть еще миллиард+ человек которым твои буквы дикость, а вот иероглифы очень ОК.

А помните была такая х-ня, называлась Венгерская нотация - там тип переменной в название переменной пихали. Но $|%|@ куда разумнее!

list.filter(fun).map(fun2) можно сказать и в Perl6, а хочешь асинхронности - добавляешь .race - list.filter(fun).race.map(fun2) и понеслось по тредам.

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

Непонятно про «вменяемость» модели исполнения

Речь о том, что в основной области применения данных недоразумений рулят mod_php, FastCGI и прочие костыли вместо нормальных TCP-сервисов здорового человека.

Далее $|%|@ перед каждым именем переменной - ты смотришь на это глазами человек с кириллической прошивкой.

Человекам с "латинской прошивкой" это всё не менее чуждо. Впрочем, пых изначально делался в основном ЕРЖ, что многое объясняет.

А помните была такая х-ня, называлась Венгерская нотация - там тип переменной в название переменной пихали. Но $|%|@ куда разумнее!

Нет, ровно такая же хня.

list.filter(fun).map(fun2) можно сказать и в Perl6

Во-первых, где здесь речь о Perl6? ТС за 5 топит, если что. Во-вторых, в плане читабельности раку не намного улучшил ситуацию.

а хочешь асинхронности - добавляешь .race - list.filter(fun).race.map(fun2) и понеслось по тредам.

А результат куда? В возвращаемое значение? И что будет рантайм всё это время делать? И почему он не может в это время делать что-нибудь полезное в основном треде?

Короче, всё костыль — и race, и всякие промисы с async/await, но там хотя бы под заведомо асинхронную среду всё пилилось.

anonymous
()
21 января 2022 г.

Мужики, спецолимпиада ещё не закончилась? Я не опоздал? Так спешил, что даже тред не читал!

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

ТС ушёл ставить perlcc, но вследствие своей необучаемости не осилил и это.

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