Vanha 28.12.11, 10:36   #1 (linkki)
 
Rekisteröitynyt: 12/2011
Viestejä: 37
Ohjelmointipähkinä

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 .

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?

Viimeinen muokkaaja Pikivirta; 17.01.12 11:01.
  Vastaa lainaten
Vanha 28.12.11, 10:39   #2 (linkki)
 
Rekisteröitynyt: 12/2011
Viestejä: 37
Pähkinä 1

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.

Viimeinen muokkaaja Pikivirta; 28.12.11 11:10.
  Vastaa lainaten
Vanha 28.12.11, 10:57   #3 (linkki)
 
Rekisteröitynyt: 06/2009
Viestejä: 2938
Lainaus:
Alkuperäinen kirjoittaja Pikivirta Näytä viesti
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ä.

Vastauksen kieli siis on vapaa, mutta mielellään kerrotaan mistä kielestä on kyse.
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 ).
  Vastaa lainaten
Vanha 28.12.11, 10:58   #4 (linkki)
 
Rekisteröitynyt: 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.
__________________
Que?

Viimeinen muokkaaja Para; 28.12.11 11:13.
  Vastaa lainaten
Vanha 28.12.11, 10:58   #5 (linkki)
 
Rekisteröitynyt: 05/2002
Viestejä: 3029
Päivänkieli on C:

Lainaus:

void piirrapydamid( int syvyys )
{
if( syvyys > 0 )
{
int current = 0;
piirra(syvyys, current);
}
}

void piirra( int syvyys, int& current )
{
++current;
for( int i = 0; i < current; ++i )
{
printf("*");
}
printf("\n");
if( current != syvyys )
{
piirra( syvyys, current );
--current;
for( int i = 0; i < current; ++i )
{
printf("*");
}
printf("\n");
}
}

Tsiisös mitä tää tekee noille sisennyksille..
__________________
\,,/(><)\,,/

Viimeinen muokkaaja Teekoonääs; 29.12.11 08:39. Syy: vielä ääkköset pois myös :-)
  Vastaa lainaten
Vanha 28.12.11, 11:04   #6 (linkki)
 
Rekisteröitynyt: 08/2000
Viestejä: 938
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>";
}

?>
__________________
""Hang in there, I'll get some help!""
""Hirttäydy sinne, haen apua!""
  Vastaa lainaten
Vanha 28.12.11, 11:09   #7 (linkki)
 
Rekisteröitynyt: 12/2011
Viestejä: 37
Lainaus:
Alkuperäinen kirjoittaja Zeikko Näytä viesti
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 ).
Voitais varmaan sopia, ettei tähtimäärää nähdä kun kerran ryppäässä.
  Vastaa lainaten
Vanha 28.12.11, 11:14   #8 (linkki)
 
Rekisteröitynyt: 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;
  Vastaa lainaten
Vanha 28.12.11, 11:23   #9 (linkki)
 
Rekisteröitynyt: 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
  Vastaa lainaten
Vanha 28.12.11, 12:51   #10 (linkki)
 
Rekisteröitynyt: 02/2002
Viestejä: 1278
Python (2.x):
Koodi:
def tahdet(n):
    return '\n'.join('*' * x for x in range(1, n) + range(n, 0, -1))

print tahdet(5)
  Vastaa lainaten
Vanha 28.12.11, 12:51   #11 (linkki)
 
Rekisteröitynyt: 10/2001
Viestejä: 877
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>
__________________
http://twitter.com/zvona
  Vastaa lainaten
Vanha 28.12.11, 13:28   #12 (linkki)
 
Rekisteröitynyt: 02/2003
Viestejä: 1058
Perlillä
Koodi:
$d = 5;
for(1..$d*2) {
    print "\n";
    if($_ < $d+1) {
        for(1..$_) { print "*"; }
    } else {
        for(1..($d*2-$_)) { print "*"; }
   }
}
  Vastaa lainaten
Vanha 28.12.11, 13:32   #13 (linkki)
 
Rekisteröitynyt: 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
  Vastaa lainaten
Vanha 28.12.11, 13:45   #14 (linkki)
 
Rekisteröitynyt: 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);
    }
  Vastaa lainaten
Vanha 28.12.11, 13:55   #15 (linkki)
 
Rekisteröitynyt: 02/2010
Viestejä: 39
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);
        }
    }
}
  Vastaa lainaten
Vanha 28.12.11, 14:09   #16 (linkki)
 
Rekisteröitynyt: 08/1999
Viestejä: 704
Pöh, python ratkaisu kerkesikin jo aiemmin
__________________
Muroilua vuodesta '99
  Vastaa lainaten
Vanha 28.12.11, 14:36   #17 (linkki)
 
Rekisteröitynyt: 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:
  Vastaa lainaten
Vanha 28.12.11, 15:38   #18 (linkki)
 
Rekisteröitynyt: 12/2000
Viestejä: 5742
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
  Vastaa lainaten
Vanha 28.12.11, 16:29   #19 (linkki)
 
Rekisteröitynyt: 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
* 
** 
*** 
**** 
***** 
**** 
*** 
** 
*

Viimeinen muokkaaja Tukemon; 28.12.11 16:44.
  Vastaa lainaten
Vanha 28.12.11, 16:35   #20 (linkki)
 
Rekisteröitynyt: 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
*
**
***
****
*****
****
***
**
*
  Vastaa lainaten
Vanha 28.12.11, 18:27   #21 (linkki)
 
Rekisteröitynyt: 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);
  Vastaa lainaten
Vanha 28.12.11, 19:03   #22 (linkki)
 
Rekisteröitynyt: 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
*
**
***
****
*****
****
***
**
*
  Vastaa lainaten
Vanha 28.12.11, 19:38   #23 (linkki)
 
Rekisteröitynyt: 08/2002
Viestejä: 250
Tentun C++ ja immoT:n Perl -koodit on kyllä molemmat niin kaunista katseltavaa.
  Vastaa lainaten
Vanha 28.12.11, 19:42   #24 (linkki)
 
Rekisteröitynyt: 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.
__________________
#define sysop GOD
#define reality NULL
  Vastaa lainaten
Vanha 28.12.11, 20:19   #25 (linkki)
 
Rekisteröitynyt: 12/2011
Viestejä: 37
Pähkinä 2

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
  Vastaa lainaten
Vastaa

Hae ketjusta:

Laajennettu haku

Hyppää alueelle:




Kaikki ajat ovat GMT +2. Kello on nyt 03:03.