Jump to content
BulForum.com

Аде да си ги премерим...


ov3rm4n

Recommended Posts

Нещо ма наляга скуката, та викам да си спретнем едно състезанийце - награди естествено няма да има - ей тъй от любов към спорта. Става дума за решаване на задачки през Perl или PHP (а що не и Python). Целта е да се напише най-краткия възможен код който да решава поставената задача... Дойде ми на акъла като видях какво съм сътворил преди година и ми се наложи 2 часа да си блъскам главата преди да разбера какво прави и за какво служи собствения ми код... забавно е повярвайте ми. Естествено предлагайте и нови условия (задачи)! Та да открием сезона -

 

Условие 1:

 

Да се напише код, който приема като входни данни текстов файл, разбива гo на отделни думи, подрежда гo по азбучен ред и гo записва отново във файл - т.е. прави речник от подадените файлове.

 

П.С. - нормалните прагми за включване на модули не са нужни - кода се стартира от команден ред, а не от файл - за това и трябва да е възможно най-кратък...

 

 

Ето го и моя код (само си представете как съм се пулил днеска срещу него):

open T,$ARGV[0];for(<T>){$_=lc;y/[a-z]/ /cs;push@l,split}close;@l=sort(split/:/,join"\n:",grep(!$s{$_}++,@l));open T,">dict"; print T for@l;close

.... BTW: чудих се чудих се тва за кой подфорум е и реших че е за "Others" formely known as "Bullshits" - щото тва ако не е булшит здраве му кажи...

;)

Link to comment
Share on other sites

  • Replies 61
  • Created
  • Last Reply

Упс... преди някой да ми е скочил, че кода е ненужно сложен - сложен е щото освен всичко друго и премахва дублиращите се думи. Сега като го гледам и ми идват идеи как да стане по-добре, ама тогава толкова са ми били силиците.....

Link to comment
Share on other sites

Абе има какво да се желае... ама няма да си кривя душата - и аз си му се кефя (ебаси израза - да живее Бъргарския Език!). Вярвяй ми - 2 часа го разгадавах... Благодаря. Хайде включвайте се де - наистина е забавно да накараш другите да си блъскат главата какво точно прави и как го прави кода ти...

Link to comment
Share on other sites

... Благодаря. Хайде включвайте се де - наистина е забавно да накараш другите да си блъскат главата какво точно прави и как го прави кода ти...

Da be - na dve rakii i dve vina :woot, pri tva sam stanal v 6.30 :wir - napravo sha go razbia Perla :D :tongue

Link to comment
Share on other sites

Ми той Perl си е за хакване - за какво друго :D

 

Ама си прав - в състоянието дето си по-добре недей - да не пусне някой контестация за дисквалификация поради употреба на забранени стимуланти...

 

:D :D :D :D :D :D

Link to comment
Share on other sites

  undef$/;@a{split/[^a-z]/,lc<>}=();open F,'>dict';print F join"\n",sort keys%a

77 simvola

 

poqsnenie : <> raboti s $ARGV[0] ili sys STDIN

 

ov3rm4n, tvoq code dava dumi kato

