LINUX.ORG.RU

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

 , , , ,


9

4

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

Задачка:

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

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

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

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

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

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



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

О, кто-то решил лабу зарешать на первом курсе силами ЛОР-а и отобрать лучший вариант на нужном ЯП? Не, пока своё поделие не выложишь, нормальные люди даже не будут пытаться что-то там писать.

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

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

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

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

Да собственно ничего не предвещало беды, но вдруг на проде что посыпалось. Полезли смотреть, а там кросивое.

wandrien ★★
()

10 страниц и ни одного решения на Perl'е...

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use v5.10;

binmode ( STDOUT, 'encoding(UTF-8)' );

my ( $x, $y ) = qw( шлакоблок окунь );

$x =~ m<
    .+$ (??{
        $y =~ /^$&/ && exit( say $x, $' )
    })(?!)
>x;

perl5_guy ★★★★★
()
Ответ на: комментарий от saahriktu
% sbcl --eval '(defun hello () (format t "Hello, World!~%"))'  --eval "(sb-ext:save-lisp-and-die #p\"hw\" :toplevel #'hello :executable t :compression t)"
This is SBCL 2.0.1.debian, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

………

% ls -lht
total 12M
-rwxr-xr-x 1 *** *** 12M Nov  1 17:13 hw
% ./hw
Hello, World!
ugoday ★★★★★
()

В своё время копаясь в проприетарных исходниках Nokia (Symbian UIQ2, Symbian S60, S40) и Motorola (P2K, EZX, MotoMAGX) был сильно удивлён насколько там всё подвязано именно на использование различных Perl-скриптов. На этих же скриптах там были выполнены надстройки над сборочными системами. Часть из этого потом попала в паблик (различные SDK, открытые исходники Linux и Symbian и пр.).

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

Вообще звучит как описание C#

Не считая последнего пункта

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

(?{}), а не (??{}). Ну и да, так на Perl’е никто не пишет. Это чтоб попки поджечь в этом ИТТ треде.

perl5_guy ★★★★★
()

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

Ок, на наших, так на наших. Сплит делать не интересно, зато покажу как обойтись без подстрок (и без скобочек, конечно).

def main
    #*s1 @string "шлакоблок"
    #*s2 @string "окунь"
    *s1 @string "папа"
    *s2 @string "папаха"
    *len1 @int @size s1
    *len2 @int @size s2
    *i @int 0
    *j @int 0
    for
        if i len1
            break
        if j len2
            break
        if s1|i s2|j
            j + 1
        else
            j = 0
        i + 1
    s2 @erase 0 j
    s1 + s2
    @print s1
Kogrom
()
Ответ на: комментарий от ugoday

Я про RAM занятую «sbcl --script» говорил. pmap показывает что-то в районе

 total          1238268K
При этом
0000001001550000 1026752K rwx--   [ anon ]

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

Да. И дообъекноориентировать пистон. Тогда чему ты удивляешься?

ashot ★★★★
()

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

#include <string.h>
#include <stdio.h>

static int u8l(const char *c)
{
    if ((*c & 0x80) == 0)
        return 1;
#define U(i) ((c[i] & 0xc0) == 0x80)
    if ((*c & 0xe0) == 0xc0 && U(1))
        return 2;
    if ((*c & 0xf0) == 0xe0 && U(1) && U(2))
        return 3;
    if ((*c & 0xf8) == 0xf0 && U(1) && U(2) && U(3))
        return 4;
#undef U
    return 1;
}

static int
solve(const char *a, const char *b)
{
    int l = strlen(a);
    int common = 0, i = u8l(b);
    for (; i <= l; i += u8l(b + i))
    {
        if (memcmp(a + l - i, b, i) == 0)
            common = i;
    }
    return common;
}

int main()
{
    const char *data[][2] = {
        {"шлакоблок", "окунь"},
        {"папа", "папаха"},
        {"карусель", "сельдь"},
        {"спорткар", "карась"},
        {"форель", "рельса"},
    };
    for (int i = 0; i < sizeof(data) / sizeof(*data); i++) {
        const char *a = data[i][0], *b = data[i][1];
        int l = solve(a, b);
        printf("\"%s\" + \"%s\" => %s%s\n", a, b, a, b + l);
    }
    return 0;
}

P. S. почти 700kb статически слинкованный пострипанный бинарник — ужас, как мы докатились до жизни такой?

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

В этом вся суть питона

Питон вполне неплох, когда он не системный.

Собраешь в pyenv нужную под приложение версию и радуешься. (Если собралось, лол.)

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

Я бы вообще за попытку протащить такие ЯП в глубины /usr нещадно давал по щщам, но мейнтейнеры дистров другого мнения.

wandrien ★★
()

Я слабо знаю Raku, поэтому могут быть ошибки и уверен что можно более красиво написать. Тем не менее:

my ( $x, $y ) = < форель рельса >;

( 0 .. $x.chars )
    .map({ substr( $x, 0, $_ ) ~ $y })
    .first( /^$x/ )
    .put()
perl5_guy ★★★★★
()
Последнее исправление: perl5_guy (всего исправлений: 2)
Ответ на: комментарий от rupert

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

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

Лучше не вникай, побереги мозг. Нас-то уже не спасти…

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

Для хэйтеров регвыров можно использовать: .first({ .starts-with( $x ) })

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

На самом деле было бы интересно посмотреть бенчмарки производительности при решении этой задачи на всех представленных здесь языках.

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

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

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

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

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

Да не вопрос вообще. Точнее это только вопрос того, кто это всё оплатит? Я бесплатно работаю редко и ваше предложение - это точно не тот случай.

У вас какое образование?

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

Графики. Кстати сейчас работа именно с ними. Клиент хочет чтоб с различных(по выбору) Друпаловских Нод выводились поля, суммировались, умножались на НДС и выводились в виде графиков. Уже почти всё сделал.

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

Я заметил, как начинаешь спрашивать про образование - все сразу выдумывают кучу причин чтоб съехать с темы

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

Инженерное дело оно такое, требует доказательства в удобной и читаемой форме. Многию люди визуалы и формалисты, не верят наслово.

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

Ждите тогда. Мне это тема превосходства Друпала интересна, вобщем то. и я буду её потихоньку рыть

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

Если человек «в теме» и всё понимает в этой теме - ему достаточно на код посмотреть

А вот если ничего не понимает - то таблицу подавай

А если совсем не понимает - то график

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

Понимаю. Использование памяти в линуксе сложная тема особенно с учётом динамических библиотек и что такое «занятая RAM» вот так сразу без бутылки не разберёшься. Но вы почитайте что-нибудь по теме. А для начала можно запустить pmap -x $pgrep sbcl) и попробовать объяснить разницу между total и RSS.

ugoday ★★★★★
()

Ещё немного синтаксических чудес принёс вам, добрые мои друзья:

my (\x, \y) = < форель рельса >;

( 0 .. * )
    .map({ substr( x, 0, $_ ) ~ y })
    .first({ .starts-with: x })
    .put
perl5_guy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.