Kokį kiečiausią programavimo triuką mokate?

Visos temos, kurios neįsipaišo nei į vieną forumą aukščiau.
Post Reply
User avatar
Vilius
administratorius
Posts: 3766
Joined: 2004-04-19 12:28
Location: Bruxelles

2018-04-03 16:08

Pastebėjau, kad forume yra bent keli programuotojai, tai gal reikėtų ir atskiros temos jiems pasireikšti.
User avatar
Vilius
administratorius
Posts: 3766
Joined: 2004-04-19 12:28
Location: Bruxelles

2018-04-03 16:27

Nu tai pradėsiu nuo tokio gana paprasto pavyzdžio.

Čia yra (by far) dažniausiai naudojama iš mano asmeninės bibliotekos funkcijų.

Pilnoje formoje (Scala) ji atrodo taip:

Code: Select all

  def normalize[A](value: A, oldMin: A, oldMax: A, min: A, max: A)
                  (implicit num: Fractional[A]): A = {
    require(!num.equiv(oldMax, oldMin), "oldMax cannot be equal to oldMin")
    min + (value - oldMin) * (max - min) / (oldMax - oldMin)
  }
Bet čia viskas atrodo žymiai sudėtingiau, nei iš tiesų yra (dėl generic klasės naudojimo ir klaidų tikrinimo).

Jei skaičiuojate vien Double tipo skaičiais, ir nebijote gauti division by zero klaidą, galima supaprastinti iki tokios formos:

Code: Select all

  def normalize(value: Double, oldMin: Double, oldMax: Double, min: Double, max: Double): Double = {
    min + (value - oldMin) * (max - min) / (oldMax - oldMin)
  }

Funkcija daro labai paprastą dalyką. Paima skaičių value ir jį "normalizuoja" iš intervalo [oldMin; oldMax] į [min; max].

Pvz:

Code: Select all

scala> normalize(0.5, 0.0, 1.0, 2.0, 4.0)
res2: Double = 3.0
Visai paprasta funkcija, kurią naudoju beveik kiekvieną kartą, kai reikia kažką skaičiuoti. Pvz., verčiant iš vienų vienetų į kitus, perskaičiuojant spalvų komponentus, keičiant koordinačių mastelį ir pan.
Lionginas
senbuvis
Posts: 1984
Joined: 2011-10-03 09:35

2018-04-05 15:33

Code: Select all

while (true) {
   mail("geriausias@draugas.lt", "Su šv. Kalėdom!", "Sveikinu!!!");
}
User avatar
vvv2
skeptikas
Posts: 552
Joined: 2007-08-02 11:24

2018-04-05 16:59

Vilius wrote:
2018-04-03 16:27
Jei skaičiuojate vien Double tipo skaičiais, ir nebijote gauti division by zero klaidą, galima supaprastinti iki tokios formos:

Code: Select all

  def normalize(value: Double, oldMin: Double, oldMax: Double, min: Double, max: Double): Double = {
    min + (value - oldMin) * (max - min) / (oldMax - oldMin)
  }
- naudojant C++, yra tokių ir kitokių klaidų gaudymo automatinis mechanizmas (catch). Tiesa, kartais tenka ir pačiam "pagaudyti", jei nori išskirtinės reakcijos.
Lionginas wrote:
2018-04-05 15:33
.. while (true) {
- gaila, bet "true" jau pasibaigė..

Paaiškinimas: atėjo atėjistas į laisvus serverius ir uždraudė tokį "true"!

:)
(c) by "vvv2", aš žinau, kad tu žinai, bet tu nežinai, kad tu žinai klaidingai..
Lionginas
senbuvis
Posts: 1984
Joined: 2011-10-03 09:35

2018-04-05 17:25

Code: Select all

if ("atėjo atėjistas į laisvus serverius ir uždraudė tokį true!" instanceof MedinisBajeris) {
    throw new ThreadDeath();
}
Pagaudyk jei nori išskirtinės reakcijos.
User avatar
vvv2
skeptikas
Posts: 552
Joined: 2007-08-02 11:24

2018-04-05 19:05

Lionginas wrote:
2018-04-05 17:25
Pagaudyk jei nori išskirtinės reakcijos.
- tuojau sukompailinsiu Windows source ir išbandysiu tavo kodą!

Image

:)
(c) by "vvv2", aš žinau, kad tu žinai, bet tu nežinai, kad tu žinai klaidingai..
User avatar
Vilius
administratorius
Posts: 3766
Joined: 2004-04-19 12:28
Location: Bruxelles

2018-04-05 22:53

vvv2 wrote:
2018-04-05 19:05
- tuojau sukompailinsiu Windows source ir išbandysiu tavo kodą!
O, Windows Vista juokeliai.. Jaunystę priminė :)
User avatar
Sejanus
senbuvis
Posts: 1380
Joined: 2008-11-16 14:41

2018-05-28 22:16

Kol kas nesu aptikęs nieko kiečiau už šitą triuką (radau lolphp reddite):

Compute exponents easily with this one weird trick!
https://3v4l.org/QdXOv
User avatar
Vilius
administratorius
Posts: 3766
Joined: 2004-04-19 12:28
Location: Bruxelles

2018-05-31 09:41

Sejanus, taip ir nesupratau kaip veikia tas tavo PHP pavyzdys.. Bet man labiau patinka praktiški programavimo triukai.

Šiaip visa Scalos kolekcijų biblioteka yra beveik meno kūrinys. Tačiau kiečiausias triukas, kurį moku padaryti jų pagalba yra šis.

Iš pradžių paprastas pavyzdys be mano triuko:

Code: Select all

someList.foreach { element =>
  doSomethingWith(element)
}
Čia kol kas nieko sudėtingo - tiesiog pereiname visus sąrašo someList elementus, ir su jais atliekame operaciją doSomethingWith. Čia man patinka gana lakoniška ir stebėtinai lanksti Scalos "foreach" interpretacija, bet tai galima padaryti ir su bet kuria kita programavimo kalba.

Tačiau yra viena problema. Šis kodas naudotų tik vieną procesoriaus threadą, kas yra truputį neefektyvu, kai pvz. mano procesorius gali lygiagrečiai vykdyti 8 threadus. Aišku, daugumoje programavimo kalbų būtų įmanoma kažkaip padalinti tą sąrašą, ir paleisti tuos gabalus ant atskirų threadų. Tačiau Scala gali tai padaryti nepaprastai lakoniškai - tiesiog panaudoja par metodą va taip:

Code: Select all

someList.par.foreach { element =>
  doSomethingWith(element)
}
Dabar mūsų kodas išnaudos visus procesoriaus threadus, kas daugumoje kompiuterių leis pagreitinti skaičiavimus iki kelių kartų.

Aišku, reikia būti atsargiam, kad doSomethingWith nenaudotų bendrų resursų su kitais threadais, ar ko nors neužlockintų, bet su trupučiu patirties galima nesunkiai to išvengti.
Aš šį triuką naudoju taip dažnai, kad net nebepamenu, kada paskutinį kartą esu rašęs paralelines programas įprastiniais būdais.
User avatar
Sejanus
senbuvis
Posts: 1380
Joined: 2008-11-16 14:41

2018-06-08 15:28

Tas mano pavyzdys buvo šiaip, pasišaipymas iš PHP. Ir iš triukų.

Iš duotų pavyzdžių tai atrodo, kad tu triukais laikai kažkokių programavimo kalbos featurų žinojimą ir protingą naudojimą. Man programavimo triukai visada asocijuodavosi su kažkokiu side effectų ar nedokumentuotų featurų smartassišku išnaudojimu kur reikia ir ypač kur nereikia. Iš serijos „žiūrėkit visi kaip moku!“ Ir už tokius triukus dažniausiai autoriams norėtųsi nagus nudaužyti. O kai debuginimui sugaišti 2+ valandas tai ir dar ką nors nudaužyti. Bet čia vėl gi labiau PHP „featuras“, dauguma kitų populiarių sistemų neturi net iš toli tokio kiekio side effectų, kuriuos visi smartassai galėtų išnaudoti savo triukams.
User avatar
vvv2
skeptikas
Posts: 552
Joined: 2007-08-02 11:24

2018-06-08 16:22

Sejanus wrote:
2018-06-08 15:28
Bet čia vėl gi labiau PHP „featuras“, dauguma kitų populiarių sistemų neturi net iš toli tokio kiekio side effectų..
- sutinku, kad PHP turi menkų niekingų triukų rinkinuką, lyginant su "tikra" triukų gigantų kalba, o būtent C/C++

:)
(c) by "vvv2", aš žinau, kad tu žinai, bet tu nežinai, kad tu žinai klaidingai..
Post Reply