[

[]

[a

z][a

....

 

trqa da ti e

y/a-z/ /cs

 

sled korekciqta tvoq i moq kod vryshtat principno identichen rezultat s razlikata che v moq izhodqsht file ima nai otgore >prazna duma<, duma s 0 simvola, ima edin prazen red v nachaloto na file-a, v zavisimost ot glednata tochka i dvete mogat da se priemat za celevi rezultat

 

imash kvo da poorejesh , ade da vidim do kvo sha dobutash

 

spored men obache uslovieto trqa da e da chete ot STDIN i da pishe na STDOUT

  undef$/;@a{split/[^a-z]/,lc<>}=();print join"\n",sort keys%a

60 simvola

Link to comment
Share on other sites

furiozo, печелиш - но както казах - това съм го кодирал когато току що бях прочел първата си книжка за Perl и току що си бях инсталирал на бозата ActiveState Perl-a... Не съм си и помислял тогава да се бъзикам с разделителя на записите или други някакви специални променливи... Ти само виж как взимам входния файл - срам, срам, срам... Прав си и за омазването с регулярния израз - трябва да си призная, че и сега все още ми е кошмарна тая тема, макар че вече по-лесно ги чета и конструирам.

Само една бележка по кода ти имам, но тя само би го направила по-малък - променяш всички думи от входа в долен регистър, а целта е да се получи на изхода това което е влязло на входа - в смисъл "Door" и "door"да се таксуват като различни думи ...

Не мисля и да се опитвам да го правя по-добре. Каквото е такова. Но като победител сега вземи да зададеш ново условие за кодиране! И без тва награди няма - викам това да е наградата - победителя определя новата задачка...

Поправките в условията на играта се приемат.

 

@karaman - радвам се, че си се включил с PHP код , за съжаление не отбирам в детайли от него... Не може обаче да няма тука и други дето кодират на PHP - хайде бе! Karaman ли е най-добрия?? :woot :woot

 

 

Furiozo - давай новото условие, че ме сърбят ръчичките!!

Link to comment
Share on other sites

Абе аз съм тъп и упорит бе... Не се отказвам лесно. :D

 

Ето и новото предложение - 91b - единствената цел в живота на това парченце код е вземе от стандартния вход файлове, съдържащи имейл адреси в себе си (примерно HTML сорс) и да извлече адресите от тях. Да премахне дублиращите се и да изведе на стандартния изход списък с адреси. Т.е. - пръв приятел на спамерчетата :) ...

 

Идеята е да се приложи върху свалените с lynx примерно сорсове на страниците върнати от Yahoo People Search - или към потока на някоя нюз група....

 

 

$"=$/;while(<>){push@i,$& if/\b[\w.-]+\@(?:[\w-]+\.)+\w+\b/}@o=grep(!$s{$_}++,@i);print"@o"

Link to comment
Share on other sites

tiq \b ti prrechat, s tqh ne hvashta neshta kato

(a@a.a)

 

az bih polzval

undef$/;@a{<>=~/([\w._-]+@[\w.-]+)/g}=1;print "$_\n"for keys%a

 

63 simvola

 

no kakto predloji cade ako izpolzvame command line switches i pishem perl -0 mojem d asi spestim undef$/; i da stane 54 simvola

 

tuk golqmo znachenie bi imalo kolko e precizen regexp-a za email, toi trqa da e ogovoren predvaritelno

Link to comment
Share on other sites

Е ти ме размаза... :D

 

Бая хляб има да изям - добре, че не се отчайвам лесно - иначе сега е момента да се откажа от Perl завинаги... Но невежеството ми само може да ме амбицира. Освен да почна да ти плащам за уроците дето ми ги преподаваш всеки път - какво пиеш и къде?! Следващия път ще гледам да се изкажа по-подготвен от първите два :D ...

Link to comment
Share on other sites

То и аз нищо не разбирам - даже се пазя да не взема много да разбирам. Ако ме разбираш какво искам да кажа. Там е работата - простото винаги е по-съвършено от сложното. Явно там ми е проблема - трябва да се науча да опростявам нещата... Защото:

 

Съвършено е не когато няма повече какво да се добави, а когато няма какво повече да се отнеме!

 

..и това не е моя мисъл (от къде у мен такива мисли), а на Екзюпери...

 

 

Няма какво да се прави - пак ще се помъча да изстискам нещо от постния си мозък - дано да затрудня cade поне малко, поне веднъж...

Link to comment
Share on other sites

Чудесно - значи предложението за заплащане на уроците остава в сила - ако ти стане досадно да ми ги даваш в кръга на играта от любов към спорта де... ;)

 

Разбрах те, разбира се - имаше предвид, че cade ми разгадава глупостите, а ти си всъщност човека дето ми мачка самочуствието :D ...

 

А иначе - усложняваш ми задачката още повече... Но аз съм млад човек - все ще успея да се справя и с двамата :D

 

След два дена ще изляза пак на "ринга" с още някое парче безумно усложнен код, който и двамата да не можете да разгадаете... и ще си помисля дали да обяснявам за какво служи или да ви оставя сами да се досетите... Щото и на вас трябва да ви е интересно все пак, нали?

 

:D :D :D

Link to comment
Share on other sites

perl -le 'for(<>){$s{$&}++if/[\w.-]+\@(?:[\w-]+\.)+\w+/}print for keys%s' failove-za-obrabotka

 

 

Това е. 62 - повече не можах да го сдъвча. Иначе идеята да се премахнат дублажите с един хеш вместо с два масива и един хеш наистина много по-добре стои - и за това най-безсрамно съм я изплагиатствал.

 

Пробвах да използвам -n от командния ред вместо for(<>){}, но не се получава нещо - принтира намереното след всеки подаден ред от входа вместо само накрая и става мазано.

 

След дълго умуване открих и какво ми бодеше очите в твоя код - undef$/... Четеш целия входен поток наведнъж, а това предполага евентуални проблеми с паметта при големи обеми данни... Освен това, не съм сигурен в момента, но дали така ще сработи ако му се подадат повече от един файл на входа примерно?! Трябва да се пробва...

Link to comment
Share on other sites

Прав си бе - просто се заяждам ;) :D ...

 

Регулярния израз не съм го съчинявал аз (и аз ползвам джокери :D ) - така е даден като пример за парсване на мейл адреси в някаква книга дето съм чел преди сто години.

 

Сега като ми каза за END{} много просто изглежда, ма от де толкова акъл...

Хайде пусни нещо от тебе или от него тука, да го поразгледаме - само аз ли ще се излагам?

Link to comment
Share on other sites

  • 3 months later...

Хихи, реших да посъживя тази хубава темичка. Идеята ми хрумна, ровейки се в скриптове с подобна функционалност, които ми се видяха доста "раздути" :D

 

На базата на предишното решение, може лесно да се състави "антиспам" скрипт, който да изважда IP адресите (на потенциалните спамъджии) от файла (обикновено мейлбокс), подаден на стандартния вход:

 

undef$/;@a{<>=~/(\d+\.\d+\.\d+\.\d+)/g}=1;print "$_\n"for keys%a

 

Така, в задачката се пита: как да се вмъкне възможно мининално количество код, който да отпечатва срещу всеки IP адрес броя на повторенията му във файла :)

 

Допълнителен бонус: Регулярния израз не е 100% коректен, т.е. пропуска стойности, които не са реални IP адрси. Могат да се предложат и идеи за неговото коригиране :)

Link to comment
Share on other sites

undef$/;$a{<>=~/(\d+\.\d+\.\d+\.\d+)/g}++;END{print "$_ $a{$_}\n"for keys%a}

 

undef$/;$a{/(\d+\.\d+\.\d+\.\d+)/g}++;END{print "$_ $a{$_}\n"for keys%a}

 

???

 

Не е пробвано и не е обмисляно... Просто така ми дойде от вътре. Дай ми някакъв малък файл с данни за тест, че не разполагам на тая машина с подобен... Regex-а май наистина може да се пипне още... но не в посока на "скъсяване". ;)

Link to comment
Share on other sites

има ли български форум по-подходящ за такива теми

Аз поне не знам... Има пощенски списък, но там нещо е умряла работата - никой не поства. Ако знаеш някой давай насам... Но няма да е лошо примерно тук, ако някой премести тая тема в Линукс да речем и я закарфичи отгоре, та да не се губи... Двете вървят заедно. Дали ще стане?

 

Ти няма ли да разбиеш задачката на Godfather?! Не се съмнявам, че пак ще излезете с най-подходящия код :D :D :D ...

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.


×
×
  • Create New...