Κάτι randomizers σε Golang

Απλά ήθελα να κάνω λίγο show off…

Οδηγίες: Φτιάχνετε ένα directory rpg στο src, ανοίγετε στον code editor το rpg.go και κοπυπάστα.

Δεν υπόσχομαι τίποτε, αλλά μπορεί να έχω κάτι  βασισμένο στα παρακάτω προσεχώς…

Η ιδέα ξεκίνησε από το απλό αλλά ιδιοφυές σύστημα που περιγράφεται εδώ:

 

Edit: Τώρα που το βλέπω έχει λαθάκια, αλλά το βασικό δουλεύει.

 

// rpg project rpg.go
package rpg

/*
	An utility RPG aid package containing dice rollers, character classes and
	whatever caught my fancy.
	Use at your own risk.
*/

import (
	"math/rand"
	"time"
)

type RPGActor struct {
	Name  string
	Descr string
	Attr  map[string]int
	Skill map[string]int
}

/*
//must try that and see how to make it

func (myActor RPGActor) MakeRandom () RpgActor {
	var mNames = [5]string {"Ulfric","Eiric","Odo","Frigg", "Elspeth"}
	newActor=make(RPGActor)
}
*/

func RollzInit() {
	//initialize random generator with current time
	rand.Seed(time.Now().UTC().UnixNano())
}

func FudgeTranslate(roll int) string {
	//Translate a fudge number to a fudge verbal
	var verbals = [9]string{"Horrible", "Terrible", "Bad", "Mediocre", "Fair", "Good", "Great", "Superb", "Legendary"}
	if roll >= -4 && roll <= 4 {
		return verbals[roll+4]
	} else {
		return "Invalid number"
	}
}

func FudgeRoll() int {
	//a standard fudge dice roll, four dice
	finalres := 0
	for i := 1; i <= 4; i++ { 		finalres = finalres + rand.Intn(3) - 1 	} 	return finalres } func DiceRoll(sidez int) int { 	//generic dice roll, sidez is the number of sides for the dice 	if sidez > 0 {
		return (rand.Intn(sidez) + 1)
	} else {
		return 0
	}
}

func SoloRPGAnswer() string {
	//Tiny Solitary soldiers Solo RPG answers
	var answers = [6]string{"No and", "No", "No But", "Yes but", "Yes", "Yes And"}
	return answers[rand.Intn(6)]
}

func SoloRpgTwist() string {
	//Tiny Solitary soldiers Solo RPG Twists
	//the following should become iotas in a separate type, but I'll take them as
	//they are for now, because, honestly I want to run something on Go

	var resource = [6]string{"NPC", "PC", "Organization", "Physical Event", "Emotional Event", "Item"}
	var actionz = [6]string{"appears", "alters location", "helps hero", "hinders hero", "changes goal", "Ends scene"}
	return resource[rand.Intn(6)] + " " + actionz[rand.Intn(6)]
}

 

 

Advertisements

Αυτή η παλιά άσκηση με τα δυαδικά δέντρα…

Το κλασσικό σορτάρισμα με δυαδικό δέντρο σε Golang.

Ναι, η test case είναι αυτή και ναι, την εμπνεύστηκα απο αυτό το σκέτς που καταλάβατε.

package main

import (
 "fmt"
 "strings"
 )

type TreeNode struct {
 myText string
 lnode *TreeNode
 rnode *TreeNode
 }

func AddLeaf(x *TreeNode, myStr string) {
 var newNode TreeNode
 if x.myText > myStr {
 if x.lnode == nil {
 newNode = TreeNode{myText: myStr}
 x.lnode = &newNode
 } else {
 AddLeaf(x.lnode, myStr)
 }
 } else {
 if x.rnode == nil {
 newNode = TreeNode{myText: myStr}
 x.rnode = &newNode
 } else {
 AddLeaf(x.rnode, myStr)
 }

}

}

func PrintSort(x *TreeNode) {
 if x.lnode != nil {
 PrintSort(x.lnode)
 }
 fmt.Println(x.myText)
 if x.rnode != nil {
 PrintSort(x.rnode)
 }
 }

func main() {
 var mytree TreeNode
 wordlist := strings.Split("ΑΕΤΟΣ ΑΔΡΑΧΤΙ ΛΙΜΕΝΟΦΥΛΑΚΑΣ ΝΥΧΟΚΟΠΤΗΣ ΜΠΡΕΛΟΚ ΑΝΕΜΟΓΚΑΣΤΡΙ ΑΒΕΣΣΑΛΩΜ ΙΣΤΙΟΠΛΟΟΣ ΧΩΡΙΣΤΡΑ", " ")

mytreecur := &mytree
 mytreecur.myText = wordlist[0]
 for i := 1; i < len(wordlist); i++ {
 AddLeaf(mytreecur, wordlist[i])
 }

PrintSort(mytreecur)

}

Σκονάκια

Η προγραμματιστική άσκηση ήταν κάτι που με τσίγκλισε. Τον τελευταίο καιρό προσπαθώ να κάνω κάτι ταρζανιές λίγο περίεργες (περιλαμβάνουν κάμποσο CSS, ολίγη Javascript, μια μυρωδιά HTML και πολύ-πολύ μακαρονικό κώδικα), οπότε, όταν απομακρύνομαι απο το χάος, προσπαθώ να παίξω με άλλα πραγματάκια. Ας πούμε Python…  ή Go.

Λοιπόν με αυτή την Go έπαθα ότι με το Mass Effect. Της έριξα μια ματιά στην αρχή, δε μου έκανε κούκου, την παραμέρισα, παπαρίστηκα με διάφορα άλλα άσχετα, και λίγο καιρό μετά, την ξαναείδα με φρέσκο μάτι και πολύ με άρεζε. Αλλά, παρασύρομαι, είμαι και σε ηλικία που αρχίζει ο γερμανός και σου παίρνει τα μυαλά, οπότε, ας μπούμε στο θεμα.

Η άσκηση ήταν κατά τα φαινόμενα απλή. Θυμάστε το Πυθαγόρειο Θεώρημα από το Λύκειο; «Το τετράγωνον της υποτεινούσης ισούται με το άθροισμα των τετραγώνων των δύο κάθετων πλευρών«; Ελπίζω να μην κάνω summon τον LAMAG αυτή τη στιγμή...  Γενικά ο αριθμός που αντιστοιχεί στο τετράγωνο της υποτείνουσας δεν έχει σα ρίζα ακέραιο αριθμό, πράγμα που πολύ εσκότισεν τον Πυθαγόρα μόλις το πήρε χαμπάρι. Όμως, σε κάποιες, άρκετες περιπτώσεις, τυχαίνει.  Να, π.χ.  To Τρίγωνο με πλευρές 3 και 4 μονάδων έχει υποτείνουσα 5 μονάδες:

path4165

Αυτή λοιπόν η τριάδα (3,4,5) λέγεται Πυθαγόρεια τριάδα. Η άσκηση μας ζητάει να βρούμε τη μία και μοναδική τριάδα (α,β,γ) όπου α+β+γ=1000.

Ούπς!

Η πρώτη μου ιδέα ήταν να δω αν υπάρχει κάτι αλγεβρικό. Αλλά απέχω μια ζωή από το Λύκειο και το Πανεπιστήμιο και με έπιασε απελπισία. Οπότε, η πρώτη μου απόπειρα σε Python ήταν το ακόλουθο αίσχος:

squares={i:i*i for i in range(1,500)}
invsquares={squares[i]:i for i in squares}
for i in range (1,500):
    for j in range(i,500):
        if (i*i+j*j) in invsquares:
            k=invsquares[(i*i+j*j)]
            if i+j+k==1000: print (i,j,k)

Είναι νομίζω ψιλοσαφές τι κάνω, και ζητώ συγγνώμη για τυχόν ανατριχίλες που νιώσατε. Ίσως θα μπορούσα να κάνω και τα for..next comprehensions, αλλά βιαζόμουνα. Δεν έχει σημασία, μερικές φορές σημασία έχει να βγάλεις κώδικα και αποτέλεσμα γρήγορα, και μετά να ανησυχείς για το πόσο έξυπν@ θα φανείς και πόσα comprehension θα δέσεις σε αλυσίδα.

Απλό, λιτό, κατανοητό, αλλά… είμαι μόλις μισή βδομάδα με την Go, και δεν το έχω και τόσο στα arrays. Τι να κάνουμε λοιπόν… τι να κάνουμε;

Ιδέα. Μια συνάρτηση που να βρίσκει την ακέραια ρίζα ενός ακεραίου (αν αυτή υπάρχει). Οπότε, κρατάμε το for loop και απλά, αντί να ψάχνουμε το λεξικό, βλέπουμε επι τόπου αν έχουμε πυθαγόρεια τριάδα.

Οπότε, έχοντας φτιάξει προηγουμένως ένα πρωτοτυπάκι σε Python, έφτιαξα το ακόλουθο προγραμματάκι σε  Go:

package main

import "fmt"

func intSqrt(x int) int {
 var result=-1
 if (x==0 || x==1) {
 result=x
 } else {
 llim,ulim:=0,x
 not_found:=true
 var csr int
 csr=x/2
 for not_found {
 if csr*csr==x {
 not_found=false
 result=csr
 } else if csr*csr>x {
 ulim=csr
 csr=(ulim+llim)/2
 } else {
 llim=csr
 csr=ulim+llim/2
 }
 if ulim-1<=llim {not_found=false} 
 }
 
 }
 return result
}

func main() {
 var a,b,c int
 for i:=1;i<=500;i++ {
 for j:=i;j<=500;j++{
 k:=intSqrt(i*i+j*j)
 if k!=-1 {
 a=i
 b=j
 c=k
 if (a+b+c==1000) {fmt.Println("Η πυθαγόρεια τριάδα με άθροισμα 1000 είναι η: ",a,b,c)}}
 }
 }
 }

Είναι θλιβερό, είναι γάμησέ τα, αλλά την Πυθαγόρειο τριάδα τη βρήκε μια χαρούλα.

Ποια γλώσσα είναι καλύτερη;

Εξαρτάται, αλλά βρήκα ότι μου αρέσει πιο πολύ η σαφήνεια και η περιεκτικότητα της Python. Βέβαια, αν θέλω ασφάλεια, ταχύτητα και compiled κώδικα, εννοείται ότι θα πάω σε Go.

Περί αριστεροχειρίας

Ας το κάνω σαφές. Δε μισώ τους αριστερόχειρες. Έχω φίλους αριστερόχειρες, καλούς φίλους μάλιστα και πιστεύω ότι κάποιοι από αυτούς είναι εξαιρετικά παιδιά. Υπάρχουν και το σέβομαι. Μακριά από το τετράδιό μου κι ας γράφουν όπως θέλουν.

Ωστόσο, νομίζω ότι η κοινωνία μας -και ο καπιταλισμός, εν γένει- προωθεί την αριστεροχειρία υπερβολικά. Δεν φτάνει που οι κομφορμιστές επιστήμονες και οι ειδικοί την αναγνωρίζουν σαν φυσιολογική -που δεν είναι, πώς να το κάνουμε;- αποτρέπουν και τους γονείς από το να προσπαθούν να τη διορθώσουν και να εξασφαλίσουν στο παιδί τους μια φυσιολογική ζωή, χωρίς δυσκολίες και διακρίσεις. Κάναμε μια κακή συνήθεια και ένα κακό lifestyle προστατευόμενο είδος. Μα ο γονιός ξέρει καλύτερα από όλους τι χρειάζεται το παιδί του! Καταπατείται το δικαίωμα του γονιού να προσφέρει κάτι καλύτερο στο παιδί του.

Φυσικά και η αριστεροχειρία είναι ανωμαλία, σοβαρότατη μάλιστα. Είναι επιστημονικά αποδεδειγμένο ότι συνδέεται με ψυχολογικά προβλήματα, καθώς επίσης και με μία σειρά σοβαρών προβλημάτων υγείας και αμφιβόλων πλεονεκτημάτων. Αποτελεί δε μύθο ότι οι αριστερόχειρες είναι πιο ευφυείς ή πιο δημιουργικοί από τους δεξιόχειρες. Επιπλέον δε, οι αριστερόχειρες προσηλυτίζουν τα παιδιά τους στην ανωμαλία, καθώς τα παιδιά τους έχουν μεγάλη πιθανότητα να γίνουν αριστερόχειρες.

Μου κινεί την περιέργεια γιατί οι επιστήμονες δεν αντιδρούν. Το πιθανότερο είναι ότι το κίνημα της πολιτικής ορθότητας τους ασκεί τρομοκρατία και λογοκρισία. Η μεταμοντέρνα χαοτική σκέψη και ο φεμιναζισμός υπονομεύουν το θάρρος της γνώμης των επιστημόνων με αποτέλεσμα φυσικές αλήθειες να λογοκρίνονται επειδή δεν είναι πολιτικώς ορθό.

Το ακόμα χειρότερο. Τις προάλλες είδα ειδικό κατάστημα ειδών για αριστερόχειρες! Ο καπιταλισμός δεν ορρωδεί προ ουδενός. Εμπορευματοποιεί τις διαφορές μας για το δικό του όφελος. Τόσο καιρό οι αριστερόχειρες χρησιμοποιούσαν τα φυσιολογικά εργαλεία και εξαρτήματα, τα οποία ήταν και ένα έναυσμα για να εγκαταλείψουν τις προβληματικές τους συνήθειες και να ζήσουν μια φυσιολογική ζωή. Τώρα η ανωμαλία κανονικοποιείται.

Σε μια σοσιαλιστική κοινωνία, δε θα υπήρχαν αριστερόχειρες. Ότι και αν τους προκαλούσε, θα είχε διορθωθεί με βάση τις αρχές του διαλεκτικού, επιστημονικού υλισμού και όλοι θα χρησιμοποιούσαν τα ίδια, επιστημονικά μελετημένα αγαθά. Ο άνθρωπος, στο σώμα του, θα υλοποιούσε το διαλεκτικό υλισμό. Το δεξί επιδέξιο χέρι είναι η θέση, το αριστερό αδύναμο και υποστηρικτικό η αντίθεση και η φυσιολογική δεξιοχειρία η σύνθεση των αντιθέτων. Αλλά ας μην πλατειάζω.

Τι θα δούμε μετά; Θα υποχρεώσουν κι εμάς να χρησιμοποιούμε εργαλεία για αριστερόχειρες; Θα μας αναγκάσουν να γράφουμε από δεξιά προς τα αριστερά; Θα τρυπήσουν τα μπουκάλια και θα βουλώσουν οι γυναίκες~; Θα βγεί σοκοφρέτα χωρίς γλουτένη~; Θα παίρνει πίπες ο θεότεκνος Jaal~; Που θα φτάσει αυτό το πράμα, σας ερωτώ~;

Δεν μιλάω από τη σκοπιά κάποιου θρησκόληπτου. Μιλάω καθαρά από τη σκοπιά του υλιστικού ορθολογισμού και χρησιμοποιώ επιστημονικά επιχειρήματα. Ωστόσο δεν μπορώ να μην παρατηρήσω ότι έστω και διαστρεβλωμένη, η παραδοσιακή απόρριψη της αριστεροχειρίας είναι κατά βάσην ορθή και οφείλεται σε μια εμπειρική και φυσική σοφία την οποία πρέπει να αντιμετωπίσουμε με σεβασμό και να ακολουθήσουμε.

 

Πολυξένη Οικονόμου-Εξαγοράρη