Monday, January 28, 2013

PDP 2013: The last chance

Α: Αναζητώντας Εξωγήινη Νοημοσύνη

Πρόβλημα:
Να αναπτύξετε ένα πρόγραμμα σε μια από τις γλώσσες του IOI το οποίο θα διαβάζει τις τιμές που αντιστοιχούν σε ένα σήμα και θα αναγνωρίζει τις χαρακτηριστικές συχνότητες. Μία τριπλέτα σε ένα σήμα είναι μία τριάδα τιμών του σήματος με τις εξής ιδιότητες: 
    (α) οι δύο ακραίες τιμές ισαπέχουν από τη μεσαία τιμή, και 
    (β) οι δύο ακραίες τιμές είναι ίσες μεταξύ τους και μικρότερες του μισού της μεσαίας τιμής.  
Η μεσαία τιμή μίας τριπλέτας μας δίνει τη χαρακτηριστική συχνότητα, η οποία ισούται με τη θέση της μεσαίας τιμής στο σήμα.
Αρχεία Εισόδου:
Τα αρχεία εισόδου με όνομα seti.in είναι αρχεία κειμένου με την εξής δομή: Έχουν ακριβώς δύο γραμμές. Η πρώτη έχει έναν ακέραιο αριθμό Ν (10 ≤ Ν ≤ 10.000), που αντιστοιχεί στο πλήθος των τιμών του σήματος που έχουμε καταχωρήσει. Η δεύτερη γραμμή έχει Ν ακέραιους αριθμούς χωρισμένους ανά δύο με ένα κενό διάστημα.
Αρχεία Εξόδου:
Τα αρχεία εξόδου με όνομα seti.out είναι αρχεία κειμένου με την εξής δομή: Η πρώτη γραμμή έχει έναν ακέραιο αριθμό Κ(0 ≤ Κ ≤ Ν). Ο αριθμός αυτός εκφράζει το πλήθος των χαρακτηριστικών συχνοτήτων που εντοπίστηκαν. Ακολουθούν Κ γραμμές, κάθε μια από τις οποίες έχει έναν ακέραιο αριθμό Μ, (2 ≤ Μ ≤ Ν-1). Ο αριθμός Μ εκφράζει μία χαρακτηριστική συχνότητα, δηλαδή τη θέση της μεσαίας τιμής της αντίστοιχης τριπλέτας μέσα στο σήμα (η αρίθμηση αρχίζει από το 1). Οι χαρακτηριστικές συχνότητες πρέπει να δίνονται σε αύξουσα σειρά. Αν σε μία χαρακτηριστική συχνότητα αντιστοιχούν περισσότερες τριπλέτες, η συχνότητα θα πρέπει να  εμφανίζεται μόνο μία φορά.


#include <stdio.h>
#define MAX 10000
#define DEBUG0

int N;
int Amp[MAX]; //input
bool isTriplet[MAX]; //result
int nTriplets;

int main() {
#ifndef DEBUG 
    freopen("seti.in", "rt", stdin);
    freopen("seti.out", "wt", stdout);
#endif

    //input
    scanf("%d", &N);
    for (int i=0; i<N; i++) {
        scanf("%d", &Amp[i]);
    }

    //find triplets
    for (int i=0; i<N; i++) {
        for (int j=1; i-j>=0 && i+j<N; j++) {
            if (Amp[i-j] == Amp[i+j] && Amp[i-j] < Amp[i]/2.) {
                //found triplet!
                isTriplet[i] = true;
                nTriplets++;
                break;
            }
        }
    }

    //output
    printf("%d\n", nTriplets);
    for (int i=0; i<N; i++) {
        if (isTriplet[i]) printf("%d\n",i+1);
    }
    return 0;
}

Β: Οι μυστικοί αριθμοί

