Visualizzazione post con etichetta programmazione. Mostra tutti i post
Visualizzazione post con etichetta programmazione. Mostra tutti i post

domenica 28 marzo 2010

Quanti triangoli ci sono?

Mi è capitato spesso, girando per il web, di trovare dei giochetti matematici. Un esempio è il classico gioco dei triangoli. Quanti triangoli ci sono in questa immagine? Chiunque, almeno una volta nella vita, ha provato a risolverlo contando il numero di triangoli, spesso perdendone qualcuno per strada. Ma se uno volesse trovare un modello matematico per la risoluzione di questo enigma? Fa come me, prende carta e penna e si mette a studiare i vari casi, prendendo prima un triangolo piccolo per poi aumentare la sua grandezza. Io sono riuscito a trovare una soluzione studiando il triangolo a pezzi. Ora non voglio annoiare nessuno con la matematica, ma chi fosse curioso, può guardarsi il codice java qui sotto, per provare ad intuire la soluzione che ho trovato. E, perché no, per proporne una di migliore e più elegante (perché sicuramente esiste).


public class Triangle {
private int l;

public Triangle(int l) {
this.l = l;
}

public int n(int l, int i) {
int n = 0;
if (i == 1)
n = 2*l - 1;
if (i > 1) {
if (l <= (2*i - 1))
n = l - (i - 1);
else
n = 2*(l - i) - (i - 2);
}
return n;
}

public int resolve() {
int result = 0;
for (int l = this.l; l > 0; l--) {
for (int i = 1; i <= l; i++) {
result += n(l, i);
}
}
return result;
}

public static void main(String[] args) {
Triangle triangle = new Triangle(1000);
System.out.println(triangle.resolve());
}
}

sabato 6 marzo 2010

GO: operazioni matematiche da terminale

Dopo che sono venuto a conoscenza dell'esistenza del linguaggio di programmazione di Google, ho cominciato a studiarlo con calma, per conoscere le sue caratteristiche e le librerie principali. Il linguaggio è interessante e si può dire essere una via di mezzo tra l'efficienza del C e il divertimento del Python (d'altronde, io conosco solo questi due linguaggi :-)). Ad ogni modo, mi sono divertito a scrivere uno script per effettuare operazioni matematiche da terminale. Lo posto!

package main



import "flag"
import "os"
import "strconv"


const NEWLINE string = "\n"


var (addFlag = flag.Bool("a", false, `add a and b`);
subFlag = flag.Bool("s", false, `subtract b to a`);
mulFlag = flag.Bool("m", false, `multiply a and b`);
divFlag = flag.Bool("d", false, `divide b from a`);
helpFlag = flag.Bool("help", false, `this help`))


func add(a, b int) int {
return a + b
}


func subtract(a, b int) int {
if a >= b {return a - b}
return -1
}


func multiply(a, b int) int {
return a * b
}


func divide(a, b int) int {
if b != 0 {
return a / b
}
return -1
}


func main() {
flag.Parse()
a, errA := strconv.Atoi(flag.Arg(0))
if errA != nil {a = -1}
b, errB := strconv.Atoi(flag.Arg(1))
if errB != nil {b = -1}

if *addFlag {
os.Stdout.WriteString(strconv.Itoa(add(a, b)) + NEWLINE)
} else if *subFlag {
os.Stdout.WriteString(strconv.Itoa(subtract(a, b)) + NEWLINE)
} else if *mulFlag {
os.Stdout.WriteString(strconv.Itoa(multiply(a, b)) + NEWLINE)
} else if *divFlag {
os.Stdout.WriteString(strconv.Itoa(divide(a, b)) + NEWLINE)
} else if *helpFlag {
flag.PrintDefaults()
}
} 


Questo script usa la libreria flag per parsare le opzioni del programma, strconv per la conversione degli interi a stringhe e viceversa e di os per la gestione dell'output. Il programma è sicuramente migliorabile, però con questo esempio volevo dimostrare che, anche con poca esperienza di programmazione, con poche ore si possono ottenere buoni risultati! Per le istruzioni di compilazione vi rimando al sito ufficiale del linguaggio.
Ciao!

sabato 27 febbraio 2010

GO, il linguaggio di programmazione secondo Google

Google ne ha fatta un'altra delle sue, e questa volta rivolgendosi allo sviluppatore: GO, un nuovo linguaggio di programmazione derivato dal C. Un linguaggio certamente ancora grezzo, ma che è incredibilmente espandibile, la cui sintassi vuole essere moderna, ma allo stesso tempo efficace. Ecco il suo hello world!

     package main

  import "fmt"

  func main() {
      fmt.Print("Hello, World!!\n");
  }

Per ora vi lascio al sito, dove ci sono già tutorial di installazione e spiegazioni della sintassi!
Ciao!

martedì 2 febbraio 2010

Cenni di wxPython - Cosa sto imparando

Ciao a tutti. :-)
In questi giorni mi sto cimentando con wxPython, una splendida libreria grafica per il linguaggio di programmazione python. Ebbene, ho deciso, dopo aver studiato solo le basi, di scrivere un programmino che riconoscesse una password.  Al terzo errore, il programma si deve chiudere. Lo script che è venuto fuori è questo:
#!/usr/bin/env python
import wx
PASSWORD = "12345"


class PswdRecognizer(wx.App):
    def OnInit(self):
        frame = MainFrame("Password Recognizer")
        frame.Show(True)
        self.SetTopWindow(frame)
        return True
        
class MainFrame(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, title=title, size=(200, 66))
        
        # Variables
        self.errors = 0
        
        # Panel
        panel = wx.Panel(self)
        
        # TextCtrl
        self.line = wx.TextCtrl(panel, style=wx.TE_PASSWORD, size=(200, 30))
        font = wx.Font(12, wx.SWISS, wx.NORMAL, wx.NORMAL, wx.NORMAL, u"Droid Sans")
        self.line.SetFont(font)
        self.line.SetFocus()
        
        # Buttons
        ok = wx.Button(panel, wx.ID_OK, label="OK", pos=(-1, 31))
        ok.SetDefault()
        self.Bind(wx.EVT_BUTTON, self.OnOK, ok)
        
    def OnOK(self, e):
        if self.line.GetValue() == PASSWORD:
            self.errors = 0
            dlg = wx.MessageDialog(self, "Right!", "Password", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
        else:
            self.errors += 1
            if self.errors == 3:
                dlg = wx.MessageDialog(self, "Third Error.\nBye!",
                                        "Password", wx.ID_OK)
                dlg.ShowModal()
                dlg.Destroy()
                self.Close()
            else:
                dlg = wx.MessageDialog(self, "NO!!!!!", "Password", wx.OK)
                dlg.ShowModal()
                dlg.Destroy()
        self.line.SetFocus()
            
if __name__ == "__main__":
    app = PswdRecognizer()
    app.MainLoop() 

Il programma è molto semplice, e utilizza i concetti di Frame, App, TextCtrl, MessageDialog e Panel. La guida (in inglese cui sto attingendo le informazioni è questa.
Buon wxPyhton!

lunedì 11 gennaio 2010

Linux - Installare e configurare l'ambiente devkitPro + PAlib

Questo post interesserà gli sviluppatori di homebrew per Nintendo DS, perché riguarda l'installazione e la configurazione di devkitPro con le PAlib, famose librerie per DS. Dato che l'installazione è molto dettagliata per Windows, ma poco per Linux, ho deciso di scrivere questa sorta di guida per quelli che, come me, amano Linux e si trovano a disagio a programmare su Windows.
Bene, procediamo!

Per prima cosa è necessario procurarsi alcuni archivi:
PAlib 080823devkitARM r21dswifi 0.3.4libnds 20071023libfat-nds 20070127Cercate di usare queste versioni, perché le ultime release di devkitARM non sono compatibili con le PAlib. Fate attenzione!

Ora che avete gli archivi, create nella vostra home (o dove più vi piace) una cartella "devkitPro" (i doppi apici, ovviamente, non servono!). Al suo interno scompattate devkitARM, create una cartella "libnds" e all'interno di essa scompattate libnds, dswifi e libfat-nds. Infine, tornando nella cartella devkitPro, scompattate le PAlib.

Bene! Fin qui avete potuto lavorare anche solo con il mouse, ma nel prossimo passaggio consiglio vivamente di utilizzare il terminale (è anche più appagante!).
Aprite il terminale e digitate

sudo nano ~/.bashrc

e aggiungete in questo file queste righe

export DEVKITPRO=/home/username/devkitPro
export DEVKITARM=$DEVKITPRO/devkitARM
export PAPATH=$DEVKITPRO/PAlib/lib

ovviamente la prima di queste righe cambia a seconda di dove avete creato la cartella devkitPro.
Salviamo e chiudiamo nano e, sempre da terminale, digitiamo

source ~/.bashrc

per usare le variabili create. OK! Se tutto è stato seguito ordinatamente, devkitPro funzionerà! Proviamo a compilare un esempio di programma, HelloWorld! Lo faremo da terminale!
Rechiamoci nella cartella del progetto:

cd ~/devkitPro/PAlib/examples/Text/Normal/HelloWorld

e utilizziamo il comando make:

make

Se ottenete una schermata simile a questa

arm-eabi-g++ -g -mthumb-interwork -mno-fpu -L/home/andrea/devkitPro/PAlib/lib/lib -Wl -specs=ds_arm9.specs main.o -L/home/andrea/devkitPro/PAlib/lib/lib -lpa9 -L/home/andrea/devkitPro/libnds/lib -lfat -lnds9 -ldswifi9 -o build.elf
Nintendo DS rom tool 1.36 - Oct 23 2007 23:03:47
by Rafael Vuijk, Dave Murphy, Alexei Karpenko
built ... HelloWorld.ds.gba
dsbuild 1.21 - Oct 23 2007
using default loader

tutto è andato a buon fine, e nella cartella del progetto troverete i file HelloWorld.nds e HelloWorld.ds.gba!
Avete installato devkitPro con successo! Ora imparate a usare le PAlib! Buona programmazione!