A legelso feladat a kovetkezo: adjuk ossze azokat szamokat 0 es 999 kozott, melyek oszthatok 3al vagy 5el.
Haskellben rem elegans a megoldas:
sum [x | x <- [0..999], x `mod` 3 == 0 || x `mod` 5 == 0 ]
- pgee blogja
- A hozzászóláshoz be kell jelentkezni
- 2227 megtekintés
Hozzászólások
A Mandelbrot-halmaz számítás/rajzolás is szép kódot eredményez.
Haskellesek szokták mondani - persze elfogultan -, hogy a helyes kód általában szép is.
- A hozzászóláshoz be kell jelentkezni
A helyes kod a legtobb nyelven szepen nez ki :)
(Persze a szepseg definicioja erosen kulonbozhet nyelvek rajongoi kozott.)
--
|8]
- A hozzászóláshoz be kell jelentkezni
Így van. Lásd ioccc :)
_____________________________
Powered by 1,3,7-trimetilxantin
- A hozzászóláshoz be kell jelentkezni
Az C, ez Haskell :-)
- A hozzászóláshoz be kell jelentkezni
http://scrollingtext.org/project-euler-problem-1
perl -E 'for (1..9) { $s += $_ unless $_ % 5 && $_ % 3 }; say $s'
- A hozzászóláshoz be kell jelentkezni
Felre ertes ne essek, nagyon szeretem a perl-t, de a haskell-es megoldas -mar maga list comprehension, mint koncepcio miatt- elegansabbnak tunik.
- A hozzászóláshoz be kell jelentkezni
Szerintem is, az olvashatóságra akartam reflektálni :)
- A hozzászóláshoz be kell jelentkezni
És Ruby? :)
(0..999).select{|x| x % 3 == 0 or x % 5 == 0}.inject(:+)
- A hozzászóláshoz be kell jelentkezni
Sajnos a Ruby-t nem ismerem ennyire... na jo, alig. :)
- A hozzászóláshoz be kell jelentkezni
Ismerve az előzményeket, nem bírom ki, hogy ne trollkodjam ide PHP-ben:
echo array_sum(array_filter(range(1,999), function($x) { return $x % 3 == 0 || $x % 5 == 0; } ));
:D
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
:-D
--
blogom
- A hozzászóláshoz be kell jelentkezni
Igen, a gond csak az, hogy nagysagrendekkel lassabb mint for ciklussal. Az array_(map|filter) es tarsai nem a gyarsasagrol hiresek, bar 5.3.x-es php-val mertem utoljara.
- A hozzászóláshoz be kell jelentkezni
Persze, nem is komolyan gondoltam.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Es a szomoru, hogy igazabol ez a legolvashatobb az itt listazott kodok kozul.
De amiket folotted csinaltak az nekem mar gazdasagi szemszogbol nezve write-only kodolas.
- A hozzászóláshoz be kell jelentkezni
A Haskell kód gyönyörűen tükrözi a matematikai leírást, IMHO.
- A hozzászóláshoz be kell jelentkezni
+1
A Haskell szebb
--
blogom
- A hozzászóláshoz be kell jelentkezni
Szerintem a Haskelles kóddal semmi baj nincs, teljesen érthető. Egyedul a 'mod' jelölése szokatlan. Amugy ha mar olvashatosag, akkor:
var x = Enumeration.Range(1, 999).Where(x => x % 3 == 0 || x % 5 == 0).Sum();
var y = (from x in Enjmeration.Range(1, 999) where x % e == 0 || x % 5 == 0 select x).Sum();
Vagy
[code]select sum(x)
from generate_series(1, 999) as x
where x % 3 = 0 or x % 5 = 0
De ez mind ugyanezt jelenti C#-ban (Postgre)SQL-ben vagy akar fenn PHP-ben, csak mas syntaxszal, mint a fenti Haskelles kod.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Csak a rend kedvéért:
TypeScript:
Enumerable.range(1, 999).where(x => x % 3 == 0 || x % 5 == 0).sum()
Fuszenecker Róbert
- A hozzászóláshoz be kell jelentkezni
Figyeled! LAMBDA! Naugyehogyfunkcionalis!!!!11!!!!1!
( :) )
- A hozzászóláshoz be kell jelentkezni
Benevezek én is a C++-szal :-) :
#include <iostream>
template <int N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
template <> struct Sum<0> { enum { value = 0 };};
int main(){int x = Sum<999>::value;std::cout<<x<<"\n"; return 0;}
Elismerem, az utolsó sor már nem tisztán funkcionális. Mea culpa.
- A hozzászóláshoz be kell jelentkezni
Szeretem a C++-t, de ezt fajt olvasni :(
- A hozzászóláshoz be kell jelentkezni
Még szép. Nekem is, imperatívan nem így csinálnám. Nyilván nem ilyenre találták ki a nyelvet. De meg lehet tenni. :-).
Egy tipikus példa a pattern matching-re, ami egy eszköze a funkcionális nyelveknek.
- A hozzászóláshoz be kell jelentkezni
+1;
int sum=0;for(int i=0;i<1000;i++)if((i%3==0)||(i%5==0))sum+=i;
- A hozzászóláshoz be kell jelentkezni
Ez funkcionális?
--
blogom
- A hozzászóláshoz be kell jelentkezni
Mivel C++ és tudom olvasni így biztosan nem az. :)
- A hozzászóláshoz be kell jelentkezni
Jó, de ezt mindenki meg tudja írni ;-)
- A hozzászóláshoz be kell jelentkezni
A tarsadalom 99.5%-a nem tudja igy megirni. Ellenben a tarsadalom 0.4%-a karban tudja tartani, ami sokszazszorosa a funkcionalis es egyeb write-only (pl perl) programokat karbantartani kepes emberek szamanak ;)
- A hozzászóláshoz be kell jelentkezni
Nem tudom, nekem egyre szimpatikusabb a FP. Matematikai problémákra gyönyörű megoldásokat adnak (l. a blogbejegyzést). Csak nem kell elszállni. Az imperatív részt imperatív nyelven, a funkcionálist funkcionális nyelven írjuk.
- A hozzászóláshoz be kell jelentkezni
Igen, ahogy egyre jobban asom bele magam, ugy jovok ra, hogy vannak dolgok, amiket egyszeruen gyorsabban, szebben lehet funkcionalis eszkozokkel implementalni. Az azonban egyaltalan nem vilagos, hogy pl konkretan a Haskell-t hogyan tudnam hasznositani, mint webfejleszto.
- A hozzászóláshoz be kell jelentkezni
Dolgozol listákon, gyujtemenyeken, hashmapeken, stb.?
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Igen, jelenleg azonban legtobbszor http response lesz belole... most, hogy igy mondod, background job-okhoz valoban lehetne hasznalni.
- A hozzászóláshoz be kell jelentkezni
yesod framework, snap framework jut eszembe. Yesoddal konnyebb elindulni, snappel tisztabb erzese van az embernek. A web fejlesztes is rengeteget tud profitalni haskellbol. Pl type safe routes: /user/edit/{UserId} ahol ha nem UserId tipust adsz at forditasi hiba.. De az "applicative forms" otlet is marha elegans.
- A hozzászóláshoz be kell jelentkezni
Koszi a peldakat, utananezek ezeknek is... en eddig a Happstack-et es a Scotty-t talaltam, ezekkel nincs veletlenul tapasztalatod?
- A hozzászóláshoz be kell jelentkezni
happstacket neztem regebben, de nem jutottam vele messzire. Ez a legregebbi, a yesod/snap utana jottek ha jol tudom, a scotty-t nem ismerem.
- A hozzászóláshoz be kell jelentkezni
Akkor miért nem választasz egy olyan nyelvet, amely imperative és funkcionális is? Meg esetleg több más szempontból is megfelelőbb a PHP-nál?
- A hozzászóláshoz be kell jelentkezni
Azert, mert elso sorban az elmeleti resze erdekel, a gondolkodasmod elsajatitasa, erre szerintem jobb egy tisztan funkcionalis nyelv, majd ha az alapok megvannak, lehet keverni a dolgokat.
- A hozzászóláshoz be kell jelentkezni
Egyebkent magam részéről alkalmazasfejlesztesre ezert tartom jo nyelvnek a C#-ot. Alapvetoen imperativ oop nyelv, de vannak funkcionális elemei is, alapbol statikus, erosen típusos nyelv, de ha kell, ott a dynamic. Meg egy csomo jóság es a framework sem rossz mögötte.
Mondjuk a sorvegi pontosvesszoket felednem, illetve jo lenne, ha alapbol a referencia típusok non-nullablek lennenek, es az ertek tipusoknal levo Nullable vagy rövidített T? formában engednem a null erteket ahol lehet...
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Szemely szerint azt is szeretem a webfejlesztesben, hogy nem vagyok win-hez kotve... :) A mono meg... hat arrol nem sok jot hallottam, de lehet hogy ez regen volt...
- A hozzászóláshoz be kell jelentkezni
Én pl. használom a Monot Androidon való fejlesztésre.
Teljesen jól működik. A csúcs az lenne, ha az Android plugin beépülne a VS-be, de ezt újabban már nem a VS korlátozza.
A .NET és a Mono már régóta közeledik egymáshoz, kölcsönösen osztanak meg libraryket, frameworköket, bővebben itt.
Fuszenecker Róbert
- A hozzászóláshoz be kell jelentkezni
Oh, ezt nem tudtam, ezek szerint eleg regi infokkal rendelkeztem, ami nem csoda, hiszen idejet nem tudom mikor fejlesztettem komolyabb desktop appot utoljara... talan az egyetemen... leszamitva 1-2 node-webkit-es projectet.
- A hozzászóláshoz be kell jelentkezni
Attól még a Mono...
... hagy maga után kívánnivalót.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Persze. Más költségvetéssel dolgozik a Xamarin és a Microsoft :-)
A Xamarin Studio sem egy Visual Studio.
De összességében használható, és a fejlődés is szépen látszik.
Fuszenecker Róbert
- A hozzászóláshoz be kell jelentkezni
Mondjuk amióta Xamarinként ténykednek azért látható, hogy a saját pecsenyéjüket akarják sütögetni és a .NET kompatibilitás inkább egy szükséges rossz, mint cél. Persze, okok érthetőek.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Ezt én értem, viszont magam részéről azt szeretem a VS+.NET-ben, hogy kapok egy jó, kényelmes, integrált környezetet, platformot, ami ha tartogat is időnként fasságokat összességében messze jobb, mint bármi, amit eddig láttam :)
És azt szeretem a webfejlesztésben, hogy ...
...
...
... ja igazából rühellem a webfejlesztést úgy ahogy van. :D
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Ezt is fáj olvasni egyébként :)
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Azert sokkal kevesbe (mar igy is olvashatobb mint a PHP-s megoldasod ;) ). Oke, indentalhatna meg egy sor egy kifejezes, de "hamarmindenkiegysorraljerkelt" cimszo alatt ilyen rovid kodnal belefer. :)
- A hozzászóláshoz be kell jelentkezni
Szerintem a PHP-s olvashatóbb.
Ha már csak hallottál olyanról, hogy funkc. prog, akkor azt felolvasva egy matematikailag, vagy nyelvileg közel helyes megfogalmazását kapod a feladatodnak.
Míg az előbbit inkább csak megszokásból értem meg egyből...
--
blogom
- A hozzászóláshoz be kell jelentkezni
Egy C-s for ciklust? Egy Range(1,999)-hez kepest? Vagy alar egy pascalos forhoz kepest? De, fájdalom. Csupan a megszokás mondatja veled.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Clojure:
(->> (concat (range 0 1000 3) (range 0 1000 5))
set
(reduce +))
Fogjuk a 3-al es 5-el oszthato szamokat, bedobjuk egy setbe, majd osszeadjuk. Egyszeru es nagyszeru.
Hy:
(sum (list-comp x [x (range 0 1000)]
(or (= (% x 5) 0)
(= (% x 3 ) 0))))
Vagy Clojure mintara:
(->> (+ (list (range 0 1000 3)) (list (range 0 1000 5)))
set
(reduce (fn [x y] (+ x y))))
--
|8]
- A hozzászóláshoz be kell jelentkezni
Python:
sum([i for i in range(1000) if i % 3 == 0 or i % 5 == 0])
--
♙♘♗♖♕♔
- A hozzászóláshoz be kell jelentkezni
Korábban már egyszer nekikezdtem a Haskell tanulásának, de akkor szerencsére/sajnos (nem kívánt rész törlendő) nem volt rá elég időm, így felhagytam az ismerkedéssel. Most van egy kis szabadidőm, és a postod újra felkeltette az érdeklődésemet. Talán most tovább jutok.
Az általad is linkelt irodalom második fejezetének a végén (typeclasses), úgy gondoltam, hogy később ezt a fejezetet újra kell olvasnom, mert fontos lehet. A következő fejezet elején rájöttem, hogy itt az ideje újraolvasni az előző fejezetet.
-----
(&%;_98\<|{3W10Tut,P0/on&Jkj"Fg}|B/!~}|{z(8qv55sr1C/n--k**;gfe$$5a!BB]\.-
- A hozzászóláshoz be kell jelentkezni
Egy pillanatig azt hittem, hogy az aláírásod is egy programkód :-)
Ezt esetleg: https://www.youtube.com/watch?v=UIUlFQH4Cvo
- A hozzászóláshoz be kell jelentkezni
Na, az egy jó pillanatod volt. :-)
Kicsit komolyabban: keress rá a malbolge kifejezésre. Az igazsághoz tartozik, hogy amikor találkoztam a Malbolge nyelvvel, akkor elég sok dolgot elolvastam róla, de azóta szinte majdnem mindent elfelejtettem már. Ha elég sokat olvasol, akkor rájössz, hogy miért lehet gyorsan felejteni. :-)
Egyébként ez az aláírásom :-) . Azt jelenti, hogy „ironcat” (idézőjel nélkül). Malbolge nyelven van. Egy-két éve a HUP-on olvastam erről a nyelvről.
Info: https://en.wikipedia.org/wiki/Malbolge_programming_language
Az oldalán alján van link egy portugál nyelvű blogra. Ott meg kell keresni a linket a malbolge-sdk.tgz-re, és azzal lehet „Hello World" stílusú programokat készíteni.
Kiegészítés: a gyakorlati haszna nagyon gyorsan tart a nullához. :-)
-----
(&%;_98\<|{3W10Tut,P0/on&Jkj"Fg}|B/!~}|{z(8qv55sr1C/n--k**;gfe$$5a!BB]\.-
- A hozzászóláshoz be kell jelentkezni
a reddit eleg jol porog haskell temakorben, http://www.reddit.com/r/haskell/. Erdemes olvasni. Az Simon Peyton Jones videok szenzaciosan jok - kivetel nelkul mindegyik https://www.haskell.org/haskellwiki/Video_presentations. Ez pedig egy jo kedvcsinalo : https://www.youtube.com/watch?v=b9FagOVqxmI
itt pedig arrol van szo hogy "haskell is useless" https://www.youtube.com/watch?v=iSmkqocn0oQ (SPJ) :)
- A hozzászóláshoz be kell jelentkezni
Koszi a linkeket! Jo, hogy minden itt van egy helyen.
- A hozzászóláshoz be kell jelentkezni
Nekem valamiért ez a megoldás ugrott be először:
sum [0, 3..999] + sum [0, 5..999] - sum [0,15..999]
- A hozzászóláshoz be kell jelentkezni
Csak hogy meglegyen.
Scala:
(for(x <- 0 to 999 if x % 3 == 0 || x % 5 == 0) yield x).sum
Erlang:
lists:sum([X || X <- lists:seq(0, 999), (X rem 3 == 0) or (X rem 5 == 0)]).
- A hozzászóláshoz be kell jelentkezni
Nem lenne kedve valakinek kicsit élvezkedni és sebesség mérést csinálni a felsorolt megoldásokból? :D
Nekem a Ruby 65%-al gyorsabban futott mint Python 2 és 3, kíváncsi lennék a többi interpretált nyelv milyen sebességet hoz :)
- A hozzászóláshoz be kell jelentkezni
En az imperialista C++ kodra fogadok, 20 dolcsi rajta.
- A hozzászóláshoz be kell jelentkezni
Nem nyert. A "funkcionális" C++ nálam egy nagyságrenddel gyorsabb...
(megjegyzem, a fordítás persze egy kicsivel lassabb :-) )
- A hozzászóláshoz be kell jelentkezni
time g++ -ggdb -ftemplate-depth=10000 test.cpp -otest
real 0m0.770s
user 0m0.687s
sys 0m0.083s
time g++ -ggdb -ftemplate-depth=10000 test2.cpp -otest2
real 0m0.212s
user 0m0.177s
sys 0m0.036s
time ./test
(...)
real 0m0.039s
user 0m0.005s
sys 0m0.017s
time ./test2
(...)
real 0m0.562s
user 0m0.509s
sys 0m0.019s
- A hozzászóláshoz be kell jelentkezni
clang-gal le se fordul a test1.cpp :(
(gcc g++-a meg nincs epp fent mert aranylag uj a Mac, es nagyon regen C/C++-oztam)
$ clang++ test.cpp -o test
test.cpp:2:77: fatal error: recursive template instantiation exceeded maximum depth of 256
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9744>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9745>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9746>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9747>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9748>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: (skipping 247 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see
all)
test.cpp:2:77: note: in instantiation of template class 'Sum<9996>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9997>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9998>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9999>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:6:27: note: in instantiation of template class 'Sum<10000>' requested here
unsigned long int x = Sum<10000>::value;
^
test.cpp:2:77: note: use -ftemplate-depth=N to increase recursive template instantiation depth
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
1 error generated.
- A hozzászóláshoz be kell jelentkezni
Érdemes elolvasni a hibaüzenetet. Rendesen. Ott a megoldás.
- A hozzászóláshoz be kell jelentkezni
Tudom :)
De ez igazabol csalas, azert gyorsabb a "funkcionalis" megoldas, mert csomomindent elore kiszamol a fordito. :) Olyan mintha define-olnad az osszes 10000 sort elore, nem pedig real time szamoltatnad :)
Meg egy ilyen eredmenyt amugy is elcache-elsz vagy elore kiszamolsz mindenhol :)
(Es most lusta vagyok utananezni a clang ftemplate-depth megfelelojenek, gepem ki is van mar kapcsolva)
- A hozzászóláshoz be kell jelentkezni
Tényleg késő lehetett: a hibaüzenetben ui. ott van a megfelelő kapcsoló :-)
Egyébként írtam is, hogy ez nagyobb fordítási időt eredményez.
Amit érdemes lehet tudni: a C++ template-kkel lehet (de érdemes?) funkcionálisan programozni, maga a programkód (pl. template példányosítás) lesz az input. Egyébként monadokat is csinálhatsz...
Olvastam olyan véleményt, hogy a C++ template megértéséhez hasznos a FP ismerete.
- A hozzászóláshoz be kell jelentkezni
clang++ elsegfaultol:
$ time clang++ -ftemplate-depth=100000 test.cpp
clang: error: unable to execute command: Segmentation fault: 11
clang: error: clang frontend command failed due to signal (use -v to see invocation)
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.0.0
Thread model: posix
clang: note: diagnostic msg: PLEASE submit a bug report to http://developer.apple.com/bugreporter/ and include the crash backtrace, preprocessed source, and associated run script.
clang: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /var/folders/jz/nltfyqt91t90fqh5sjmnfp700000gn/T/test-2fb360.cpp
clang: note: diagnostic msg: /var/folders/jz/nltfyqt91t90fqh5sjmnfp700000gn/T/test-2fb360.sh
clang: note: diagnostic msg:
********************
real 0m1.263s
user 0m0.277s
sys 0m0.044s
$ clang --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.0.0
Thread model: posix
OS X 10.10 develpoer tools-hoz gyarilag jaro clang verziorol van szo
Update: a hatar 1406 es 1407 template kozott van:
$ time clang++ -ftemplate-depth=1406 test.cpp -o test
test.cpp:2:77: fatal error: recursive template instantiation exceeded maximum depth of 1406
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<8594>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<8595>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<8596>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<8597>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<8598>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: (skipping 1397 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see
all)
test.cpp:2:77: note: in instantiation of template class 'Sum<9996>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9997>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9998>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:2:77: note: in instantiation of template class 'Sum<9999>' requested here
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
test.cpp:6:27: note: in instantiation of template class 'Sum<10000>' requested here
unsigned long int x = Sum<10000>::value;
^
test.cpp:2:77: note: use -ftemplate-depth=N to increase recursive template instantiation depth
template <unsigned long N> struct Sum { enum { value = ((N%3)&&(N%5)?0:N) + Sum<N - 1>::value };};
^
1 error generated.
real 0m0.264s
user 0m0.229s
sys 0m0.031s
$ time clang++ -ftemplate-depth=1407 test.cpp -o test
clang: error: unable to execute command: Segmentation fault: 11
clang: error: clang frontend command failed due to signal (use -v to see invocation)
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.0.0
Thread model: posix
clang: note: diagnostic msg: PLEASE submit a bug report to http://developer.apple.com/bugreporter/ and include the crash backtrace, preprocessed source, and associated run script.
clang: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /var/folders/jz/nltfyqt91t90fqh5sjmnfp700000gn/T/test-ed1686.cpp
clang: note: diagnostic msg: /var/folders/jz/nltfyqt91t90fqh5sjmnfp700000gn/T/test-ed1686.sh
clang: note: diagnostic msg:
********************
real 0m0.503s
user 0m0.263s
sys 0m0.042s
- A hozzászóláshoz be kell jelentkezni
Bezzeg a gcc...
Azzal simán megy. Jó, nagyobb értéknél szintén elhasal, ami azért pofont érdemelne...
- A hozzászóláshoz be kell jelentkezni
Annyit nincs nagy tapasztalatom C++ terén, ezért azokat kérdem, akik napi szinten ezt nyüstöslik: Mennyire reális egy 10000-res rekurzió a templatek esetén egy valós projektnél?
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Látod. Ennyire. :-)
- A hozzászóláshoz be kell jelentkezni
+1 kérdés: jól sejtem, hogy szabvány szerint ezt a template-rekurziót a fordítónak fordítási időben kell megoldania?
--
blogom
- A hozzászóláshoz be kell jelentkezni
En is ritkan C++-ozok (sajnos, pedig egyik kedvenc nyelvem lehetne), de azt biztosan allithatom, hogy ilyen allatsagokat mig programozokent valoszinuleg megtehetsz, addig szoftverfejlesztokent nem illik vele szivatni a csapatodat.
- A hozzászóláshoz be kell jelentkezni
Lásd még: Boost.
- A hozzászóláshoz be kell jelentkezni
Barmelyik, ami forditasi idoben megmondja az eredmenyt, nyerni fog.
Egy joliranyzott Hy makroval peldaul gyorsabb lesz a megoldas, mint az alap Python. (Es tippre igy Rubyt is verne)
Persze a meresnel illik ugy merni, hogy egyreszt nem egy futast merunk, masreszt az interpreter startup timejat nem merjuk bele.
--
|8]
- A hozzászóláshoz be kell jelentkezni
Interpretált nyelvekre értettem. Másrészt én is úgy gondoltam, hogy a runtime betöltést nem mérjük. :) Illetve legyen 0 és 1 millió között.
Ha valaki nem akar utánanézni és nem használ Ruby-t, a Ruby példát megadhatom:
ruby -e 'require "benchmark"; p Benchmark.realtime { (0..999999).select{|x| x % 3 == 0 or x % 5 == 0}.inject(:+) }'
- A hozzászóláshoz be kell jelentkezni
(defmacro euler-1-macro []
(sum (list-comp x [x (range 0 1000)]
(or (= (% x 5) 0)
(= (% x 3 ) 0)))))
Ez kb ennek a python kodnak felel meg:
233168L
Igy a benchmarkolasa:
python -m timeit "233168L"
Ez nagyjabol 10000x gyorsabb, mintha futasi idoben futna a szamolas. Annyi a kulonbseg, hogy itt "forditasi" (ertsd: AST generalasi) idoben fut le a lenyeg. Nyilvan eroltetett pelda, de mokasnak mokas, es jol mutatja miket lehet csinalni egy joliranyzott makroval ;)
--
|8]
- A hozzászóláshoz be kell jelentkezni
Persze, de gondolom nem mindent tudsz bemakrózni. Illetve az optimalizálás külön kérdés. Mindegy, fun faktornak jó csak természetesen az ilyen mérés.
- A hozzászóláshoz be kell jelentkezni
Barmit lehet makroba irni, aminek nincsen szuksege runtime adatok ismeretere. A teljes nyelv a makrok rendelkezesere all.
Ettol fuggetlenul nagyon meg kell gondolni, mit tesz makroba az ember.
--
|8]
- A hozzászóláshoz be kell jelentkezni