Πρόβλημα:
Στο δείπνο που παρατίθεται κατά τη διάρκεια του φετινού πανελλήνιου συνεδρίου πληροφορικής παρευρίσκονται Ν επιστήμονες. Κάθε ένας έχει στο μυαλό του ένα θετικό φυσικό αριθμό, διαφορετικό από τους αριθμούς όλων των συναδέλφων του, τον οποίο κρατάει μυστικό.  Ο διοργανωτής του δείπνου θέλει να μοιράσει τους επιστήμονες σε ομάδες, αποτελούμενες από ένα ή περισσότερα μέλη, ούτως ώστε σε καμία ομάδα να μην υπάρχουν δύο επιστήμονες που ο μυστικός αριθμός του ενός να διαιρεί ακριβώς το μυστικό αριθμό του άλλου.  Είναι αδύνατο να μάθετε τους μυστικούς αριθμούς των επιστημόνων.  Με πολύ κόπο, καταφέρνετε να βρείτε μερικές δυάδες επιστημόνων που είναι φίλοι και για τους οποίους γνωρίζετε με βεβαιότητα ότι ο μυστικός αριθμός του πρώτου διαιρεί ακριβώς το μυστικό αριθμό του δεύτερου. Μπορείτε να υπολογίσετε τον ελάχιστο αριθμό ομάδων που θα χρειαστεί να φτιάξει ο διοργανωτής του δείπνου;
Αρχεία εισόδου:
Τα αρχεία εισόδου με όνομα scidinner.in είναι αρχεία κειμένου με την εξής δομή:  Στην πρώτη γραμμή περιέχουν δύο φυσικούς αριθμούς Ν και Μ χωρισμένους με ένα κενό διάστημα (1 ≤ M ≤ Ν ≤ 1.000.000),  όπου Ν το πλήθος των επιστημόνων και M το πλήθος των δυάδων των φίλων. Θεωρούμε ότι οι επιστήμονες είναι αριθμημένοι από 1  έως και Ν. Κάθε μία από τις επόμενες Μ γραμμές περιέχει δύο φυσικούς αριθμούς xi και yi χωρισμένους με ένα κενό διάστημα (1 ≤ xi , yi ≤ Ν), που ορίζουν μία δυάδα φίλων:  γνωρίζουμε ότι ο μυστικός αριθμός του επιστήμονα xi διαιρεί ακριβώς το μυστικό αριθμό του επιστήμονα  yi.  Δε θα υπάρχουν δύο δυάδες με το ίδιο yi. 

Αρχεία εξόδου: 
Τα αρχεία εξόδου με όνομα scidinner.out είναι αρχεία κειμένου με την εξής δομή:  Έχουν ακριβώς μία γραμμή που περιέχει έναν ακέραιο αριθμό Κ (1 ≤ Κ ≤ Ν).  Ο αριθμός αυτός εκφράζει το ελάχιστο πλήθος ομάδων επιστημόνων που πρέπει να φτιάξει ο διοργανωτής του δείπνου.

 #undef DEBUG  
 #define DEBUG0  
   
 #ifdef DEBUG  
 #define debug(...) fprintf(stderr, __VA_ARGS__)  
 #else  
 #define debug(...) do ; while(0)  
 #define NDEBUG  
 #endif  
   
 #include <assert.h>  
 #include <stdio.h>  
 #include <limits.h>  
 #include <vector>  
 #include <queue>  
 #include <algorithm>  
 using namespace std;  
   
 #define MAX 1000001  
 int N,M;  
 vector<int> graph[MAX];  
 int memo[MAX]; // memorization  
 int fmax(int n); //recursive function  
   
 int main() {  
 #ifndef DEBUG  
   freopen("scidinner.in", "rt", stdin);  
   freopen("scidinner.out", "wt", stdout);  
 #endif  
   
   scanf("%d %d", &N, &M);  
   for (int i=1; i<=N; i++) { memo[i] = 1; }//no children by default  
   
   //read nodes  
   int from, to;  
   for (int i=0; i<M; i++) {  
     scanf("%d %d", &from, &to);  
     graph[from].push_back(to);  
     memo[from] = 0; //has children to check  
     assert(from!=to &&  
         from>0 && from <=N &&  
         to >0 && to  <=N );  
   }  
   
   
   int totalmax = 1; //totalmax = minteams ;)  
   for (int i = 1; i <= N; i++) {  
     memo[i] = fmax(i);  
     totalmax = max(totalmax, memo[i]);  
   }  
   printf("%d", totalmax);  
   
   return 0;  
 }  
   
 int fmax(int u) {  
   if (memo[u] != 0) return memo[u];  
   int res = 1;  
   for (int j=0; j<graph[u].size(); j++) {  
     int v = graph[u][j];  
     res = max(res, fmax(v)+1);  
   }  
   assert(res>1);  
   return res;  
 }  




Wednesday, December 5, 2012

Αιτίες άνοδου Χρυσής Αυγής

Είναι προφανές ότι αυτή η άνοδος της Χρυσής Αυγής δεν έγινε σε κοινωνικό και ιδεολογικό κενό. Η συρρίκνωση της επιτυχίας της στην απλοϊκή εξίσωση «οικονομική κρίση = άνοδος του φασισμού» συσκοτίζει το φαινόμενο και φυσικά δεν βοηθά στην αντιμετώπισή του. Μπορεί η κρίση και η ανασφάλεια λειτουργεί ως θρυαλλίδα αυτών των φαινομένων, αλλά δεν είναι η συνολική εξήγηση. Υπήρχαν και υπάρχουν υπόγεια ρεύματα στην ελληνική κοινωνία που αποτυπώθηκαν στις προηγούμενες εκλογές. Υπάρχει ο ρατσισμός, στον οποίο δεν είμαστε άνοσοι, όπως νομίζαμε, η συνωμοσιολογία που θέλει το σύμπαν να απεργάζεται το κακό της χώρας, και υπάρχει η βαθιά άγνοια για τη δημοκρατία και τον φασισμό. Αυτά πρέπει να αντιμετωπίζονται από μια κοινωνία, είτε υπάρχει κρίση είτε όχι.

Πάσχος Μανδραβέλης, Medium.gr

Tuesday, October 16, 2012

Μεγιστος - Ελάχιστος με απόλυτη τιμή

Να ένα αλγοριθμικό trick:
Μπορείς να βρεις τον μικρότερο και το μεγαλύτερο από δύο αριθμούς, μόνο με χρήση της απόλυτης τιμής.



Πως δουλεύει;
Ας πάρουμε για παράδειγμα την πρώτη σχέση. Έστω δύο αριθμοί x, y έτσι ώστε x < y:



Sunday, October 14, 2012

Δημοκρατία

Αυτό που δεν διδάχθηκε ο ελληνικός λαός, ούτε από το σχολείο, ούτε από τα ΜΜΕ, ούτε από τα κόμματα, είναι η αξία της δημοκρατίας. Δεν έμαθε ότι οι κανόνες συμβίωσης που έχουμε μπορεί να μην είναι τέλειοι, αλλά στη δημοκρατία ο αγώνας επιτρέπεται και συνεχίζεται. Οτι η ανομία, ανεξαρτήτως κινήτρων, καταλήγει πάντα στη φαλκίδευση των δικαιωμάτων των αδύναμων. Οτι οι κακοί νόμοι δεν καταργούνται με την παράβασή τους, αλλά με την παραγωγή καλύτερων νόμων. Οτι ο λόγος -ακόμη και ο προσβλητικός για κάποιους- δεν μπορεί να θεωρείται παραβατικός, αλλά κάθε παράβαση στην πράξη πρέπει να δικάζεται και να τιμωρείται. Οτι η ανοχή στη μικρή παραβατικότητα οδηγεί στη μεγαλύτερη, για να καταλήξουμε σε πογκρόμ ανθρώπων. Είναι δύσκολο να πεισθούν οι άνθρωποι ότι η αργόσυρτη και γεμάτη δικλίδες ασφαλείας δημοκρατική διαδικασία είναι μακροπρόθεσμα η πιο παραγωγική για τη λύση των προβλημάτων. Αποδείχθηκε όμως στις πρόσφατες εκλογές πως ούτε ο πολιτικός στραβισμός πείθει.
Απόσπασμα από το άρθρο «Τα άκρα και οι συμψηφισμοί» του Πάσχου Μανδραβέλη. Δημοσιεύτηκε στην εφημερίδα «Καθημερινή» στις 14.10.2012

Monday, September 24, 2012

Περί πολιτικών πεποιθήσεων

Όπως πιθανότατα ξέρεις, εσύ που διαβάζεις αυτό εδώ το μπλογκ εδώ και καιρό, δεν είμαι κομμουνιστής (μετά τα 14, τουλάχιστον -αλλά τότε δεν με ήξερες, γιατί δεν υπήρχε ίντερνετ). Δεν πιστεύω ότι όλοι οι άνθρωποι είναι ίδιοι και ότι πρέπει να αμείβονται το ίδιο και να μην υπάρχει ιδιοκτησία. Πιστεύω ότι η ανθρώπινη φύση είναι εξ’ ορισμού ατελής και ότι για να μπορέσουν οι άνθρωποι να συνυπάρξουν και να μοιραστούν τη Γη με κάποιον τρόπο που μοιάζει αντικειμενικά δίκαιος, και ταυτόχρονα να έχουν κίνητρα για να αναπτύξουν φιλοδοξίες και όνειρα και να πάνε την ανθρωπότητα παρακάτω, θα πρέπει να επινοήσουν ένα κριτήριο αυστηρά μη-ανθρώπινο. Ο καπιταλισμός είναι το πιο επιτυχημένο οικονομικό σύστημα στην ανθρώπινη ιστορία, και χάρη σ’ αυτόν σήμερα οι άνθρωποι έχουν υγιή δόντια και κινητά τηλέφωνα και, παρά τις φρικτές του ατέλειες, παραμένει καλύτερος από άλλα, πιο ανθρωποκεντρικά συστήματα, που προτιμούν την ισότητα απ’ την ελευθερία. 

 Το κείμενο αυτό γράφτηκε από το Θοδωρή Γεωργακόπουλο. Μπορείς να το διαβάσεις ολόκληρο εδώ: http://www.georgakopoulos.org/2012/09/al-mirqab/

Thursday, July 5, 2012

XDA Update Checker in Python

I have been checking this url allot lately (last six months). Its the development thread of Android 4: Ice Scream Sandwich for my HTC Desire. So I wrote a small python script to do it for me.
It uses regular expression to separate the title and compares it with the previous one, saved in a text file, to determine if it's new. Here is the code:
URL = 'http://forum.xda-developers.com/showthread.php?t=1355660'
SAVE_FILE = 'ics'
REG_EXP = '<title>.+?\] '

import urllib2, re, time, webbrowser

#### Load page
print "Loading page..."
html_content = urllib2.urlopen(URL).read()
   
#### Search for version info
try:
   match = re.findall(REG_EXP, html_content)[0]
   match = re.findall('\[.+', match)[0] #remove <title>
except IndexError:
   match = "ERROR! Cant match regular expression:" + reg_exp

### Load SaveFile
try: old = open(SAVE_FILE).readline()
except IOError: old = 'file not found'

if old == match:
  ## No new version
   print "Old Version:", match;
   time.sleep(5) #wait and close
else:
  ## Update found!!   
   open(SAVE_FILE, 'w').write(match)
   raw_input("UPDATE! \t"+ match + "\n\nPress any key to open url.") #print and pause
   webbrowser.open_new_tab(URL)

This is a more recent version that is simpler and can check multiple urls. It just prints out the topic title though, without checking if it's new.
URLs = [
        'http://forum.xda-developers.com/showthread.php?t=1766550',
        'http://forum.xda-developers.com/showthread.php?t=1355660',
        ]

import urllib2
for URL in URLs:
   
   #### Load page
   #print "Loading page: " + URL
   html = urllib2.urlopen(URL).read()
   

   begin = html.find('<title>')
   end   = html.find('- xda', begin)
   title = html[begin+len('<title>'):end].strip()

   print title
   #print '\n'
raw_input("Press any key")

Saturday, May 26, 2012

Γενέθλια και η χαμένη Τετάρτη

Πλησιάζουν τα γενέθλια μου! Την Πέμπτη είναι, στις 31 Μαΐου. Πέμπτη;! Μα αφού πέρσι ήταν Πέμπτη Τρίτη. Νόμιζα πως κάθε χρόνο πάνε μια μέρα μπροστά. Κανονικά έπρεπε να είναι Παρασκευή Τετάρτη. 

ΑΑΑ! είναι δίσεκτο έτος φέτος. Χάθηκε μία μέρα, η 28η Φεβρουαρίου!.
Χμμ.., ας το ψάξουμε λίγο περισσότερο.
Μάλλον έχει να κάνει με το ότι φέτος το έτος ηταν δίσεκτο(2012).

Γιατί κάθε κάθε ημερολογιακή μέρα πάει χρόνο μία μέρα της ευδομάδας μπροστά;
Είναι απλο. Ο κανονικός χρόνος(ή Common year) έχει 365 μέρες = 52 εβδομάδες και 1 μέρα (Ευκλείδια διαίρεση: 365 = 52 * 7 + 1). Αυτή η μία μέρα είναι που μετακινεί τα γενέθλια μου.
Δίκαιο ακούγεται πάντως. Έτσι όλοι μπορούν να έχουν γενέθλια σε όλες τις μέρες του χρόνου σε 7 χρόνια.

Σε πια περίπτωση όμως θα τα γενέθλια μου θα ήταν σταθερά;
Για να συμβαίνει αυτό χρειάζεται η παραπάνω ευκλείδια διαίρεση να δίνει υπόλοιπο μηδεν. Αυτό είναι αδύνατον αφού το 7 δεν έχει διαιρέτες.

Τι θα γινόταν όμως αν ο χρόνος είχε, παραδείγματος χάρην 366 μέρες; Τίποτα το ιδιαίτερο.
Αν όμως ταυτόχρονα η εβδομάδα είχε 6 μέρες (έτσι ώστε το δύο να είναι διαιρέτης του 6) θα συνέβενε κάτι ενδιαφέρον. Τα γενέθλια μου θα έπεφταν μόνο στις 3 από τις 6 μέρες της εβδομάδας.
Με 367 μέρες θα έπεφταν μόλις σε 2. 

Μόνο αν η εβδομάδα είχε, για παράδειγμα, 6 ημέρες, στα δίσκετα έτη, που ο χρόνος έχει 366 ημέρες, τα γενέθλιά μου θα έμεναv ακίνητα. (366 = 61 * 6 + 0).

Υ.Γ.: Το αρχικό ποστ είχε μια σειρά(>1) από λογικά λάθη.

Monday, May 21, 2012

Υπολογισμός Μεσοπαράλληλης

Έστω δύο παράλληλες ευθείες ε1, ε2 και η μεσοπαράλληλη τους ε3.
Αν Μ1(x1,y1), M2(x2,y2), Μ3(x3,y3) τυχαία σημεία των ε1, ε2, ε3 αντίστοιχα, ισχύει:
(1)        (2) 
Επειδή το Μ3 είναι μέσο των Μ1, Μ2 για οποιαδήποτε Μ1, Μ2, Μ3 (Θεώρημα Θαλή).

Ομώς Μ1, Μ2, Μ3  ε1, ε2, ε3 αντίστοιχα.
Άρα ισχύει yi = λx + βi, (i=1, 2, 3) και αντικαθιστώντας τα yi η (2) γίνεται:



και τελικά:



Αν δεν υπάρχει λ (a.k.a. οι ευθείες είναι κατακόρυφες), μπορεί να χρησιμοποιηιεί η (1).

Saturday, May 19, 2012

Βουλή των Εφήβων 2012

Όχι, δυστηχώς δεν κληρώθηκα. Δεν είχα προετοιμαστεί με κανένα τρόπο, ούτε είχα αρχίσει ακόμα φροντιστήριο στην Έκθεση. Αυτά βέβαια δεν είχαν σημασία αφού οι βουλευτές επιλέγονται με κλήρωση...
http://efivoi.gr/

 Γιατί θέλετε να συμμετέχετε στη Βουλή των Εφήβων; (50 λέξεις)
Πιστεύω πως η Βουλή των Εφήβων είναι σαν θεσμός, έχει πολλά να προσφέρει στους συμμετέχοντες μαθητές. Τους δίνει την ευκαιρία να σκεφτούν, να εκφραστούν, να κρίνουν και να κριθούν. Βοηθάει ακόμα σημαντικά στην καλλιέργεια της θετικής στάσης των νέων απέναντι στα "κοινά", κάτι πολύ σημαντικό σήμερα, που Ελλάδα έχει ανάγκη από ικανούς ηγέτες.

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

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

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

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

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

Monday, May 14, 2012

[DRAFT]Codejam 2012: Round 1B

This was the first year I participated in Google Codejam. I passed the Qualification round which was far more difficult than I expected. I didn't pass the first round.

However I did write some interesting code to solve Problem C. It's in Python.
'''Output: Second line is one subset. Third line is another subset with the same sum.
####
For the big input, you cannot find the solution in time. 
However, you can make the script read a part of the input set and hope you will still ger a solution. 
Set slice_index to a value between 100 and 500 to do it.  Use None to read the whole input.
'''
slice_index = 50

import itertools

def solve(S):
    #S: the set of numbers 
    
    subsets = (c
               for length in range(1,len(S)+1)
               for c in itertools.combinations(S,length)
               )

    #finds a good subset pair
    result = ((i,j)
              for i,j in itertools.combinations(subsets,2)
              if sum(i)==sum(j)
              )
    

    print "Case #%d:" % (test_case) #, no_new_line
    try:
        a, b = next(result)
        print ' '.join(map(str, a))
        print ' '.join(map(str, b))
    except StopIteration:
        print 'Impossible'

#Input
fin = open('big.in', 'r')
fin.readline()
for test_case, line in enumerate(fin, 1):
    line = map(int, line.split())[1:slice_index]
    solve(line)
Here is the Contest Analysis.

Sunday, May 13, 2012

Dropquest 2012 Chapter 1

So, I have some code that I want to save somewhere and I thought this blog is a good place to post it. I wrote it to solve Chapter 1 if this years Dropquest.
Dropquest is an online challenge, organized by dropbox. The rewards are GBs of free lifetime space in dropbox.

It's written in Python. I am getting pretty fluent after taking CS373: Programming A Robotic Car, a free online course by Udacity.

digitized_numbers = lambda n: (
    map(int, x) for x in
    map(list, map(str,range(pow(10,n-1),pow(10,n)))))
'''digitized_numbers(5) returns all the 5 digit numbers (23546, 23547 etc.) 
  in the form [...[2,3,5,4,6],[2,3,5,4,7]...]''' 
print next( d  
    for d in digitized_numbers(5)
#d[0], d[1] etc. are the digits.
if d[0] * d[1] == 24                #1: 1st * 2nd = 24 
    if d[3] == d[1] /2                    #2: 4th = 2nd / 2
    if d[4] + d[3] == d[0] + d[2]  #3: 5th + 4th = 1st + 3rd
    if sum(d) == 26                      #4
    if len(set(d)) is not len(d)    #5
            )
'''
Instructions:
1: The product of the first two digits is 24.
2: The fourth digit is half of the second digit. 
3: The sum of the last two digits is equal to the sum of the first and third digits.  
4: The sum of all the digits is 26.  
5: Not all the digits are unique.
'''

Wednesday, May 4, 2011

Firefox: Tabs next to the url bar, IE style

Last week, I was thinking how much valuable space is wasted, by having such a wide location bar in my browser. So I googled about it, and moved my tabs next to the location bar, just like Internet Explorer. Here is how I did it.

  • Right click on the blue space next to the tabs and select "Customize...". 
  • Drag the location bar next to your tabs. (I prefer to have it it on the left.)
  • Drag all the items you need (like the Previous-next buttons) next to the locatiob bar. 
  • Click "Done".
  • Right click again and deselect "Navigation Toolbar".

  • Now you may need to resize the location bar. To do so hold WindowsKey and press R. Write in %appdata%\Mozilla\Firefox\Profiles and press Enter.
  • Open your profile folder(xxxx.default). 
  • Create a new folder and name it "chrome". Inside the new folder, create a text file and name it "userChrome.css".
  • Inside the "userChrome.css" file write:
    #urlbar, #urlbar-container {
    min-width: 350px !important;
    max-width: 350px !important; }
  • Change 350 if you want a bigger or a smaller url bar. 
  • Save and restart firefox.



Here is a batch file to do the job for you: (run and restart firefox)
cd %appdata%\Mozilla\Firefox\Profiles
REM run "dir" command and save the outputd profile forder in %profile%
FOR /F "tokens=1 delims=" %%A in ('dir /b') do SET profile=%%A
cd %profile%
if not exist chrome mkdir chrome
cd chrome
echo #urlbar, #urlbar-container {  >> userChrome.css
echo min-width: 350px !important;  >> userChrome.css
echo max-width: 350px !important;} >> userChrome.css

FXChrome theme works nicely with the above trick.

Tuesday, May 3, 2011

Hello world

This is my first post!