Hledání a nahrazování pomocí JavaScriptu

Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #30 kdy: 11. 01. 2022, 19:04:30 »
Tak ako som to napisal ja, to nemusi byt nutne spolu, moze to byt v predkovi z inej kniznice.
Objektové programování je jeden ze způsobů, jak udržovat pohromadě kód, který k sobě patří (předci třídy).

Magicke funkcie ktore zahrnaju viacero funkcnosti v jednom, je skolsky priklad spagetaku.
Ano. Ale nebylo by nijak pracné váš kód zbavit špaget – což jste viděl sám a umístil jste komentáře tam, kde by mohla být funkce.

V tom ze sa automaticky spusti jit kompilator.
Mýlíte se. To, jestli se spustí či nespustí JIT kompilátor nedokáže autor JavaScriptového kódu přímočaře ovlivnit. Pokud nevíte, co znamená termín „předčasná optimalizace“ – znamená to, že autor kódu napíše kód jinak, než by ho psal normálně, v domnění, že takový kód bude efektivnější.

Ak by ste mal aspom tusenie ako funguje V8
Ja nepoucujem ale pisem svoj nazor, na zaklade svojich skusenosti. Ak nemate dispozicie viest dialog, ale vydupavat si to ze ako jediny mate pravdu, tak pravidelna navsteva diskuzneho fora musi byt pre vas velkym utrpenim. Sucitim s vami.
Aha, takže ta první citace není poučování.

Já normálně diskutuju, nevydupávám si, že jako jediný mám pravdu. Ale nevím, proč bych nemohl upozornit na to, když někdo napíše něco špatně. Pokud se vás takové upozornění dotýká, je to váš problém, ne můj.

Ak ja curam po vetre a vy proti vetru, tak to neznamena ze to robite lepsie nez ja. I ked ja curam, vy curate. K poznaniu ze curanie proti vetru nie je dobry napad, nemusim nutne skusit vas sposob.
Zkoušet to samozřejmě nemusíte. Problém je, když vítr fouká opačným směrem, než si myslíte.




Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #31 kdy: 11. 01. 2022, 19:26:10 »
Objektové programování je jeden ze způsobů, jak udržovat pohromadě kód, který k sobě patří (předci třídy).

Ale rozhodie nie tak ze to vsetko strcite do jednej funkcie/metody.

Ano. Ale nebylo by nijak pracné váš kód zbavit špaget – což jste viděl sám a umístil jste komentáře tam, kde by mohla být funkce.

Kometarmi zbavit kod spagiet... To by chcelo zapis na wikicitaty :D

Mýlíte se. To, jestli se spustí či nespustí JIT kompilátor nedokáže autor JavaScriptového kódu přímočaře ovlivnit. Pokud nevíte, co znamená termín „předčasná optimalizace“ – znamená to, že autor kódu napíše kód jinak, než by ho psal normálně, v domnění, že takový kód bude efektivnější.
Tak co myslite, co bude efektivnejsie. Funkcia F napisana v C(alebo v ruste v pripade spidermonkey) ktoru zavolam s predpipravenym parametrom, alebo kod ktory sa mozno interpretuje, mozno prelozi a potom zavola a napokon bude volat funkciu F? Fakt si to potrebujete zmerat?

Aha, takže ta první citace není poučování.

Já normálně diskutuju, nevydupávám si, že jako jediný mám pravdu. Ale nevím, proč bych nemohl upozornit na to, když někdo napíše něco špatně. Pokud se vás takové upozornění dotýká, je to váš problém, ne můj.

Je rozdiel medzi poucovanim, a domienkou. Preto som zacal s "ak". Naproti tomu vy ani nepoucujete, vy rovno kadrujete "Navíc jenom hádáte, jak by asi tak mohl interpret JavaScriptu fungovat."

Ad normalna diskusia: Nemam ten dojem ze by to tu bolo preplnene ludmi s ktorymi najdete spolocnu rec. Skor na opak. Ste si naozaj isty ze problem nie je vo vas ale v masach?

Zkoušet to samozřejmě nemusíte. Problém je, když vítr fouká opačným směrem, než si myslíte.
Uvazujte trochu. Ak curam po vetre, tak som v suchu. To ze som v suchu je dostatocne overenie, bez toho aby som musel skusat vas sposob.

Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #32 kdy: 11. 01. 2022, 19:44:45 »
Ale rozhodie nie tak ze to vsetko strcite do jednej funkcie/metody.
Někdo snad tvridl opak?

Kometarmi zbavit kod spagiet... To by chcelo zapis na wikicitaty :D
To jste ovšem teď napsal vy. Já jsem nic takového nenapsal.

Tak co myslite, co bude efektivnejsie. Funkcia F napisana v C(alebo v ruste v pripade spidermonkey) ktoru zavolam s predpipravenym parametrom, alebo kod ktory sa mozno interpretuje, mozno prelozi a potom zavola a napokon bude volat funkciu F? Fakt si to potrebujete zmerat?
Za prvé, prohlédněte si znovu a lépe kód, který jsem napsal. Porovnáváte volání funkce F s jendím parametrem s voláním funkce F s jiným parametrem.

Za druhé, nikde není řečeno, že interpretovaný kód musí volat funkci F. Výhoda JIT je, že optimalizuje kód na míru aktuálnímu běhu programu. Takže ten kód může být mnohem efektivnější, než obecná optimalizace vznikající v okamžiku jednorázového překladu aplikaci. Efektivnější může být například i tím, že nebude volat obecnou funkci F, ale zavolá mnohem rychlejší specializovanější funkci F'. Tohle byste ovšem měl vědět, když se tu prezentujete jako odborník na JIT kompilaci.

Je rozdiel medzi poucovanim, a domienkou. Preto som zacal s "ak". Naproti tomu vy ani nepoucujete, vy rovno kadrujete "Navíc jenom hádáte, jak by asi tak mohl interpret JavaScriptu fungovat."
Aha, no dobře, bude všechny své domněnky pro vás uvozovat „ak“.

Ad normalna diskusia: Nemam ten dojem ze by to tu bolo preplnene ludmi s ktorymi najdete spolocnu rec. Skor na opak. Ste si naozaj isty ze problem nie je vo vas ale v masach?
O věcech, o kterých si myslím, že masy vědí stejně nebo lépe než já, nepíšu. O takových věcech si čtu, případně se ptám. Ak vy píšete o věcech, o kterých toho masy vědí víc, než vy, leccos by to vysvětlovalo. Akorát bych řekl, že v takovém případě by bylo lepší, kdybyste nic nepsal.

To ze som v suchu
No jo, jenže vy nejste v suchu. Vy jenom tvrdíte, že se rozhodně nebudete dívat na své kalhoty, protože fouká severní vítr.

Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #33 kdy: 11. 01. 2022, 21:11:38 »
Někdo snad tvridl opak?

Myslim ze kazdy si dokaze dohladat co ste tvrdil.

To jste ovšem teď napsal vy. Já jsem nic takového nenapsal.

Aj to si kazdy vie dohladat.

Za prvé, prohlédněte si znovu a lépe kód, který jsem napsal. Porovnáváte volání funkce F s jendím parametrem s voláním funkce F s jiným parametrem.

Za druhé, nikde není řečeno, že interpretovaný kód musí volat funkci F. Výhoda JIT je, že optimalizuje kód na míru aktuálnímu běhu programu. Takže ten kód může být mnohem efektivnější, než obecná optimalizace vznikající v okamžiku jednorázového překladu aplikaci. Efektivnější může být například i tím, že nebude volat obecnou funkci F, ale zavolá mnohem rychlejší specializovanější funkci F'. Tohle byste ovšem měl vědět, když se tu prezentujete jako odborník na JIT kompilaci.

Njn, vy tam tu funkciu F volate opakovane. Naviac ju mate v podmienke ktora na vysledku tej funkcie zavisi. Takze vam ju ziadny optimalizator nevyhodi. Mal by ste si niekedy skusit pracu architekta. Naucil by ste sa zhodnotit narocnost algoritmu este pred tym nez by ho niekto implementoval...

