Facebook Hacker Cup 2 Round: my Card Game Solution

FacebookHackerCup 2 Round

This is my solution to the problem of Card Game, work fine for small input… but when the value of k grows (k>500 ) my code spent a lot of time.

The bottleneck it’s about the iteration to find the max in the array…

So i hope you can optimize it 😀

[sourcecode language=”python”]

import sys
import math
from collections import Counter
import re
import itertools

in_file = open(sys.argv[1],"r")
exp = in_file.read()
in_file.close()

inputFile= exp.split("\n")

index=[]
values=[]

def findsubsets(S,m):
return set(itertools.combinations(S, m))
a=[]
flavio=1
for i in range(1, len(inputFile)-1) :
values=[]
allsub=[]
if(i%2) :
# index.append(inputFile[i])
n,k=map(int,inputFile[i].split())
else :

values= map(int,inputFile[i].split())

# Optimization , not call a function
allsub=itertools.combinations(values,k)

my_sum=0

for f in allsub:

my_max=max(f)
my_sum += (my_max)

if(my_sum>=1000000007):
my_sum = my_sum -1000000007

print "Case #"+str(flavio)+": "+str(my_sum)

flavio +=1

[/sourcecode]

GitHub

https://github.com/flaviopace/FacebookHackerCup2_CardGameSolution

Facebook Hacker Cup Qualification 2013: le mie soluzioni in Python

Hacker Cup Facebook

Quest’anno sono riuscito a partecipare (me ne sono ricordato :P) all’Hacker Cup che Facebook organizza ogni anno. I problemi per le qualificazioni erano 3 e di seguito vi posto le mie soluzioni scritte in python.

Il terzo problema (Find the min) non e’ difficile, sono riuscito a risolverlo ma il tempo che ci impiega il mio algoritmo e’ molto al di sopra di quello che mette a disposizione Facebook. In realta’ bastava guardare un po output della lista che utilizzavo per memorizzare i valori per capire che da un certo punto in poi si ripeteva ( per cui non serviva tutta la potenza di calcolo che avevo immaginato 😛 ). In poche parole per gli indici della liste pari a 2k+1, i valori si ripetevano… me ne sono accorto troppo tardi ed ho finito solo i primi due step 😀

1 – Beautiful strings  (20 points)

beautiful_stringstxt.txt

outputFile.txt

[sourcecode language=”python”]import sys
import math
from collections import Counter

in_file = open(sys.argv[1],"r")
exp = in_file.read()
in_file.close()

a= exp.split("\n")

b=[]
c=[]

values=[]

d={}
u={}

for i in range(1, len(a)-1) :

b.append(a[i].lower()[::-1])

flavio=1
for i in b:
d={}

values=[]
num=26
find=1
numSum=0
for k in range(0,len(i)):

#d[str(i[k])] = i.count(i[k])
if(str(i[k]).isalpha()):# or str(i[k])==’!’):
d[str(i[k])] = i.count(i[k])

for k in range(0,len(i)):
if (str(i[k]) in d):
# print i[k] + " num "+ str(num) + " # " + str(d[i[k]])
numSum += num*d[i[k]]
values.append(d[i[k]])
del d[i[k]]
num -=1

values_sorted= sorted(values, reverse=True)

num=26
numSum =0
for item in range(len(values_sorted)):

numSum += num * values_sorted[item]
num -=1
print "Case #" + str(flavio)+ ": " +str(numSum)
flavio +=1
[/sourcecode]

2 – Balanced Smileys  (35 points)

balanced_smileystxt.txt

outputBalanced.txt

[sourcecode language=”python”]import sys
import math
from collections import Counter
import re

in_file = open(sys.argv[1],"r")
exp = in_file.read()
in_file.close()

b=[]
c=[]

values=[]

d={}
u={}

for i in range(1, len(a)-1) :

b.append(a[i].lower())

replacements = {":(",":)"}

for i in range(0,len(b)) :
#b[i]= b[i].replace(

b[i]= re.sub(r’\([^)]*\)’, "", b[i])

b[i]= b[i].replace(‘:(‘,”)
b[i]= b[i].replace(‘:)’,”)

def isBalanced(strInput):
"""Validate if an input string is having balanced bracket pairs
this includes bracket ordering. i.e a round bracket must be closed
by a round bracket. Emtpy strings are treated as balanced."""
#if strInput:
# list of all bracket kinds, in paired tuples
brackets = [ (‘(‘,’)’), (‘[‘,’]’), (‘{‘,’}’)]
# define fake constants – python does not support the concept of constants
kStart = 0
kEnd = 1
# internal stack used to push and pop brakets in the input string
stack = []

for char in strInput:
for bracketPair in brackets:
if char == bracketPair[kStart]:
stack.append(char)
elif char == bracketPair[kEnd] and len(stack) > 0 and stack.pop() != bracketPair[kStart]:
return False

if len(stack) == 0:
return True

#return False

flavio=1
for i in range(0,len(b)) :
if(isBalanced(b[i])):
print "Case #" + str(flavio) + ": YES"
else:
print "Case #" + str(flavio) + ": NO"

flavio +=1

[/sourcecode]

3 – Find the Min  (45 points)

find_the_mintxt.txt

outputFindTheMin.txt

[sourcecode language=”python”]import os, sys

f = open(sys.argv[1], ‘r’)

T = int(f.readline())

def next(ary, start):
j = start
l = len(ary)
ret = start – 1
while j < l and ary[j]:
ret = j
j += 1
return ret

for t in range(T):
n, k = map(int, f.readline().strip().split(‘ ‘))
a, b, c, r = map(int, f.readline().strip().split(‘ ‘))

m = [0] * (4 * k)
s = [0] * (k+1)
m[0] = a
if m[0] <= k:
s[m[0]] = 1
for i in xrange(1, k):
m[i] = (b * m[i-1] + c) % r
if m[i] < k+1:
s[m[i]] += 1

p = next(s, 0)
m[k] = p + 1
p = next(s, p+2)

for i in xrange(k+1, n):
if m[i-k-1] > p or s[m[i-k-1]] > 1:
m[i] = p + 1
if m[i-k-1] <= k:
s[m[i-k-1]] -= 1
s[m[i]] += 1
p = next(s, p+2)
else:
m[i] = m[i-k-1]
if p == k:
break

if p != k:
print ‘Case #%d: %d’ % (t+1, m[n-1])
else:
print ‘Case #%d: %d’ % (t+1, m[i-k + (n-i+k+k) % (k+1)])
[/sourcecode]

Riferimenti:

https://www.facebook.com/hackercup/problems.php?round=185564241586420

Correct Solution Find The Min

http://facebook.stackoverflow.com/questions/14536384/python-too-slow-of-large-inputs

 

GitHub

https://github.com/flaviopace/FacebookHackerCupQualification2013

 

FeedRSS… seduto comodamente sulla poltrona

Eccomi finalmente a scrivere il mio primo articolo per “Vita da Studente” e l’argomento scelto come pezzo inaugurale riguarda i feedRSS.

Tanti lettori nè hanno sentito parlare, tanti di voi avranno visto questo simbolo…

 

 

ma a cosa serve praticamente?

 

Gli RSS sono un semplice modo per “raccogliere informazioni” da diverse pagine su Internet, aiutando il navigatore a seguire gli aggiornamenti delle pagine preferite avvertendolo di eventuali aggiornamenti. Un ottimo modo per non perdersi nelle news dei nostri siti web che visitiamo ogni giorno, visto che tante e tante volte ci colleghiamo per controllare che ci siano nuovi articoli o nuovi aggiornamenti. Grazie ai feedRSS oggi non perdere più tempo, ci collegheremo solo quando ci saranno nuovi aggiornamenti.

Ora che abbiamo imparato cosa sono i feedRSS e a cosa possono essere utili, vediamo come possono essere gestiti. Come gli altri due autori di “VitaDaStudente”, anch’io sono utente “con la mela morsicata” e posso usufruire di un’applicazione di nome: Mail.

La maggior parte di noi la utilizza per scaricare e leggere la posta elettronica da i nostri numerosi account in giro su i vari domini. Però Mail non si ferma qui, ci dà una mano anche per quanto riguarda i feedRSS in quanto è capace di fare da lettore, nel senso che ci avverte con una notifica ogni qual volta c’è un aggiornamento da una pagina in cui abbiamo sottoscritto un feedRSS. Ma vediamo praticamente come sia possibile tutto ciò.

Mettiamo il caso che ci  vogliamo iscrivere ad una pagina di Facebook dove si parla di un argomento a cui siamo interessati; nella colonna di sinistra ci sono una serie di link come nell’immagine d’esempio

