LINUX.ORG.RU

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

 , ,


3

2

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

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

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

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

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

«ротор сделаем из дерева» - это такой фольклер и баянистый баян для тех кто в теме. И то что Вы его не знаете, как и то что Вы не в состоянии ответить на простейшие вопросы по физике, как бы намекает что физики Вы и не знаете, да и не знали скорее всего - че бы там Вы на завтрак не потребляли… упс.

А как дысал!(с)

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

Блин. Вы и правда не знаете что Ротор - это и есть Физика? Точнее применение Вышки в Физике, в аэродинамике, и даже в уравнении Максвелла.

Мрак. Вы что закончили?

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

Пока что я вижу что Вы не умеете читать и понимать написанное, а так же не умеете парсить сарказм. Регулярочка сломалась?

И ротор это не физика, физика это наука о моделях окружающего мира, а ротор это всего лишь набла векторно на векторное поле или другими словами свертка тензора Леви-Чевиты с оператором Гамильтона. Это кусочек математики которая язык физики но никак не вся физика.

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

Физик не может не знать роторы

И дивергенции. Вы себе не представляете каких усилий мне сейчас стоит одним глазом за этим трэдом наблюдать, но не оторваться же ;) Жгите, давно так не смеялся…

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

На 2 листе «Физик» понял за Роторы.

Ещё немного и сможете постигнуть прелесть Регулярок и Перла - Но учтите что в Перл высокий порог вхождения. Некоторым Физикам его не преодолеть

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

Блин. Зачем мне это? Мне нужен Перл или очень близкий к нему язык, который сможет сработать со Словарём. И всё.

Это мне нужно потому, что 1 раз за 20 лет фриланса Перл не справился.

Интересно. А php справиться? Вот будет прикол.

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

а как там регулярками то аэродинамику считают? На конформных неструктурированных сетках, RKDG какой нить?

Кстати, Вы два вопроса по физике (которую Вы типа на завтрак ели) уже слили вчистую.

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

Для общего, ВЕБ- развития - более полезно решение с mySQL Именно через неё я бы решал задачу со Словарём, если бы она была не не скорость для разных языков.

БД - это и есть Словари и работа с ними. Оно для этого и создано и под это заточено.

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

А я и не позиционирую себя как Физика.

Прочность. Динамика полёта. - Можно поговорить. Я - инженер космической техники - см. мой диплом.

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

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

demensdeum ()

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

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

Ох тыж Божечьки…

Мне есть с кем поговорить и о прочности и о динамике полета. Хоть космического, хоть атмосферного (до-, транс, сверх- и гиперзвукового, в т.ч. с т.з. аэроакустики). Я на ЛОр не за этим хожу.

Просто когда Вы пишете что «регулярки - это главное что есть в современном программировании», то у меня конечно же роторы становятся деревянными и просыпается острый приступ глумливости.