Aha, no dobře, bude všechny své domněnky pro vás uvozovat „ak“.

Staci ak to budete formulovat ako domienku.

O věcech, o kterých si myslím, že masy vědí stejně nebo lépe než já, nepíšu. O takových věcech si čtu, případně se ptám. Ak vy píšete o věcech, o kterých toho masy vědí víc, než vy, leccos by to vysvětlovalo. Akorát bych řekl, že v takovém případě by bylo lepší, kdybyste nic nepsal.

No a ze toho denne minimalne na roote popisete akurat dost a z toho ste spravidla vecsinu s niekym v konflikte. Mat tolko casu ako vy (nemam, praca, rodina a konicky) tak tie mudra masam predlozim v clankoch na damu temu. Bolo by to efektivnejsie ako niekomu musiet neustale dookola dokazovat ze mate vacsieho...

No jo, jenže vy nejste v suchu. Vy jenom tvrdíte, že se rozhodně nebudete dívat na své kalhoty, protože fouká severní vítr.
Na to ze mam suche nohavice, zistim pomocou receptorov v pokozke noh, nepotrebujem zatazovat zrakovy nerv. K tomu ma nedonuti ani trolenie, ktore moze fungovat iba tak na masy na ksichtoknihe...

Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #34 kdy: 11. 01. 2022, 22:39:40 »
Myslim ze kazdy si dokaze dohladat co ste tvrdil.
Aj to si kazdy vie dohladat.
Ano, k vaší smůle.

Njn, vy tam tu funkciu F volate opakovane.
Ak jste zapomněl, co je ta vaše funkce F, připomenu vám to – je to vyhledávání regulárního výrazu v řetězci. Což volám dvakrát, jednou pro každý druh tokenu. Stejně jako vy.

z toho ste spravidla vecsinu s niekym v konflikte
Zatímco vy v diskusích jenom přitákáváte, že. Protože to je smysl diskuse – někdo něco napíše, a a na dalších pěti stránkách všichni přitakávají, že s tím souhlasí.


Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #35 kdy: 11. 01. 2022, 22:55:51 »
Tak jsem napsal primitivní test porovnávající mou funkci (funcA), vaši funkci (funcB) a ještě upravenou mou funkci s tím, že se místo hledání v neseřazeném poli používá hashovací tabulka (funcC). Testoval jsem to v deno, ale pak jsem výsledek uložil jako Codepen, abyste si to mohl spustit i v prohlížeči. Výsledky z prohlížeče i deno jsou plus mínus autobus stejné, ale přesnější výsledky nejsou myslím potřeba. Výsledná čísla tu snad raději ani zveřejňovat nebudu, abyste to nebral jako urážku.

https://codepen.io/filipjirsak/pen/RwLqNJg

Prosím vás, na ty vaše kalhoty se přeci jen podívejte. Podívejte se na ně i zezadu. Nebude to hezký pohled.

S dovolením jsem vynechal stranu 2 a stranu 3, takže jsem přišel o baladu o kalhotech a větrech ze severu. (Možná si to přečtu až budu potřebovat upustit páru)
Ale tohle má být nějaká vysokoškolská úloha, kdy máš vymyslet algoritmus, nebo jen potřebuješ poradit existující funkci z knihovny? (Klíčem implementace je nezamotat se  v opakujících subvýrazech, jak  v vyhledávacím kroku, tak v nahrazovacím kroku-v případě že by se nahrazovalo imperativně v cyklu. Radši bych slovo krok uplně vynechal)

MŮJ ROZBOR

Já bych přispěl druhým možným algoritmem - v první fázi provedu jen vyhledání. Vzniká problém, že může vzniknout víc  řešení vyhledání výrazů. Nabízí se hledání podle nejdelšího, ale pak stále tu zůstane problém, co třeba s patterny "bene" a "nebe" pro slovo "benebe, be". Tohle  pořadí musí si určit programátor sám. Jako bonus tam můžeme přihodit pattern "be"

Fáze nahrazovací musí proběhnout "transakčně". Třeba nejdřív určením ochranného znaku třeba #, potom nahrazením #  třeba za #0. Pak nahrazením patternů za #1, #2.... (#N - N=přirozená čísla=bez nuly) Pak nahrazením #N za nahrazené varianty a nakonec vrácením #0 za #...

Ale třeba zadání může být i takové, aby se nahrazovalo donekonečna... V tom případě právě transakčnost je nežádoucí a může z toho vzniknout turingův stroj, pokud se nepletu. Radši to típnu



A jinak bych poradil funkci preg_replace_callback a její ekvivalenty. Možná by ani nebyla potřeba nahrazovací část řešena být callbackově.

Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #37 kdy: 11. 01. 2022, 23:49:48 »
SO odpoved ak by niekto potreboval do buducna:
Než jsem vám stihl odpovědět, že máte neúplné zadání, tak jste si našel odpověď. Zrada, proč vaše zadání nebude fungovat je nejasná definice chování replace
Máš a nemáš pravdu. Pravděpodobně mu vznikne jiný než zamýšlený výsledek (smutně mu tam bude koukat "town"). A zároveň se to zacyklí. (ale to spolu nesouvisí, řekl bych že zjednodušeně zacyklení závisí na vztahu  náhrada-pattern a neočekávané nahrazování  shodou substringů patternů)


A především (možná v rámci zjednodušení a pochopení) by bylo vhodné normalizovat  hledané výrazy...

To znamená místo oddělených proměnných handles  a topics mít
jedno pole [ *handles , *topics] neboli [john,johnathan, town, hometown] a k nim příslušně pole náhrad [href-h-john, href-h-jonathan, href-t-town, href-t-hometown]

Až pochopí tazatel, kde je problém, může pokračovat dál a pustit se do složitějších věcí, jako callbackové nahrazování


Mimochodem: není náhodou správně Jonathan (ostatně třeba i správně je errorneous). Tady je to snad jen pro příklad.

Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #39 kdy: 12. 01. 2022, 00:57:18 »
Tak jsem napsal primitivní test porovnávající mou funkci (funcA), vaši funkci (funcB) a ještě upravenou mou funkci s tím, že se místo hledání v neseřazeném poli používá hashovací tabulka (funcC). Testoval jsem to v deno, ale pak jsem výsledek uložil jako Codepen, abyste si to mohl spustit i v prohlížeči. Výsledky z prohlížeče i deno jsou plus mínus autobus stejné, ale přesnější výsledky nejsou myslím potřeba. Výsledná čísla tu snad raději ani zveřejňovat nebudu, abyste to nebral jako urážku.

https://codepen.io/filipjirsak/pen/RwLqNJg

Prosím vás, na ty vaše kalhoty se přeci jen podívejte. Podívejte se na ně i zezadu. Nebude to hezký pohled.

No neke, tak si to skuste opravit funcA a funcC aby ich vystup nevratil to iste ako je input. FuncB nieco skutocne nahradzuje a je daleko pomalsia koli tomu ze robi to co sa pozadovalo - nahradzuje najdene retazce. Mozno to na 2 pokus date ;)

Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #40 kdy: 12. 01. 2022, 01:13:56 »
Tak jsem napsal primitivní test porovnávající mou funkci (funcA), vaši funkci (funcB) a ještě upravenou mou funkci s tím, že se místo hledání v neseřazeném poli používá hashovací tabulka (funcC). Testoval jsem to v deno, ale pak jsem výsledek uložil jako Codepen, abyste si to mohl spustit i v prohlížeči. Výsledky z prohlížeče i deno jsou plus mínus autobus stejné, ale přesnější výsledky nejsou myslím potřeba. Výsledná čísla tu snad raději ani zveřejňovat nebudu, abyste to nebral jako urážku.

https://codepen.io/filipjirsak/pen/RwLqNJg

Prosím vás, na ty vaše kalhoty se přeci jen podívejte. Podívejte se na ně i zezadu. Nebude to hezký pohled.

Ked tak https://jsfiddle.net/DeathWalker/ps5my816/

A jinak bych poradil funkci preg_replace_callback a její ekvivalenty. Možná by ani nebyla potřeba nahrazovací část řešena být callbackově.

On to chce v javascripte, nie v php.

V php je to este jednoduchsie (predpoklada sa validne pole $tokens):
Kód: [Vybrat]
<?php

$input 
'@john and @johnathan went to see @sarah in their #hometown to look at her new #home.';

$tokens =[
  [ 
'selector' => '@',
    
'hrefPrefix' => '/user',
    
'items' => [
      
'john',
      
'johnathan',
      
'sarah'
    
],
  ],
  [ 
'selector' => '#',
    
'hrefPrefix' => '/topics',
    
'items' => [
      
'home',
      
'hometown',
    ],
  ],
];

$patterns $tokens;
$replacements = [];

array_walk($patterns, function(&$item,$key) use (&$replacements){
    
$replacements[$key] = "<a href=\"{$item['hrefPrefix']}/$2\">$1</a>";
    
$temp array_map(function($item){
        return 
preg_quote($item);
    },
$item['items']);
    
$temp join('|',$temp);
    
$item "~({$item['selector']}({$temp}))\\b~mi";
});

$output preg_replace($patterns,$replacements,$input);

echo 
"$output\n"

Z toho dostaneme:
Kód: [Vybrat]
<a href="/user/john">@john</a> and <a href="/user/johnathan">@johnathan</a> went to see <a href="/user/sarah">@sarah</a> in their <a href="/topics/hometown">#hometown</a> to look at her new <a href="/topics/home">#home</a>.

Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #42 kdy: 12. 01. 2022, 08:47:48 »
https://codepen.io/filipjirsak/pen/RwLqNJg

No neke, tak si to skuste opravit funcA a funcC aby ich vystup nevratil to iste ako je input. FuncB nieco skutocne nahradzuje a je daleko pomalsia koli tomu ze robi to co sa pozadovalo - nahradzuje najdene retazce. Mozno to na 2 pokus date ;)
Dobře, speciálně pro vás jsem na konec přidal ještě porovnání výstupů. Ak byste tomu kódu nerozuměl, tak jsem tam přidal i výpis vstupu a výstupu, můžete si to porovnat očima.

Tak co, už můžeme zveřejnit výsledky, že ten váš kód je cca 3× pomalejší?

Každopádně vám děkuji za názorný příklad toho, proč je předčasná optimalizace špatně. Pustil jste se do optimalizace něčeho, o čem jste vůbec nevěděl, zda je to pomalé. A při optimalizaci jste ve skutečnosti vyrobil třikrát pomalejší kód. Asi jste se (mylně) domníval, že regulární výrazy jsou jakási magie, jejíž složitost můžete zanedbat. Ak byste tušil, jak regulární výrazy fungují, napadlo by vás, že jste tím vaším kódem pravděpodobně vyrobil tu vnitřní smyčku, kterou jste vytýkal mému kódu (a která v mém kódu není).

Zkuste si z toho zapamatovat alespoň to, že svislítko | v regulárních výrazech je vždy nebezpečné, pokud vám jde o výkon. A na vašem místě bych také přehodnotil přístup, že nemusíte měřit rychlost kódu, protože máte představu, co je asi jak rychlé. Evidentně jsou vaši představy o fungování kódu mylné.

Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #43 kdy: 12. 01. 2022, 13:55:49 »
https://codepen.io/filipjirsak/pen/RwLqNJg

No neke, tak si to skuste opravit funcA a funcC aby ich vystup nevratil to iste ako je input. FuncB nieco skutocne nahradzuje a je daleko pomalsia koli tomu ze robi to co sa pozadovalo - nahradzuje najdene retazce. Mozno to na 2 pokus date ;)
Dobře, speciálně pro vás jsem na konec přidal ještě porovnání výstupů. Ak byste tomu kódu nerozuměl, tak jsem tam přidal i výpis vstupu a výstupu, můžete si to porovnat očima.

Tak co, už můžeme zveřejnit výsledky, že ten váš kód je cca 3× pomalejší?

Každopádně vám děkuji za názorný příklad toho, proč je předčasná optimalizace špatně. Pustil jste se do optimalizace něčeho, o čem jste vůbec nevěděl, zda je to pomalé. A při optimalizaci jste ve skutečnosti vyrobil třikrát pomalejší kód. Asi jste se (mylně) domníval, že regulární výrazy jsou jakási magie, jejíž složitost můžete zanedbat. Ak byste tušil, jak regulární výrazy fungují, napadlo by vás, že jste tím vaším kódem pravděpodobně vyrobil tu vnitřní smyčku, kterou jste vytýkal mému kódu (a která v mém kódu není).

Zkuste si z toho zapamatovat alespoň to, že svislítko | v regulárních výrazech je vždy nebezpečné, pokud vám jde o výkon. A na vašem místě bych také přehodnotil přístup, že nemusíte měřit rychlost kódu, protože máte představu, co je asi jak rychlé. Evidentně jsou vaši představy o fungování kódu mylné.

A teraz by to chcelo zrovnat branky, bud by ste mal pouzit kod ktory ste sem postoval, alebo ja ten svoj optimalizujem. 3x pomalsie je to koli tomu joinu, ktory si logicky musi alokovat pamat. Naviac ked ten kod prebehne 1000000 krat tak jit s optimalizatorom bezpecne zafunguje. Preco by ale niekto ten isty text nahradzoval 1000000x dookola?

Re:Hledání a nahrazování pomocí JavaScriptu
« Odpověď #44 kdy: 12. 01. 2022, 14:34:52 »
https://codepen.io/filipjirsak/pen/RwLqNJg

No neke, tak si to skuste opravit funcA a funcC aby ich vystup nevratil to iste ako je input. FuncB nieco skutocne nahradzuje a je daleko pomalsia koli tomu ze robi to co sa pozadovalo - nahradzuje najdene retazce. Mozno to na 2 pokus date ;)
Dobře, speciálně pro vás jsem na konec přidal ještě porovnání výstupů. Ak byste tomu kódu nerozuměl, tak jsem tam přidal i výpis vstupu a výstupu, můžete si to porovnat očima.

Tak co, už můžeme zveřejnit výsledky, že ten váš kód je cca 3× pomalejší?

Každopádně vám děkuji za názorný příklad toho, proč je předčasná optimalizace špatně. Pustil jste se do optimalizace něčeho, o čem jste vůbec nevěděl, zda je to pomalé. A při optimalizaci jste ve skutečnosti vyrobil třikrát pomalejší kód. Asi jste se (mylně) domníval, že regulární výrazy jsou jakási magie, jejíž složitost můžete zanedbat. Ak byste tušil, jak regulární výrazy fungují, napadlo by vás, že jste tím vaším kódem pravděpodobně vyrobil tu vnitřní smyčku, kterou jste vytýkal mému kódu (a která v mém kódu není).

Zkuste si z toho zapamatovat alespoň to, že svislítko | v regulárních výrazech je vždy nebezpečné, pokud vám jde o výkon. A na vašem místě bych také přehodnotil přístup, že nemusíte měřit rychlost kódu, protože máte představu, co je asi jak rychlé. Evidentně jsou vaši představy o fungování kódu mylné.

Njn, ako som si myslel.
Pre:
Kód: [Vybrat]
const reHandles = new RegExp('@(' + handles.join('|') + ')\\b', 'gmi');
const reTopics = new RegExp('#(' + topics.join('|') + ')\\b', 'gmi');
.
.
.
.
const funcB = (input, handles, topics) => {
  return input.replace(reHandles, `<a href="/user/$1">@$1</a>`)
    .replace(reTopics, `<a href="/topic/$1">#$1</a>`);
}

Je funcA vyrazne pomalsia. A funcB a funcC su porovnatelne. Ale to je len tym ze sa ten kod zopakuje milion krat a tym ste si zarucil ze sa to zkompiluje.