LINUX.ORG.RU

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

 , , , ,


9

4

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

Задачка:

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

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

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

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

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

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



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

Да, вывода на экран нет. Я print в файл неправильно понял. Но в любом случае, работа с файлом (жестким диском) вносит большую погрешность. Если её убрать, то ОС тем более будет каждый раз показывать разный результат.

Тогда про что мне тут говорили что Перл очень низкопроизводительный?

Про Перл говорили так, потому что он интерпретируемый и с динамической типизацией. Для этой задачи неважно какой язык брать. Тормоза появятся при сложной обработке большого объёма данных, типа обработке изображений или видео. Или текст взять на пару сотен мегабайт.

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

Не нужно голых слов. Давайте код. Дело в том, что я спорю не первый раз. - Перл был лучше С++ Гдето была тема - там проводили сравнение

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

Там код на Перле неправильный - слишком читаемый. Надо простые числа с помощью регулярок вычислять - тогда будет быстрее, чем C++.

Kogrom
()
~/workspace via 🐍 v3.10.0 
➜ vi sharada.py      

~/workspace via 🐍 v3.10.0 took 1m17s 
➜ chmod +x sharada.py        

~/workspace via 🐍 v3.10.0 
➜ ./sharada.py окунь шлакоблок
шлакоблокунь

~/workspace via 🐍 v3.10.0 
➜ ./sharada.py шлакоблок окунь
шлакоблокунь

~/workspace via 🐍 v3.10.0 
➜ cat sharada.py       
#!/usr/bin/env python
import difflib, sys
w1, w2, *_ = sorted(sys.argv[1:], key=lambda s: len(s))
m = difflib.SequenceMatcher(None, w1, w2).find_longest_match()
print(w2 + w1[m.size:])
tz4678 ★★
()
Ответ на: комментарий от tz4678

Без встроенных либ что-то такое должно работать:

longest = 'шлакоблок'
shortest = 'окунь'
m = max(longest.find(shortest[:i]) for i in range(1, len(shortest) + 1))
longest[:m] + shortest
tz4678 ★★
()
Последнее исправление: tz4678 (всего исправлений: 2)
Ответ на: комментарий от dsxl

Мило. C-шный вариант из того коммента на моей машине даёт

$ gcc -O0 sieve.c -o sieve
$ time ./sieve 50100200
50100191 3006742

real	0m1.104s
user	0m0.678s
sys	0m0.053s
$ gcc -O3 sieve.c -o sieve
$ time ./sieve 50100200
50100191 3006742

real	0m0.892s
user	0m0.476s
sys	0m0.044s

Хаскельный аналог на той же машине:

$ ghc -O0 --make sieve
[1 of 1] Compiling Main             ( sieve.hs, sieve.o )
Linking sieve ...
iMac:~ MigMit$ time ./sieve 50100200
(50100191,3006742)

real	0m33.922s
user	0m33.385s
sys	0m0.276s
$ ghc -O3 --make sieve
[1 of 1] Compiling Main             ( sieve.hs, sieve.o ) [Optimisation flags changed]
Linking sieve ...
$ time ./sieve 50100200
(50100191,3006742)

real	0m1.334s
user	0m0.901s
sys	0m0.069s

С оптимизацией — вполне неплохо, надо заметить. Не ожидал.

Сам код:

module Main where
import Control.Monad
import Data.Array.IO
import Data.Foldable
import System.Environment
main =
    do [arg] <- getArgs
       let size = read arg
       primes <- newArray (2, size) True :: IO (IOUArray Int Bool)
       forM_ (takeWhile (\i -> i*i <= size) [2..]) $ \i -> do
         isPrime <- readArray primes i
         if not isPrime
           then return ()
           else forM_ [2*i, 3*i .. size] $ \j -> writeArray primes j False
       let check :: (Int, Int) -> Int -> IO (Int, Int)
           check (j, k) i = do
             isPrime <- readArray primes i
             return $ if isPrime then (i, k+1) else (j, k)
       jk <- foldM check (0, 0) [2..size]
       print jk

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

а ТС предлагал сравнивать перл с другими языками

Сравнение в виде кол-ва символов это только для специальных олимпиад.

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

У меня было около 50 сайтов с которых капала денюшка.
было

Эпичненько

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

это неверно. на js еще попобовал:

#!/usr/bin/env node
let [longest, shortest] = process.argv.slice(2).sort((a, b) => b.length - a.length)
let i = shortest.length
while (--i) {
  if (longest.slice(-i) == shortest.slice(0, i)) break
}
console.log(longest + shortest.slice(i))
~/workspace via ⬢ v16.13.0 via 🐍 v3.10.0 took 7s 
➜ chmod +x sharada.js

~/workspace via ⬢ v16.13.0 via 🐍 v3.10.0 
➜ ./sharada.js шлакоблок окунь
шлакоблокунь

~/workspace via ⬢ v16.13.0 via 🐍 v3.10.0 
➜ ./sharada.js окунь шлакоблок
шлакоблокунь

~/workspace via ⬢ v16.13.0 via 🐍 v3.10.0 
➜ ./sharada.js папа папаха    
папахапапа
tz4678 ★★
()
Ответ на: комментарий от kompospec

Перл был лучше С++

Ну наговнокодить на любом ЯП можно.

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

Перл правда существенно медленнее. Было дело для прода парсили сквидовые логи. После обьема S перл стал совсем не интересен.

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

Исправив баг с папахой:

#!/usr/bin/env node
let [longest, shortest] = process.argv.slice(2).sort((a, b) => b.length - a.length)
let i = shortest.length
while (--i) {
  if (longest.slice(-i) == shortest.slice(0, i))
    console.log(longest + shortest.slice(i))
}

