LINUX.ORG.RU

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

 , , , ,


9

4

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

Задачка:

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

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

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

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

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

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



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

Может быть расскажешь этим добрым людям что ещё можно интересного сделать? Мне в голову приходят только символы-операторы юникодовые @Lilly

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

И ведь более чем читабельно при всей лаконичности, джа? Самое крутое, что язык Perl’овый и не нужно знать его весь чтоб начать использовать.

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

Только благодаря этой теме узнал о Raku, выглядит достойно

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

Они переписали руби обратно в перловом стиле?

STDIN.read.lines do |line|
    a, b = line.strip.split(/[ +]+/)
    puts (0..a.size).map{|i| a[0,i] + b}.find{|x| x.start_with? a}
end
wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от perl5_guy

Я гольфить не умею от слова совсем, так что бестолковый, ха.

Первое решение пришедшее в голову это с produce/map:

my ($x, $y) = <шлакоблок окунь>;
$y.comb.produce(&[~]).map({ $x.ends-with($_) ?? $x ~ $y.substr(.chars) !! Empty }).first.say

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

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

По условиям задачи правильнее только будет так:

> for $*IN.lines {
    if .words.elems != 2 { say "I want two words..."; next }
    my ($x, $y) = |.words;
    say $y.comb.produce(&[~]).map({ $x.ends-with($_) ?? $x ~ $y.substr(.chars) !! Empty }).max // "$x$y"
}
о к
ок
шлакоблок окунь
шлакоблокунь
форель рельса
форельса
папа папаха
папаха
^CPressed CTRL-c, press CTRL-c again to exit

5 строчек с вводом-выводом, всё по канонам Супер-пупер языков.

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

На супер-пупер языках достаточно одной строчки.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.13.0.0.0

SQL> with x as (select column_value str from table(sys.odcivarchar2list('шлакоблок + окунь', 'папа + папаха', 'карусель + сельдь', 'спорткар + карась', 'форель + рельса'))),words as (select substr(str, 1, instr(str, ' + ') - 1) w1, substr(str, instr(str, ' + ') + length(' + ')) w2 from x) select w1, w2, res from (select w1, w2, res, lvl, max(lvl) over(partition by w1, w2) maxlvl from (select w1, w2, substr(w1, 1, length(w1) - lvl) || w2 res, lvl from (select w.w1, w.w2, l.* from words w, lateral(select  level lvl, substr(w.w2, 1, level) w1s, substr(w.w1, length(w.w1) - level + 1) w2s from dual connect by level <= length(w.w2)) l) where w1s = w2s)) where lvl = maxlvl;

W1                   W2                   RES                                     
-------------------- -------------------- ----------------------------------------
карусель             сельдь               карусельдь                              
папа                 папаха               папаха                                  
спорткар             карась               спорткарась                             
форель               рельса               форельса                                
шлакоблок            окунь                шлакоблокунь  

nanonymous
()

Это всё конечно оч круто. Тут собрались умные перлисты, питонисты, джависты и даже SQLисты.

Но я всё ждал, когда кто-нибудь напишет, что задача решается без языков программирования вообще, одной регуляркой:

$ sed -E 's/\s*([^+[:space:]]*?)([^+[:space:]]*)\s*[ +]\s*\2/\1\2/' < 1.txt
шлакоблокунь
папаха
карусельдь
спорткарась
форельса
хренога
бугаганесовпало
ааабб

Перлисты уже не те!

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

Ну 4.2 же. «Одна регулярка» это просто выражение для сравнения, а s/// штучки это уже не «решается без языков программирования». Да и желание всё подряд решать регулярками от лукавого, когда читабельное решение занимает почти столько же символов.

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

Тем не менее, регулярка правильно захватывает нужные части выражения. А чем их вывести это уже дело десятое. Это в любом случае одна строка на любом ЯП. Без сложных операций над строками на самом ЯП.

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

Ну если проверка ends-with и конкатенация строк это та-а-а-акие сложные операции по сравнению с читабельным и понятным s/\s*([^+[:space:]]*?)([^+[:space:]]*)\s*[ +]\s*\2/\1\2/, то да.

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

без языков программирования

Здрасьте, с каких это пор sed перестал быть языком программирования?

Miguel ★★★★★
()

Ок, выступлю на С++, одна строка:

using namespace std;int main(int a, char *v[]){for(int i=0;i<a/3;i++){int index=1+i*3;auto l=string(v[index]);auto r=string(v[index+2]);for(int x=0;x<l.length()-2;x+=2){if(l.compare(r.substr(0,l.length()))==0){cout<<r<<endl;break;}string o="";o+=l.substr(0,x+2);o+=r;auto c=o.substr(0,l.length());if(l.compare(c)==0){cout<<o<<endl;break;}}}};

Проверяем

clang++ -include"iostream" minifiedMax.cpp && ./a.out шлакоблок + окунь петух + тухлятина дырявый + сарай папа + папаха
Результат
шлакоблокунь
петухлятина
папаха
Код не в одну строчку с дебагом:

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

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

Ещё в копилочку хороших ругательств: «петухлятина».

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

sbcl не использует столько библиотек. Я специально привёл строчку, куда подевалось больше гига RAM - это блок памяти выделенный при помощи malloc или mmap.

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

ШОК! МАГИЯ! SBCL!

ugoday@debian:~$ free -m
               total        used        free      shared  buff/cache   available
Mem:             221          60          15           0         144         152
Swap:              0           0           0
ugoday@debian:~$ pmap -x $(pgrep sbcl)| tail -1
total kB         1228080   20476     564

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

Смирись, шлакоблокунь, твой код взвешен, измерен и признан негодным.

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

Решение одной регуляркой - это всё равно очень интересно и познавательно. Жалко что у меня нет сейчас времени.

kompospec
() автор топика
Ответ на: ШОК! МАГИЯ! SBCL! от ugoday

Из этого гигабайта, который показывает pmap, по его же данным к RSS и PSS относятся лишь по 68 Кб.

Но он определённо показывает размер блока в 1023680 Кб. И это не память разделяемой библиотеки, а именно anon block.

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

Напомнило одного товарища, с гордостью вещающего про то, что раньше он писал на плюсах, какое плюсы ненужно и вот он перешел на жабу и насколько его волосы стали шелковистее.

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

Вопрос не в удобстве, это вынужденная необходимость. :)

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

Вы не знали что Перл лучший язык? Повторю - на нём половина Линукса написана

Вы об этом Линусу уже сообщили? А то он видимо бухой был и пропустил этот момент.

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

Глупый товарищ. И плюсы нужны и жаба нужна в своём месте. На плюсах я прошивку для процессора в несколько килобайтов пишу. А на жаве микросервисы, жрущие сотни мегабайтов. А перл не нужен. И С не нужен.

Вот раст это да. Он их всех может заменить в теории. Мощная штука.

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

Работа с БД, с файловой системой, системными командами - всё это в Перле элементарно.
Этой лёгкости нет в php - что очень жалко.

Шо за БД? dbase, fox, paradox, что-то ещё ?

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

Вы можете использовать стандартный механизм терминала юникс для ввода и вывода в файл, с любым из решений которое работает с stdin и stdout

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

Как то мне кажется - что это вы. Не стану с вами общаться. И никому не советую. А то получите в Телегу такие же матерки

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

Дописал:

#!/usr/bin/perl

open D, 'vxod.txt';
open V, '>vyxod.txt';

while (<D>) {
$v='';
($_,$r)=split/[+\s]+/;
for$k(split(//,$r)){
$v.=$k;
$v1=$v if/$v$/}
$r=~s/$v1//;

print V "$_$r\n";
}
kompospec
() автор топика
Ответ на: комментарий от kompospec
#!/usr/bin/perl

use Time::HiRes;

print "Content-type: text/html\n\n";

&verx('Скрипт для слияния 2 слов');

$t = Time::HiRes::time;


open D, 'vxod.txt';
open V, '>vyxod.txt';

while (<D>) {
$v='';
($_,$r)=split/[+\s]+/;
for$k(split(//,$r)){
$v.=$k;
$v1=$v if/$v$/}
$r=~s/$v1//;

print V "$_$r\n";
}

$t2 = Time::HiRes::time;


$t3 = $t2-$t;
      print "Время работы скрипта ";
      printf('%0.8f', $t3);
      print " сек <p>";
      #print "$t3 <br>".time();

close V;

open V, 'vyxod.txt';
while (<V>) {
  
  print;
  
  }



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

Меня просто поражают люди которые говорят банальные вещи с очень умно-значимым видом.

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

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