Простите пожалуйста, я не со зла;-(

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

один в семи комнатах не проживал,

Как проживающий один в пяти комнатах заявляю, это пздц. Уверен, что от увеличения комнат выигрыша точно не будет, возрастут лишь расходы на обслуживание.

Троллинг не засчитан.

anonymous ()

Ребята, НЕ ОБИЖАЙТЕ @kompospec.

Ну вот такой он человек.
Он поделился от всего сердца СВОИМ и думал, что другим поможет.
Разве это плохо?
По всей видимости у него было много задач в которых регулярки «уместны» …

@kompospec, научитесь без обид относится к ПОЛЕЗНОЙ критике.
Понимаю, что критика не приятна, но это же

ФОРУМ!

На нем и НАПОЛЕОНОВ и КОПЕРНИКОВ полно и все они разные …
Так что не сердитесь!

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

Китайский ещё ладно, там есть определённые паттерны из которых состоят все иероглифы,

Нашим китайским товарищам Метапрог понравится.
А мы деды не может понять всей КРАСОТЫ наскальных алгоритмов …

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

Я первый раз увидел Перл во времена S.T.A.L.K.E.R, когда разрабы ещё не отдали SDK — человек написал компилятор/декомпилятор спавна игровых объектов (можно было новые добавить/старые изменить) и анпакер ресурсов на Перл. Это было году в 2008.

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

Я первый раз увидел Перл во времена S.T.A.L.K.E.R, к

Для Perl разработаны тоны алгоритмов /и много хороших/.
На CPAN и inet конечно имеется некоторое упорядочивание инфы об API, но хорошей НЕТ.
Поэтому /в частности/ о многом хорошем API, которые реально бы помогло сэкономить много времени разработчики и не знают …

anonymous ()

Что-то тред «заглох».

ТС в основном интересует парсинг текста, а в Perl как в Си имеются операции для работы с битами.
Проще говоря, на Perl относительно не сложно можно работать и с бинарными данными …

anonymous ()

Как интересно автор по ходу беседы переобувается

Просмотрел первый тред, второй тред…

Изначально считали количество строк. Как это соотносится с выводами «Перл - хороший/плохой» - непонятно (мои соображения на эту тему см. ниже). Ну да ладно, будем считать что очередной такой себе https://codegolf.stackexchange.com/

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

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

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

А еще я так и не увидел кода автора на Перле, который «заняла 5 строк не считая ввода-вывода». Зато во втором треде, который, вспоминаем, про Перл в заголовочном сообщении код на PHP. Что за винегрет?

А ещё я очень хотел увидеть код С++. ТС, ты бы хоть ссылку дал, а то говоришь что он быстрее, а где он? Я один нашел в первом треде, но там ужас-ужас, надеюсь, есть что-то ещё. Зато куски кода на не всегда очевидных языках в первых сообщениях второго треда (хоть бы подписывал на каком языке это).

Теперь некоторые соображения моего сонного разума.

Во-первых, нет хороших и плохих языков. Каждый язык хорош для своего класса задач. Ты вряд ли будешь писать для WEB на ассемблере, а ядро на JavaScript (да, я знаю, не нужно постить эту ссылку, пожалуйста). Да, сейчас этих языков расплодилось много, и какой из них для чего не всегда понятно. Ну так нужно в этом разбираться, и на эту тему топик открывать. Например, я вот недавно столкнулся с тем, что интерпретируемые языки, такие как Python, не очень подходят для контейнеров, так как контейнеры получаются большими. Но, например, для системного администрирования и для скриптинга они отлично подходят.

Во-вторых, краткость кода - вообще не критерий выбора языка. Код должен быть читабелен. Да, когда меньше кода, скорее всего меньше времени потратишь на его разбор (и написание). Но далеко не факт. В любом случае нельзя приводить краткость в ущерб читабельности. Или в ущерб стабильности или безопасности. А еще, коль мы говорим о разных языках, то, что в одном языка делается просто, в другом сложнее, и наоборот. Те, кто это понимает, всегда могут подобрать такую задачку, чтобы именно его язык вышел победителем. А другие, которые не понимают, покупаются на это.

В-третьих, прекратите мерять скорость языков (программ реализованных на разных языках). Это очень сильно зависит от выбранных алгоритмов, от встроенных в компилятор оптимизаций, от умений программиста (насколько он умеет тюнить под производительность алгоритм включать оптимизации), в частности и не в последнюю очередь - задействовано ли распараллеливание и т. п. Вы не сможете так сравнить так языки программирования. Цель второго треда не имеет смысла.

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

Ну и напоследок, вот набросал на С++. Не знаю по какому принципу строчки считаются - с пробелами или без, с include’ами или без… Формально условия задачи выполняет. Опять же чёткий тест-кейс нигде не описан, всё размазано по тредам…

Сам алгоритм:

std::wstring r; // Result

for (auto it = word2.begin(); it-1 != word2.end() ; ++it)
    if ( word1.ends_with( std::wstring(word2.begin(), it) ) )
        r = word1 + std::wstring(it, word2.end());

В запускабельном виде:

// Compilation: g++ -std=c++20 combine.cpp

#include <iostream>

std::wstring combine(const std::wstring &word1, const std::wstring &word2)
{
    std::wstring r; // Result

    for (auto it = word2.begin(); it-1 != word2.end() ; ++it)
        if ( word1.ends_with( std::wstring(word2.begin(), it) ) )
            r = word1 + std::wstring(it, word2.end());

    return r;
}

int main()
{
    // Unicode support
    // Needed for wcout only; otherwise will transliterate cyrillic letters
    // https://stackoverflow.com/questions/3207704/how-can-i-cin-and-cout-some-unicode-text
    std::ios_base::sync_with_stdio(false);
    std::wcout.imbue(std::locale("en_US.UTF-8"));

    // Test
    std::wstring r;
    r = combine(L"шлакоблок", L"окунь"); // Mind L prefix
    std::wcout << r << std::endl;
    r = combine(L"папа", L"папаха");
    std::wcout << r << std::endl;
    r = combine(L"спорт", L"карась");
    std::wcout << r << std::endl;
}
Kroz ★★★★★ ()

Всё не прочитал. Слишком много букв. Но.

#!/usr/bin/perl
 
$_= "шлакоблок + окунь";
#$_= "папа + папаха";

($u1,$u2) = split/[+\s]+/;

for(split(//,$u2)){
  $v .= $_;
  if ($u1 =~ /$v$/) {$v1=$v}  
  }

$u2 =~ s/$v1//;

print "$u1$u2";

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

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

Пёрдл не нужен

В характерной фразе «пёрдл не нужен» видим ключевое слово - «пёрдл».

Казалось бы, неприязнь направлена на какой-то язык программирования, но анонимус-то видит глубже.

Короче, экологическую нишу освободите, старые пёрдуны!

anonymous ()

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

Звук-втягивания-воздуха-носом-х2.ogg Да старый. Затхлый. Проверили.

anonymous ()

Perl - хороший язык, но не для всех. Не корпоративный, чтобы менять программистов как шестеренки, это язык для своих задач, для opensource - когда нужен мощный сложный мультитул, а не оплата по числу loc.

Проблема в том, что рынок работы по Перлу сужается ежегодно - да сейчас есть вакансии на перле от $3-4k+/мес, но вопрос что будет через год-два. Есть риск зависнуть или опреативно учить новое.

Жаль, что Perl6/Raku не взлетел, но это известная проблема - люди хотели переписать с нуля, сделать что-то новое и несоместимое пока другие PHP/Python/Java допиливали и рефакторили что есть. В итоге сделали, но разработчики ушли.

Сам Perl как таковой развивается - ежегодные релизы, YaPC проходит, perlgov обновляется.

Говорить, что перл мертв, но тогда и bash мертв и Unix мертв.

Считать Python суперязыком? Ну да, определять логику кода отступами это тоже довольно устаревшая идея. Установка библиотек вообще ад, ничего близко нет к стандарту CPAN.

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

Я лет 15 назад написал на перле движок для своего персонального сайта
Когда лет 5 назад попробовал что-то переделать в движке и нырнул в свой же код, понял, что местами перестал его понимать
Произошло это оттого, что перл практически нигде не использовал больше, но зато успел за это время засрать свой мозг питоновскими и прочими парадигмами
Перл не майнстримный язык

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

Да дело не в парадигме (ох и мерзкое же словечко). Совсем. Дело в степени выразительности. Вон выше приведён пример со split-filter-join - написано в одну строку, но всё предельно понятно. А у топикстартера — пыхпых головного мозга, поэтому он и считает это месиво из знаков доллара, подчёркиваний, точек с запятой и прочих служебных символов чем-то прекрасным. Разумеется, спустя годы даже собственноручно написанный в таком стиле (если это слово вообще к такому применимо) код разобрать крайне тяжело. Даже если ты владеешь ЯП настолько, что после минификатора способен вручную сжать код ещё процентов на 10.

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

Ваш код работает неправильно:

console.log(lm(‘перл’, ‘наилучший’)) дает ошибочный ответ: пернаилучший

console.log(lm(‘джаваскрипт’, ‘скрипит’)) джаваскрипскрипит

В Perl тоже можно написать такой односторочник с использованием split(), grep(), join(). Там тоже можно так.

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

Разработка ≠ кодинг, но об этом дятлам невдомёк

В миллионный раз повторяю. То что называете месивом - это есть Регулярные выражения. И они есть во всех языках. Не знаешь регулярки - не программист.

Надо же, какое бахвальство!

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

Во-вторых, дятел, разбирающийся в регулярках — ещё не программист, а всего лишь дятел, разбирающийся в регулярках. Настоящего программиста от быдлокодера отличает способность в первую очередь анализировать суть задачи и подбирать достаточный инструментарий для её решения, при этом не забывая о том, чтобы это решение оставалось понятным для других. Поэтому там, где программисту достаточно грамотно структурировать код и обойтись нативным API, быдлокодер всегда набросает кучу фреймворков. Там, где программисту достаточно использовать обычные функции манипуляции со строками, быдлокодер набросает кучу регулярных выражений, упарывающих всю оптимизацию, зато поднимающих его ЧСВ до заоблачных высот.

И да, синтаксис регулярок я знаю. Но именно из-за таких вот дятлов, приравнявших само понятие разработки к кодописательству за 2 евро в час, а изучение ЯП — к оторванным от жизни говнозадачкам, само слово "программист" уже стало не меньшим клеймом, чем "айтишник", от которого вменяемые люди с чувством собственного достоинства (а не собственного величия, как у быдлокодеров) всё больше и больше стараются дистанцироваться.

Да, есть нюансы, которые тот однострочник со split-filter-join не покрывает. Но метать бисер перед местными "программистами" людям, смотрящим на решение реальных кейсов, уже как-то не к лицу.

С неуважением, непрограммист.

anonymous ()