я понял, что нужно смотреть еще и слева:

~/workspace via ⬢ v16.13.0 via 🐍 v3.10.0 took 10s 
➜ ./sharada.js окунь шлакоблок
шлакоблокунь

~/workspace via ⬢ v16.13.0 via 🐍 v3.10.0 
➜ ./sharada.js папа папаха    
папаха

~/workspace via ⬢ v16.13.0 via 🐍 v3.10.0 
➜ cat sharada.js             
#!/usr/bin/env node
let [longest, shortest] = process.argv.slice(2).sort((a, b) => b.length - a.length)
let i = shortest.length
while (--i) {
  if (longest.slice(0, i) == shortest.slice(0, i)) {
    console.log(shortest + longest.slice(i + 1))
    break
  }
  if (longest.slice(-i) == shortest.slice(0, i)) {
    console.log(longest + shortest.slice(i))
    break
  }
}

tz4678 ★★
()

Какой унылый тролль.

Тред не читал. Он код на Perl привёл в итоге, или продолжает инфоповод для троллинга из пальца высасывать?

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

Включил свою супер-пупер программу по конвертированию файлов из Перл в С++ - perl2cpp-prokhorov

https://chajnik.ru/perl2cpp

Но ваш С++ упорно не хочет принимать нормально написанные Регулярные выражения:

#include <regex>
#include <iostream>

int main()
{
  std::string s;

s = std::regex_replace("шлакоблок + окунь", std::regex("([^+ ]*?)([^+ ]*)[ +]+\2"), "\1\2");

std::cout << s << std::endl;
}


Поэтому вы ими и не пользуетесь

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

Борьба с Регулярками в С++ продолжается - Я выяснил что вместо простой / в С++ нужно написать (R"( - ибо иначе будет «лёгкий порог вхождения» - Что в переводе с Олбанского: Мы не ищим лёгких путей. И берём с собой осенью лыжи для похода в магазин за водкой - вдруг там сугробы в метро.

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

Ждем пока научитесь читать документацию, пишите об успехах

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

Заборол вручную:

#include <regex>
#include <iostream>

int main()
{
  std::string s;

s = std::regex_replace("шлакоблок + окунь", std::regex(R"(([^+ ]*?)([^+ ]*)[ +]+\2)"), "$1$2");

std::cout << s << std::endl;
}

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

Браво! Осталось научиться читать и писать в файловые потоки, использовать namespace, дедукцию типов компилятора.

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

Усовершенствовал пробелы:

#include <regex>
#include <iostream>

int main()
{
  std::string s;

s = std::regex_replace("шлакоблок + окунь", std::regex(R"(([^+[[::s::]]]*?)([^+[[::s::]]]*)[[[::s::]]+]+\2)"), "$1$2");

std::cout << s << std::endl;
}

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

Для примера - Тоже самое на Перл:

#!/usr/bin/perl

$_ = "шлакоблок + окунь";
s/([^+\s]*?)([^+\s]*)[\s+]+\2/$1$2/;
print;

Можно сравнивать скорости, кстати.

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

For developers who are already sophisticated, they’ll see that most of the problems endemic to the currently available dynamic languages are solved in Perl 6. We understand lexical and dynamic scoping. We detect most typos at compile time. We don’t have a global interpreter lock. We encourage Smalltalk-style trait composition over uncontrolled mixins, multiple inheritance, or monkey patching.

В википедии упомянуто что из Smalltalk’а взяли и вот тебе интервью.

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

Всё готово и всё работает:

#include <iostream>
#include <fstream>
#include <regex>
using namespace std;

int main(){
  string u = "";

  ifstream D ( "vxod.txt");
  ofstream V; V.open("vyxod.txt");

  while (getline(D, u)){
    u = std::regex_replace(u, std::regex(R"(([^+\s]*?)([^+\s]*)[\s+]+\2)"), "$1$2");
    u +="\n"  ;
    cout << u;
    V << u;
  }
  return 0;
}

// Скрипт создан программой perl2cpp-prokhorov: http://chajnik.ru/perl2cpp
//// На основе исходной программы на Perl.
kompospec
() автор топика
Последнее исправление: kompospec (всего исправлений: 1)
Ответ на: комментарий от kompospec
#include <iostream>
#include <regex>
using namespace std;

int main(){
  string u = "";

u = "шлакоблок + окунь";
  u = regex_replace(u, regex(R"(([^+\s]*?)([^+\s]*)[\s+]+\2)"), "$1$2");
    u +="\n"  ;
  cout << u;
  return 0;
}

// Скрипт создан программой perl2cpp-prokhorov: http://chajnik.ru/perl2cpp
// На основе исходной программы на Perl.
kompospec
() автор топика
Последнее исправление: kompospec (всего исправлений: 1)
Ответ на: комментарий от kompospec
#include <iostream>
#include <fstream>
#include <regex>
using namespace std;

int main(){
  string u = "";

  ifstream D ( "vxod.txt");
  ofstream V; V.open("vyxod.txt");

  while (getline(D, u)){
    u = regex_replace(u, regex(R"(([^+\s]*?)([^+\s]*)[\s+]+\2)"), "$1$2");
    u +="\n"  ;
    cout << u;
    V << u;
  }
  return 0;
}

// Скрипт создан программой perl2cpp-prokhorov: http://chajnik.ru/perl2cpp
// На основе исходной программы на Perl.
kompospec
() автор топика
Ответ на: комментарий от kompospec

По-прежнему не отвечает изначальному заданию, т.к. дает результат «дырявый + сарай = дырявыйсарай», «дилетантское + мнение = дилетантскоемнение»

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