Basta cliccare con il tasto destro del mouse su “Get Update via RSS” (per chi ha FB in versione inglese) oppure su “Ricevi aggiornamenti tramite RSS” e poi su “Copia link”.

Ora lanciamo Mail e clicchiamo prima su “Archivio” e poi su “Aggiungi feedRSS”

incolliamo l’indirizzo copiato poco prima e poi clic su “Aggiungi”. Basta attendere giusto qualche istante e dopo di che avremo una lista con tutti gli ultimi aggiornamenti.

 

I feedRSS non sono utilizzati solamente da Facebook, ma da quasi la totalità dei siti web che offrono news, dai siti web dei quotidiani ai portali che offrono notizie sulle nuove tecnologie, fino alla pagina degli avvisi dell’università, sono praticamente dappertutto e da oggi in poi non servirà più alzarsi dalla poltrona per cambiare canale, ma comodamente seduti potrete cambiare canale e vedere cosa succede sugli altri canali.

Il procedimento descritto è valido su tutte le pagine che sono “attrezzate” per inviare feedRSS così da tenerci sempre aggiornati …

Per chi volesse può leggere da questo link ( l’esempio del telecomando è roba loro 😛 ) un pò di approfondimenti sull’argomento.

 

 

Chat di Facebook su Desktop

Partiamo dal presupposto che ormai Facebook è entrato a piè pari nella nostra routine quotidiana, informatica e non. A tal proposito voglio dare un consiglio a quanti, come me, lo utilizzano per un unico motivo: cazzeggiare con i compagni di università (in primis, altrimenti non mi sarei proprio iscritto) e chattare, seppur sporadicamente. In effetti successe anche all’inizio del mio percorso universitario con MSN Messenger, la cui iscrizione feci solo ed unicamente perché Flavio, il direttore/capo del nostro blog 😛 (ti prego di non licenziarmi se ho scritto questa “baggianata” rispetto ai tuoi articoli, ma ti prometto che la recensione su iLife ’11 è quasi pronta e la pubblico appena possibile!!! :-D), lo usava come unico strumento di comunicazione “internettiano”, dal mio canto invece, ho sempre preferito Skype (ma questa è un’altra storia ndr)!! Non sopportando il fatto di dover tenere aperto il browser internet (nel mio caso Safari) sulla Home di FB per poter comunicare con i miei contatti (non tutti concepiscono Skype e MSN Messenger per l’instant messaging), ero alla ricerca di un software che mi permettesse di avere tutti gli account di instant messaging direttamente dal desktop. Mi imbattei in Adium, ottimo client multi-protocollo, leggero ed altamente personalizzabile grazie ai suoi Xtras, scaricabili gratuitamente dal sito del software stesso. E’ bastato aggiungere il nuovo account dal menù Adium/Preferenze/Account:

2 secondi per collegarsi al servizio e il gioco era fatto. Che goduria, niente più link da leggere, niente continuo refresh della Home, niente più rallentamenti del browser durante la navigazione e, soprattutto, potevo attivare la chat senza aprire la pagina FB…una mano santa!!!

Tutto questo fino a 2 o 3 giorni fa, non ricordo con precisione, quando, cambiando la pwd di FB, ho dovuto ri-settare l’account anche su Adium, ma niente da fare, la connessione con il servizio non riusciva e così ho abbandonato l’idea di utilizzare la chat di FB. Or ora invece mi sono messo alla ricerca e ho trovato questo: http://www.facebook.com/sitetour/chat.php, in effetti FB ha bloccato l’accesso dai software, obbligandoli a far passare tutte le connessioni verso il loro servizio di messaggistica istantanea, attraverso un server Jabber (sempre per il discorso sulla privacy che non sto qui a raccontarvi perché di sicuro ne avrete la testa piena). Quindi hanno creato la pagina linkata poc’anzi, per chi, come il sottoscritto, non desidera sapere cosa hanno mangiato a cena, o pranzo, i propri contatti, ma vuole solo essere “reperibile” via desktop! Spero che qualcuno, leggendo questo post, si converta all’utilizzo puramente comunicativo di FB, tralasciando la mania ossessiva di post, applicazioni, parla con… ecc. ecc. che sinceramente ci stanno rendendo alquanto ridicoli a tutto il mondo (sì, perché internet è Mondiale, sappiatelo!!). Nel caso in cui utilizzaste Adium, ecco come fare per risolvere i vostri problemi: