Kokį kiečiausią programavimo triuką mokate?

Visos temos, kurios neįsipaišo nei į vieną forumą aukščiau.
Post Reply
Vilius
emeritas
Posts: 6521
Joined: 2004-04-19 12:28

2018-04-03 16:08

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

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.
User avatar
Lionginas
senbuvis
Posts: 5553
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!!!");
}
vvv2
senbuvis
Posts: 1178
Joined: 2007-08-02 11:24
Location: Kaunas city
Contact:

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"!

:)
User avatar
Lionginas
senbuvis
Posts: 5553
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.
vvv2
senbuvis
Posts: 1178
Joined: 2007-08-02 11:24
Location: Kaunas city
Contact:

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

:)
Vilius
emeritas
Posts: 6521
Joined: 2004-04-19 12:28

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: 1669
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
Vilius
emeritas
Posts: 6521
Joined: 2004-04-19 12:28

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: 1669
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.
vvv2
senbuvis
Posts: 1178
Joined: 2007-08-02 11:24
Location: Kaunas city
Contact:

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++

:)
Post Reply