Design (GitHub) je 2D CAD pro GNOME. Instalovat lze i z Flathubu. Běží také ve webovém prohlížeči.
Příspěvek na blogu herního enginu Godot představuje aplikaci Xogot přinášející Godot na iPad a iPhone. Instalovat lze z App Storu. Za Xogotem stojí Miguel de Icaza (GitHub) a společnost Xibbon.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za březen (YouTube).
ESP-IDF (Espressif IoT Development Framework), tj. oficiální vývojový framework pro vývoj aplikací na mikrokontrolérech řady ESP32, byl vydán v nové verzi 6.0. Detaily na portálu pro vývojáře.
DeepMind (Alphabet) představila novou verzi svého multimodálního modelu, Gemma 4. Modely jsou volně k dispozici (Ollama, Hugging Face a další) ve velikostech 5-31 miliard parametrů, s kontextovým oknem 128k až 256k a v dense i MoE variantách. Modely zvládají text, obrázky a u menších verzí i audio. Modely jsou optimalizované pro běh na desktopových GPU i mobilních zařízeních, váhy všech těchto modelů jsou uvolněny pod licencí Apache 2.0. Návod na spuštění je už i na Unsloth.
Cursor (Wikipedie) od společnosti Anysphere byl vydán ve verzi 3. Jedná se o multiplatformní proprietární editor kódů s podporou AI (vibe coding).
Průkopnická firma FingerWorks kolem roku 2000 vyvinula vícedotykové trackpady s gesty a klávesnice jako TouchStream LP. V roce 2005 ji koupil Apple, výrobu těchto produktů ukončil a dotykové technologie využil při vývoji iPhone. Multiplatformní projekt Apple Magic TouchstreamLP nyní implementuje funkcionalitu TouchStream LP na současném Apple Magic Trackpad, resp. jejich dvojici. Diskuze k vydání probíhá na Redditu.
Byla vydána nová verze 10.3 sady aplikací pro SSH komunikaci OpenSSH. Přináší řadu bezpečnostních oprav, vylepšení funkcí a oprav chyb.
Cloudflare představil open source redakční systém EmDash. Jedná se o moderní náhradu WordPressu, která řeší bezpečnost pluginů. Administrátorské rozhraní lze vyzkoušet na EmDash Playground.
Bratislava OpenCamp 2026 zverejnil program a spustil registráciu. Štvrtý ročník komunitnej konferencie o otvorených technológiách prinesie 19 prednášok na rôzne technologické témy. Konferencia sa uskutoční v sobotu 25. apríla 2026 v priestoroch FIIT STU v Bratislave.
Kevin je právě na horách a lyžuje. Stojí na vrcholu sjezdovky před svou poslední jízdou, za chvíli půjde na chatu opékat párky. Sjezdovku už dobře zná, každé místo projel snad stokrát a pamatuje si, jak se mu které líbí. Všechna jsou podle toho ohodnocená celými čísly.
1
2 3
4 1 1
2 5 0 2
Kevin by tedy chtěl, aby součet ohodnocení míst, přes která při poslední jízdě projede, byl co největší.
Na travních lyžích se dá jezdit z kopce a přitom zatáčet doleva nebo doprava. Z každé pozice na svahu se tak dá dostat na nejvýše dvě další pozice ležící pod ní.
Tvar vstupu: Pro jednoduchost bude kopec zadán po řádcích. Na prvním řádku bude číslo N udávající výšku kopce. Na dalších N řádcích bude vždy na i-tém řádku i celých čísel udávajících ohodnocení míst na kopci na i-té hladině od vrcholu, čísla budou oddělena mezerami.
Jízda doleva je v našem zápisu svahu ekvivalentní sestupu na další řádek a jízda doprava sestupu na další řádek a posunutí o pozici doprava.
Tvar výstupu: Na výstup vypište jedno celé číslo udávající maximální součet ohodnocení poslední Kevinovy jízdy z prvního řádku na libovolné místo na spodním řádku.
Program posílám v příloze. Problém je, že si poradí s kopcem vysokým 10 řádků, ale s kopcem vysokým 40 řádků už ne. A to by měl zvládnout i vstup 1000 řádků. Vstupy zapíše do pole správně, ale vrátí výsledek 0. Chyba tak musí být v rekurzivní funkci
Všem předem děkuji za tipy.
Řešení dotazu:
Mam pocit ze i bez kouknuti na program si dovolim tvrdit ze sis sam odpovedels v posledni, teda vlastne predposledni vete.
Tim samozrejme myslim tu rekurzi. Pokud chces aby to zvladalo vetsi vstupy tak urcite nepouzivej rekurzi.
JJ to je mozne, jak jsem psal kod jsem nestudoval, ale jen jsme vychazel s predpokladu ze rekurze je sice velmi dobre citelna, ale casto to neni idealni reseni.
Tak on je problem ze rekurze se i hure optimalizuje s pohledu kompilatoru(optimalizatoru), dalsi problem s rekurzi je ze vyuziva zasobnik, ktery ma vetsinou nejak omezenou velikost. Samozrejme citelnost je velmi dulezita, takze pokud rekurze dostacuje tak bych ji zvolil taky. Bohuzel si nevzpominam na moc pripadu, kde bych rekurzi vyuzil, teda krom pripadu, kde jsme potreboval nazorne ukazat nejakej algoritmus.
Moc jsem ten program nezkoumal, ale při výšce kopce > 31 ti přeteče ten výpočt mocniny, takže bych to tipoval na problém tady. K tomu 2 poznámky - počítat mocninu dvou násobenim je šílenost, podívej se na bitové posuvy.
A za druhé - i kdyby si měl tu proměnnou 64bit a mohl alokovat tolik paměti pro to pole (což je samozřejmě nesmysl), tak stejně končíš u výšky 64... Tzn takto to opravdu řešit principielně nelze.
počítat mocninu dvou násobenim je šílenost, podívej se na bitové posuvy.Slušný optimalizátor v překladači z násobení dvěma udělá bitový posun tak jak tak. Násobení dvěma je čitelnější pro programátora.
for(int i = 0; i < exponent; i++)
{
vysledek *= 2;
}
Lze napsat jen toto:
vysledek <<= exponent;
Coz moderni optimalizator dokaze taky :), ale kazdopadne tady uz bych nemluvil o tom ze to je citelnejsi a nebo ze se na to da zcela spolehnout.
Pokud muzu neco doporucit, tak asi toto: cti to radek po radku, hodnotu po hodnote. Vzdy si pamatuj predchozi radek a ten pricitej k tomu dalsimu co ctes tak jak je treba dle zadani a u posledniho radku vyber maximum.
dnes jsem unavenej zitra poslu pseudo kod
Tak nakonec misto pseudo jsem to napsal v jazyku D. Jsem uz unaveny takze nerucim zcela za spravnost:
import std.stdio;
import std.algorithm;
import std.conv;
enum MAX_ROW_COUNT = 1000;
enum BUF_SIZE = 65535;
void main(string[] args)
{
int[MAX_ROW_COUNT] row;
char[] buf = new char[BUF_SIZE];
auto f = File("test.txt");
size_t len, rowCount;
while((len = f.readln(buf)) != 0) {
int lastVal = row[0];
char[] rowData = buf[0 .. len];
size_t index = 0;
foreach (val; rowData.splitter(' ').map!(a=>parse!int(a))) {
int tmp = row[index];
row[index] = lastVal + val;
lastVal = tmp;
++index;
}
++rowCount;
}
writeln(minCount!("a > b")(row[0 .. rowCount])[0]); // seems wierd but minCount return maximum :)
}
import std.stdio;
import std.algorithm;
import std.conv;
enum MAX_ROW_COUNT = 1000;
enum BUF_SIZE = 65535;
void main(string[] args)
{
int[MAX_ROW_COUNT] row;
char[] buf = new char[BUF_SIZE];
auto f = File("test.txt");
size_t len, rowCount;
int[2] lastVal;
while((len = f.readln(buf)) != 0) {
char[] rowData = buf[0 .. len];
size_t index = 0;
foreach (val; rowData.splitter(' ').map!(a=>parse!int(a))) {
lastVal[index%2] = row[index];
row[index] = max(lastVal[0] + val, lastVal[1] + val);
++index;
}
++rowCount;
}
writeln(reduce!("max(a,b)")(row[0 .. rowCount]));
}
Děkuji všem za rady. Jsem ještě začátečník, a abych pravdu řekl, tak jsem z Vašich odpovědí pořád nepochopil, proč mi program nefunguje :) Kód, který napsal Kozzi nemůžu použít, protože pracuji v c++ a ani mu pořádně nerozumím, abych ho přepsal.
brát vždy maximum z dvou možných hodnot na předchozím řádkuToto nechápu. Vždyť na posledním řádku můžu dostat hodnotu, která bude větší, než všechny ostatní součty, tzn. že bude největší právě tato cesta. Těmto algoritmům nerozumím, ale ten svůj jsem přepracoval, takže hodnoty neukládá do pole. Nyní dělá toto: Prochází cesty úplně vlevo a sčítá. Až dojde na konec rozhodne, zda je součet větší, než zatím největší nalezení, případně ho zapíše. Následně se vrátí o vrstvu výš a vezme cestu vpravo, atd. atd. Pokud můžu mít dotaz, tak pořád nemůžu pochopit, proč mám číst vstup po řádcích. Původně jsem takový systém měl. Přečetl řádek, sečetl všechny kombinace, a ty zapsal do pole. Nakonec našel v poli největší hodnotu. Ten jsem ale přepracoval, protože se mi zdál zbytečně složitý. Díky za trpělivost a případné odpovědi :) V příloze posílám zdrojový kód.
1
2 3
4 1 1
2 5 0 2
Po zpracovani 1. radku [1]JJ presne, to je vice mene to co dela muj kod, teda on alokuje zbytecne protoze nevyuiva informace o tom kolik realne radku tam bude.
Mocnina dvojky je mocná
2^40 = 1 099 511 627 776 * sizeof(int) = 4TiB RAM pro druhé pole
maximum int = 2^31 -1 = 2 147 483 647 * sizeof(int) = 8GiB RAM pro druhé pole
ALE narveš tam jen třicetjedničku (to je daň za nulu
):
1 073 741 824 * sizeof(int) = 4GiB RAM pro druhé pole
¡31 je max! - na 64bit systému (omezení int) na 32 bit s PAE je to 29 bez PAE 29 nebo 28 (omezení systému) - zjednodušeněZadej si 32 je docela pravděpodobné, že ti to vyhodí std::bad_alloc, bo fce mocninaDvojky() vrátí -2147483648 a to jaksi alokovat nelze.
Tiskni
Sdílej: