LINUX.ORG.RU

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

 , , , ,


9

4

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

Задачка:

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

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

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

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

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

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



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

Нет,

Необходимо для каждой пары слов получить новое слово, так, чтобы окончание первого совпадало с началом второго, … Это слово надо вывести в стандартный поток вывода

demensdeum
()

Тред не читал

portmanteau a b = take n a ++ b
  where n = head [ x | x <- [0..length a], drop x a == take (length a - x) b ]
main = getContents >>= mapM_ (putStrLn . (\[a, b] -> portmanteau a b) . words) . lines

Если хотим склеивать таким образом все слова в строке, а не только 2, то

portmanteau a b = take n a ++ b
  where n = head [ x | x <- [0..length a], drop x a == take (length a - x) b ]
portmanteauMany = foldl portmanteau ""
main = getContents >>= mapM_ (putStrLn . portmanteauMany . words) . lines
balsoft ★★
()
Последнее исправление: balsoft (всего исправлений: 3)
Ответ на: комментарий от anc

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

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

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

На всякий случай. В моем примере переписали на С и все стало просто замечательно. И старый и новый варианты работали в однопотоке.
ЗЫ Я не против перла, написал на нем и немало. Я только про то, что каждой задаче свой инструмент.

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

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

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

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

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

Да?

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

и на перле можно писать читаемые программы

Не смог удержаться. Но баксы иногда просто выбешивать начинают :)

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

Люто плюсую!

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

А вы, кто не знает Перла - обзывалки с недостаточным образованием.

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

только не программист, а системный администратор (сколько статей и книг было написано «perl в помощь системному администратору»), и не сейчас, так как python затмит его по популярности. В конце концов, автоматизация рутины - это его ниша (Practical Extraction and Report Language («практический язык для извлечения данных и составления отчётов»)).

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

Ну вот. Окончание первого (с нулевой длиной) совпадает с началом второго (с нулевой длиной). Как ещё это можно интерпретировать?

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

На Перл это так:

s/([^+\s]?)([^+\s])[\s+]+\2/$1$2/;

А на Джава я что-то даже не нашёл ничего подобного.

Есть такое? В частности: $1 $2 \2 ?

Спасибо.

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

Это можно расценивать как завершение первой спецолимпиады «у кого короче» и начало второй «у кого толще»?

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

Вы посмотрите внимательно - там совсем не я начал «кто короче»

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

Я все жду решение на Brainfuck, но видимо у kompospec не настолько крутой конвертер из perl

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

Поздравляю, вы победили в специальной олимпиаде, не забудьте позвонить маме и порадовать

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

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

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

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

Начало выходного файла для примера:

абажурность = абажур + ажурность
абажуравель = абажур + журавель
абажуравельник = абажур + журавельник
абажуравлёнок = абажур + журавлёнок
абажуравлик = абажур + журавлик
абажуравлиха = абажур + журавлиха
абажуравль = абажур + журавль
абажуравушка = абажур + журавушка
абажурение = абажур + журение
абажурка = абажур + журка
абажурнал = абажур + журнал
абажурналец = абажур + журналец
абажурнализм = абажур + журнализм
абажурналист = абажур + журналист
...

Привожу свой код:

def check_combine
    mref res:string
    cref s1:string s2:string
    *len2 @int @size s2
    *j @int 0
    for *ch in s1
        if j len2
            break
        if ch s2|j
            j + 1
        else
            j = 0
    if < j 6 # 3 russian letters
        res = ""
    else
        *s3 @string s2 @erase 0 j
        res = s1 + s3
    
def main
    *inFile @file @set_mode "r" @open "russian_nouns.txt"
    *outFile @file @set_mode "w" @open "out_file.txt"
    *sOut @string ""
    *lines @array|string 
    lines inFile @getlines
    *counter @int 0
    for *s1 in lines
        for *s2 in lines
            if s1 s2
                continue
            *res @string @check_combine s1 s2
            if res s1
                continue
            if res s2
                continue
            if != res ""
                sOut + res " = " s1 " + " s2 "\n"
                counter + 1
                *ret @int counter % 1000
                if ret 0
                    @print "."
                    outFile @write sOut
                    sOut @clear
    outFile @write sOut 
    
    inFile @close
    outFile @close 

Дополнительно я каждые 1000 сочетаний выводил точку и скидывал строку в файл. Это мне нужно было только для контроля работы программы. Можно убрать для ускорения работы.

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

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

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

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

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

я всегда рассматривал perl - именно как язык автоматизации рутины, и вот когда ты пытаешься что то быстренько автоматизировать, а тебе под дых - это уже как то не интересно становится. Сейчас если мне что то такое понадобиться, а bash не хватит (очень муторно будет делать на bash) - я наверно выберу python, хотя меня бесят эти отступы (уж не знаю почему)

Silerus ★★★★
()
Последнее исправление: Silerus (всего исправлений: 1)
Ответ на: комментарий от demensdeum
  1. Хакерская культура оказалась слишком притягательной.

  2. Корпорациям не нужны выпендрёжники «я запишу это на 3 символа короче», а нужны стабильно работающие, воспроизводимые решения.

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

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

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

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

Вывод - одна строка. Вычислений - много. Берёмся? Сейчас вытащу этот текстовый файл.

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

Выгрузите в RAM весь словарь и получите метрики, это можно сделать с помощью строковых потоков.

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

Я уже начал. Код никому не показываем. Но и не мухлюем. Сейчас в словаре всё по алфавиту - так оно и должно оставаться. Ищем максимальное вхождение одного слова в другое. Ок?

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

Что за ковбойская дуэль у вас, запустите оба варианта на своей машине.

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

Могу дать фору: если отсортировать по размеру и использовать потоки, то можно ускорить вычисление в разы. Но в «моём Супер-пупер языке» пока потоков нет, да и настраиваемую сортировку я пока не завёз. Не нужно было. Оставлю это плюсовикам, если они захотят соревноваться.

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

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

Silerus ★★★★
()

Всеравно не понимаю зачем для этой задачи регулярки, достаточно strncpy, strncmp, от регулярок только бинарик растет да время компиляции (185кб vs 17кб)
Регулярки на микроконтроллер не всунуть даже тупо из-за размера, кому оно нужно такое.

https://gitlab.com/demensdeum/wordcross/-/blob/main/wordcross.cpp
https://gitlab.com/demensdeum/wordcross/-/blob/main/cppRegex/wordcross.cpp

demensdeum
()
Последнее исправление: demensdeum (всего исправлений: 1)

Неправда, некому уже о по покойному сквернословить.

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

Конечный автомат работает за линейное время, а на этих ваших strncpy, strncmp моргнуть не успеешь, как O(N^2) выйдет.

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

А на личные вопросы никто отвечать не обязан. И вопрос про образование — довольно-таки хамский.

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