Počítačová hra Factorio (Wikipedie) nově běží nativně na ARM64 Linuxu a headsetu Steam Frame.
Fugleramme, v překladu 'ptačí rámeček', je open-source projekt postavený na Raspberry Pi, který pomocí lokální umělé inteligence BirdNET-Go rozpoznává ptačí druhy podle jejich zpěvu a na displeji následně zobrazuje koláž tvořenou odpovídajícími ilustracemi. Databáze obsahuje přes 800 ručně vybraných historických přírodovědných ilustrací více než 400 druhů ptáků.
… více »Unicode Consortium, nezisková organizace koordinující rozvoj standardu Unicode, oznámila vydání Unicode 18.0. Přidáno bylo 13 007 nových znaků. Celkově jich je 172 808. Přibylo 9 nových Emoji.
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 169 (pdf).
Byla vydána nová verze 6.4 programovacího jazyka Swift (Wikipedie). Zdrojové kódy jsou k dispozici na GitHubu.
Německý kancléř Friedrich Merz (CDU) se během debaty s finalisty studentské vědecké soutěže Jugend forscht vyjádřil pro konec anonymity na internetu a vyslovil názor, že pro uživatele Internetu by měla platit podobná právní odpovědnost jako pro novináře tradičních médií. Na dotaz studenta, jak by se tedy povinnost uvádět pravé jméno slučovala s prací investigativních novinářů nebo ochranou jejich zdrojů, Merz neodpověděl, ve své
… více »Společnost Fujitsu představila FUJITSU-MONAKA CPU a Fujitsu MONAKA Server. Navrženo, vyvinuto a vyrobeno v Japonsku. Pro suverénní AI infrastrukturu.
Předprodej v květnu představených notebooků Googlebook, nástupců notebooků Chromebook, bude spuštěn v pondělí 21. září.
Byla vydána betaverze Fedora Linuxu 45 (ChangeSet), tj. poslední zastávka před vydáním finální verze, která je naplánována na úterý 20. října. S konzolí kmscon místo fbcon. Současně byla vydána betaverze Fedora Linux Asahi Remixu 45. S podporou čipů M3.
Po půl roce vývoje od vydání verze 50 bylo vydáno GNOME 51 s kódovým názvem "A Coruña" (Mastodon). Podrobný přehled novinek i s náhledy v poznámkách k vydání a v novinkách pro vývojáře. Videopředstavení na PeerTube a YouTube.
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: