Bisqwit::blog - 2003-01-17



--- Fri Jan 17 01:16:20 EET 2003 ---

Mitä enemmän luen Rubyn manuaalia, sitä
enemmän tykkään tuosta ohjelmointikielestä.

Tässä muutamia keinoja tehdä Rubyllä for-looppi 0-999:

  (0..999).each { |i| puts i }

  1000.times { |i| puts i }

  for i in 0..999;puts i;end

  i=-1; puts i while (i+=1) < 1000

Tämä ohjelmanpätkä (käytetty botin .googlefight -komennossa)
suorittaa annetun ohjelmanpätkän, jakaa sen palauttaman
stringin riveiksi ja etsii joukosta ne viisi riviä, joista
keskimmäinen (välilyönnit poistettuna) on 'versus' ja
palauttaa taulukon, jossa on näistä viidestä rivistä
toinen ja viides muutettuna kokonaisluvuiksi.

  def getresnum(s)
    # Remove all nonnumbers and convert the result to integer
    s.gsub(/[^0-9]/, '').to_i
  end
  def analyze
    s2=s3=s4=s5=''
    # Process each line of the output of given code
    yield.split("\n").each do |line|
      s2,s3,s4,s5 = s3,s4,s5,line.strip
      return [getresnum(s2), getresnum(s5)] if s3=='versus'
    end
    [0,0]
  end

Tämä komento asettaa muuttujiin res1 ja res2 mainitun analyze-funktion
paluuarvot tällöin, kun sen suorittama koodi on analyysi1-funktiokutsu
muuttujien q1 ja q2 arvoilla parametreinä. {} -välissä voisi olla
enemmänkin koodia kuin yksi funktiokutsu. Se ei ole pelkkä parametri.

  res1,res2 = analyze { analyysi1(q1,q2) }

Tämä koodi tulostaa 'näkemiin', vaikka tuonne beginin ja ensuren
väliin laittaisi mitä tahansa koodia -- virheellistäkin.

  begin
    puts 'hmm'
    exit
  ensure
    puts 'näkemiin'
  end

Tämä on Rubyn manuaalista esimerkkiohjelma,
joka laskee 20:nnen Fibonaccin luvun:

  def fib(n)
    if n<2
      n
    else
      fib(n-2)+fib(n-1)
    end
  end
  print(fib(20), "\n");

Vastaava ohjelma C:llä:

  #include <stdio.h>
  static int fib(int n)
  {
    if(n < 2) return n;
    return fib(n-2) + fib(n-1);
  }
  int main(void)
  {
    printf("%d\n", fib(20));
    return 0;
  }

(C++:lla en viitsi, koska ei ole järkeä kikkailla classien kanssa
 tässä tapaukesssa. Tulos olisi lähes identtinen C-ohjelman kanssa.)

Vastaava ohjelma javalla (disclaimer: en osaa javaa, arvasin vain):

  public class fibonakki
  {
    public static int fib(int n)
    {
      if(n < 2) return n;
      return fib(n-2) + fib(n-1);
    }
    public static void main(String[] args)
    {
      System.out.println(fib(20));
    }
  }

Vastaava ohjelma php:llä:
  
  <?php
  function fib($n)
  {
    if($n < 2) return $n;
    return fib($n - 2) + fib($n - 1);
  }
  echo fib(20), "\n";

Myös perlillä (Rubyn manuaalista):

  sub fib
  {
    my($n)=@_;
    if ($n<2)
    {
      return $n;
    }
    else
    {
      return fib($n-2)+fib($n-1);
    }
  }

  print fib(20), "\n";

Ja pythonilla (niinikään Rubyn manuaalista):

  def fib(n):
    if n<2:
      return n
    else:
      return fib(n-2)+fib(n-1)

  print fib(20)

Vielä Schemelläkin (Rubyn examples-hakemistosta):

  (define (fib n)
    (if (< n 2)
        n
        (+ (fib (- n 2)) (fib (- n 1)))))

  (display (fib 20))
  (newline)
  (quit)

Tämän vertailun tarkoitus oli lähinnä demonstroida kielten yleisulkonäköä
ilman kummempia kikkailuja. Kutakin noista varmasti saisi lyhyemmäksikin
jos vain alkaisi säätämään.


--- Fri Jan 17 02:01:44 EET 2003 ---

Kas, minulla on tällainenkin melkein vuoden vanha sivu:
http://bisqwit.iki.fi/jutut/c_cpp/ - esimerkki C:n ja C++:n eroista.
Indeksoikoon Google senkin.


--- Fri Jan 17 02:47:16 EET 2003 ---

Lisäsin toissapäivän kirjoitukseen vielä jotain NES-asiaa,
kun sattui tuo kappaleenarpoja tuomaan tutun kappaleen eteen...


--- Fri Jan 17 03:17:40 EET 2003 ---

Zzzzzz.
Odotettavissa alle 6h unet :(
Niin kiinnostava vaan tuo Ruby...


--- Fri Jan 17 09:19:23 EET 2003 ---

Ja asiakkaalle...


--- Fri Jan 17 17:25:39 EET 2003 ---

Töistä.
Töihin lähtiessäni minulta tippui vahingossa toinen käsine
auton ulkopuolelle, ja sen käsitin vasta kun olimme jo lähteneet
(menin työkaverin kyydillä). Mutta nyt kahdeksan tuntia myöhemmin
palatessani se löytyi kuitenkin lähistöltä kunnossa.


-- Designed for Lynx/Mozilla viewing ---
All content herein is copyright © 2004 Joel Yliluoma - unauthorized republishing prohibited.
Hakukoneita varten lista kaikista sivuista.