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.
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 ).
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ä.
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;
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>
: 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
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:
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
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)
}
}
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ä: