1. Bugiraportit ja palaute XenForo-MuroBBS:stä tähän viestiketjuun

    Tuliko vastaan englantia tai huonoa suomea, raportoi tähän viestiketjuun

Ohjelmointipähkinä

Viestiketju alueella 'Ohjelmointi' , aloittaja Pikivirta, 28.12.2011.

  1. Pikivirta

    Rekisteröitynyt:
    19.12.2011
    Viestejä:
    37
    Edellisessä työpaikassa tuli piruuttaan aina välillä heiteltyä muille ohjelmistokädellisille kysymyksiä, jotka jossain kohtaa saivat nimen viikon ohjelmointipähkinä. Näyttää siltä, että samanlaisia löytyy myös eripuolilta nettiä, eri foorumeiltakin, mutta laitetaanpa yksi mokoma ketju tännekin pystyyn. Päästään tutustumaan minkälaisia erilaisia kieliä sitä onkaan olemassa, miten erilailla asioita voi tehdä ja kuka foorumilaisista osaa tehdä jotain muutakin kun pelata :D.

    Osallistuminen tapahtuu omalla tai kaverin kielellä lähettämällä threadiin ohjelmakoodinpätkä, joka toteuttaa tehtävän. Voin yrittää pitää kirjaa tässä ekassa viestissä tehtävistä linkkeineen, mikäli vaikka muistutatte tehtävästä vaikka PM:llä vielä varmuuden vuoksi. Eipä ole mitään estettä lähettää vaikka jo toteutetullakin kielellä, kun sillon nähdään noita erilaisia versioita saman kielisestä toteutuksesta.

    Pähkinät tähän asti:
    1. tähtikuvio /Pikivirta
    2. lyhyin reitti /Tukemon
    3. ykkösbittien lukumäärä /Tukemon
    4. joulukuusi /Elorond
    5. kirjainten järjestys /Pikivirta
    6. roomalaiset numerot /hsalonen
    7. tiedoston koko /Boss O
    8. countdown game show /Yoshiki
    9. puutietorakeenne /Vaaksiainen
    10. sokkelo /Olorin
    11. Fibonacci /Spunde
    12. Klassinen arporaattori /Teekoonääs
    13. konsoliajastin /Viisastelija
    14. ?

    Ohjelmointitaitoisia foorumilla:
    _kapseli_ (C++)
    Boss O (JavaScript)
    Elorond (C/C++, VBA/Basic, prolog)
    erfv (C++)
    Grez (C#)
    Grunt86 (C++, Ada)
    Hamatti (R)
    HNI (Java)
    Humanoid (C)
    höpis (Java)
    immoT (Perl)
    jak_pdgm (x86 asm)
    Karhukainen (Python)
    Low Life (C++)
    lord12 (PHP)
    MoonCow (Python)
    mpower (shell script)
    Olorin (Python)
    Para (Groovy)
    pekste (C)
    progo (Clojure)
    Pikivirta (C, Pascal)
    Teekoonääs (C)
    Spunde (C#, F#)
    Syyskis (PHP)
    sterner-regnix (Ruby)
    Too late (Scheme)
    tenttu_ (C++)
    tukemon (Gforth, Basic, Fortran)
    ts. (C/C++)
    Vaaksiainen (C, MATLAB, WinDbg)
    Viisastelija (JavaScript, Scala)
    Warmy (Java)
    Yoshiki (C#)
    Zeikko (C#)
    Zvona (JavaScript)

    ..auts. Mikäli joku kokee yllä olevan listan huonona, otetaan poies. Muussa tapauksessa lienee saanee roikkua tuossa mukana?
     
    Viimeksi muokattu: 17.01.2012
  2. Pikivirta

    Rekisteröitynyt:
    19.12.2011
    Viestejä:
    37
    Jotta jostain päästään aloittamaan, ensimmäinen pähkinä lainataan kaverilta..

    Pitää tehdä ohjelman pätkä, joka piirtää seuraavan kuvion:

    *
    **
    ***
    ****
    *****
    ****
    ***
    **
    *

    ..siten, että piirrettävien tähtien määrä on määriteltävissä. Jos luku sattuu olemaan parillinen, piirretään se rivi kuitenkin vaan kertaalleen.

    Vastauksen kieli siis on vapaa, mutta mielellään kerrotaan mistä kielestä on kyse.
     
    Viimeksi muokattu: 28.12.2011
  3. Zeikko

    Rekisteröitynyt:
    16.06.2009
    Viestejä:
    2 938
    Mitkä tähdet täytyy olla määriteltävissä? Pisimmän/keskimmäisen "rivin" tähtien määrä vai kaikkien tähtien määrä yhteensä ( jos jälkimmäinen, niin entä jos tähtien määrä ei mene tasan ).
     
  4. Para

    Rekisteröitynyt:
    15.09.2002
    Viestejä:
    300
    Kielenä Java-johdannainen Groovy:

    Koodi:
    println [[1..<5],[5..1]].flatten().collect { n -> ''.padLeft(n, '*') }.join('\n')
    En koodia millään ajanut, joten ranget voivat hieman nikotella. Ja kuten varmaan osaatte päätellä, parametrisointi on suht triviaalia.

    EDIT: Hox! Tulostus näytti alunperin pikkaisen väärältä, muokkasin hitusen.
     
    Viimeksi muokattu: 28.12.2011
  5. Teekoonääs

    Rekisteröitynyt:
    28.05.2002
    Viestejä:
    3 027
    Päivänkieli on C:


    Tsiisös mitä tää tekee noille sisennyksille..
     
    Viimeksi muokattu: 29.12.2011
  6. Lord12

    Rekisteröitynyt:
    09.08.2000
    Viestejä:
    941
    For-lauseilla ja PHP:lla.

    Koodi:
    
    <?php
    
    function print_stars($num) {
            while ($i < $num) {
                    echo "*";
                    $i++;
            }
    }
    
    $STARS = 5;
    
    for ($i = 1; $i <= $STARS; $i++) {
            print_stars($i);
            echo "<br>";
    }
    
    for ($i = $STARS-1; $i >= 1; $i--) {
            print_stars($i);
            echo "<br>";
    }
    
    ?>
    
     
  7. Pikivirta

    Rekisteröitynyt:
    19.12.2011
    Viestejä:
    37
    Voitais varmaan sopia, ettei tähtimäärää nähdä kun kerran ryppäässä.
     
  8. Pikivirta

    Rekisteröitynyt:
    19.12.2011
    Viestejä:
    37
    Vastaanpa ittekki (:)).. pascalilla tää vois olla vaikka näin:

    Koodi:
    procedure TApp.Example1;
    var
      i, j, d: integer;
      s: string;
    begin
    
      // param check
      if paramcount<1 then
      begin
        Writeln('usage: Example1 [amount of stars]');
        Terminate;
        Exit;
      end;
    
      // init vars
      trystrtoint(paramstr(1), i);
      s:= '';
      d:= i*2;
    
      // do stars
      for j:=0 to d-1 do
      begin
        if (j<i) then
        begin
          s:= s + '*';
        end else
        begin
          setlength(s, d-j-1);
        end;
        writeln(s);
      end;
    
    end;
     
  9. Tenttu_

    Rekisteröitynyt:
    08.07.2006
    Viestejä:
    427
    C++

    Koodi:
    int main()
    {
      int n = 60;
      for(int i=0; i<=(n%2?n*2-1:n*2); i++)
      {
        for(int j=0; j<(i - i/(n+1) * ((i - n)*2)); j++)
        {
          cout << "*";
        }
        cout << endl;
      }
    }
    
    C++ code - 12 lines - codepad
     
  10. Olorin

    Rekisteröitynyt:
    23.02.2002
    Viestejä:
    1 307
    Python (2.x):
    Koodi:
    def tahdet(n):
        return '\n'.join('*' * x for x in range(1, n) + range(n, 0, -1))
    
    print tahdet(5)
     
  11. Zvona

    Rekisteröitynyt:
    22.10.2001
    Viestejä:
    888
    JavaScriptillä seuraavanlainen:
    stars - tähtien maksimimäärä
    pyramides - piirrettävien "pyramidien" määrä
    char - piirtämiseen käytettävä merkki
    delimiter - useamman pyramidin välissä oleva erotinmerkki

    Koodi:
    <script>
    var stars = 5,
      pyramides = 1,
      char = "*",
      delimiter = "",
    
      i=0, l= pyramides*2, str ="";
    
    for (;i<l;i++) {
      var lines = stars;
      
      while (lines--) {
        str = (i % 2) ? str.substr(1) : str+char;
        (str.length) ? console.log(str) : (i+1<l) ? console.log(delimiter) : "";
      }
    }
    </script>
     
  12. immoT

    Rekisteröitynyt:
    24.02.2003
    Viestejä:
    1 061
    Perlillä
    Koodi:
    $d = 5;
    for(1..$d*2) {
        print "\n";
        if($_ < $d+1) {
            for(1..$_) { print "*"; }
        } else {
            for(1..($d*2-$_)) { print "*"; }
       }
    }
    
     
  13. Tukemon

    Rekisteröitynyt:
    14.06.2008
    Viestejä:
    735
    Gforth

    Koodi:
    
    : stars 0 do 42 emit loop cr ;  ok
    : rise 1+ 1 do i stars loop ;  ok
    : fall 1- 1 swap do i stars -1 +loop ;  ok
    : pattern dup cr rise fall ;  ok
      ok
    5 pattern 
    *
    **
    ***
    ****
    *****
    ****
    ***
    **
    *
     ok
    
    
     
  14. Warmy

    Rekisteröitynyt:
    22.06.2009
    Viestejä:
    41
    Minä myös! Ohessa Java-ratkaisuni :)

    Koodi:
        private static void piirra(int korkeus) {
            String tahdet="";
            
            for (int i=0; i < korkeus; ++i) {
                tahdet += "*";
                System.out.println(tahdet);
            }
            kaanna(tahdet);
        }
    
        private static void kaanna(String tahdet) {
            if (tahdet.length() == 0)
                return;
            
            tahdet = tahdet.substring(0, tahdet.length()-1);
            System.out.println(tahdet);
            kaanna(tahdet);
        }
     
  15. Yoshiki

    Rekisteröitynyt:
    07.02.2010
    Viestejä:
    40
    Hassutteluratkaisu C#:lla:

    Koodi:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int stars = 6; // int.Parse(Console.ReadLine());
    
                1.To(stars).And((stars - 1).To(1)).Do((i) => Console.WriteLine(new string('*', i)));
            }
        }
    
        static class Extensions
        {
            public static void Do<T>(this IEnumerable<T> enumerable, Action<T> action)
            {
                foreach (var item in enumerable)
                    action(item);
            }
    
            public static IEnumerable<int> To(this int from, int to)
            {
                if (to < from)
                    return Enumerable.Range(to, from + 1 - to).Reverse();
                else
                    return Enumerable.Range(from, to + 1 - from);
            }
    
            public static IEnumerable<int> And(this IEnumerable<int> coll1, IEnumerable<int> coll2)
            {
                return coll1.Concat(coll2);
            }
        }
    }
    
     
  16. MoonCow

    Rekisteröitynyt:
    20.08.1999
    Viestejä:
    704
    Pöh, python ratkaisu kerkesikin jo aiemmin :(
     
  17. Tukemon

    Rekisteröitynyt:
    14.06.2008
    Viestejä:
    735
    Onpas kumma kun ei kukaan vielä Basicia ehdottanut.

    Koodi:
    
    bwBASIC: list
         10: input k
         20: for i=1 to k
         30: gosub 100
         40: next i
         50: for i=k-1 to 1 step -1
         60: gosub 100
         70: next i
         80: end
        100: for j=1 to i
        110: print "*";
        120: next j
        130: print
        140: return
    bwBASIC: run
    ? 5
    *
    **
    ***
    ****
    *****
    ****
    ***
    **
    *
    bwBASIC: 
    
    
     
  18. Elerond

    Rekisteröitynyt:
    28.12.2000
    Viestejä:
    5 741
    VBA, pienellä viilauksella koodista saa myös Visual Basic ohjelman

    Koodi:
    Public Sub WriteStars()
        Dim NumberOfStarsInLongestLine As Integer
        Dim Stars As String
        
        NumberOfStarsInLongestLine = 5
        
        For counter = 1 To NumberOfStarsInLongestLine
            Stars = Stars & vbCrLf & String(counter, "*")
        Next counter
            
        For counter = NumberOfStarsInLongestLine - 1 To 1 Step -1
            Stars = Stars & vbCrLf & String(counter, "*")
        Next counter
        
        MsgBox Stars
    
    End Sub
     
  19. Tukemon

    Rekisteröitynyt:
    14.06.2008
    Viestejä:
    735
    Laitetaanpa vielä Fortran:

    Koodi:
    $ cat stars.for
    
          INTEGER I,K
    
          READ *,K
          DO 100 I=1,K
          CALL STAR(I)
      100 CONTINUE
          DO 200 I=1,K
          CALL STAR(K-I)
      200 CONTINUE
          STOP
          END
    
          SUBROUTINE STAR(N)
          INTEGER N
          INTEGER J
          DO 300 J=1,N
          WRITE(*,'(A,$)') '*'
      300 CONTINUE
          WRITE(*,'(A)') ' '
          END
     
    Koodi:
    $ f77 stars.for
       MAIN:
       star:
    $ ./a.out
    5
    * 
    ** 
    *** 
    **** 
    ***** 
    **** 
    *** 
    ** 
    * 
    
     
    Viimeksi muokattu: 28.12.2011
  20. mpower

    Rekisteröitynyt:
    22.01.2001
    Viestejä:
    88
    Tuossa vähän shell scriptiä:
    Koodi:
    #!/bin/sh
    
    STARS=$1
    
    for i in `seq 1 1 $STARS ;seq $(($STARS - 1)) -1 1`
    do 
        for j in `seq $i`
        do
        echo -n "*"
        done
        echo
    done
    Koodi:
    $ ./stars.sh 5
    *
    **
    ***
    ****
    *****
    ****
    ***
    **
    *
    
     
  21. Sterner Regnix

    Rekisteröitynyt:
    10.09.2002
    Viestejä:
    858
    Ruby, mikäli kukaan ei ole vielä ehtinyt...

    Koodi:
    def print_stars(len)
      1.upto(len-1) { |counter| puts '*'*counter }
      len.downto(1) { |counter| puts '*'*counter }
    end
    
    print_stars(5);
    
     
  22. Viisastelija

    Rekisteröitynyt:
    17.09.2007
    Viestejä:
    74
    Perkele kun viette kaikki tutut kielet, niin jouduin toteuttamaan ohjelman kielellä, mitä en ole ikinä ennen tehnyt.

    Siis, ikiensimmäinen scala-ohjelmani:
    Koodi:
    object Yhyy {
      def main(args:Array[String]) = {
        var numero:Int = args(0).toInt
        for (i <- 0 until numero) {
            tulostaaah(i, 0)
        }
        for (i <- (1 to (numero - 1)).reverse){
            tulostaaah(i, 1)
        }
      }
      
      def tulostaaah(a: Int, b: Int){
        var juu = ""
        for(i <- b to a){
            juu += "*"
        }
        println(juu)
      }
    }
    Koodi:
    E:\ohjelmointi\scala\tmp>scala Yhyy 5
    *
    **
    ***
    ****
    *****
    ****
    ***
    **
    *
     
  23. diesel1

    Rekisteröitynyt:
    11.08.2002
    Viestejä:
    250
    Tentun C++ ja immoT:n Perl -koodit on kyllä molemmat niin kaunista katseltavaa.
     
  24. progo

    Rekisteröitynyt:
    08.11.2005
    Viestejä:
    642
    Koodi:
    (defn stars [x] (doseq [_ (range x)] (print \x)))
    (defn triangle [width]
        (doseq [x (concat (range 1 width) (range width 0 -1))]
          (stars x) (println)))
    
    user=> (triangle 5)
    x
    xx
    xxx
    xxxx
    xxxxx
    xxxx
    xxx
    xx
    x
    
    
    


    Suhteellisen köykäistä Clojure-koodiksi, mutta toiminnee.
     
  25. Pikivirta

    Rekisteröitynyt:
    19.12.2011
    Viestejä:
    37
    Täällähän on paljon ohjelmointitaitoisia! Vieläpä sellaisia, jotka tekevät ohjelmia käsittämättömän kuulosilla kielillä. Vaikka edellisestä pähkinästä onkin vasta päivä, niin laitetaan nyt jo liikkeelle seuraava ni on taas mietittävää niille, jotka ton ekan on jo tehny, eikä jaksa miettiä siihen vielä parempia toteutustapoja:

    Luodaan 10 x 10 taulukko arvotuista numeroista välillä 0..99. Ohjelman pitää etsiä reitti vasemmasta yläkulmasta [0,0] oikeaan alanurkkaan [9,9] mahdollisimman edullista reittiä pitkin. Mahdollisimman edullisella reitillä tulee siis mahdollisimman pieni summa kuljetulle reitille.

    Ohjelma piirtää arvotun taulukon ja alle tuloksen kuljetusta reitistä:

    Reitti = [0,0] [0,1] [1,1] .. [9,9]
    Summa = 42
     

Jaa tämä sivu