גם אני הייתי שם בראיון והשאלות שכתבת הופיעו בראיון אך הוא הוסיף עוד כמה:
1.א. מערך עם מספרים מ 1 עד N, מוציאים מספר כלשהו מהמערך, איך תגלה מה המספר שהוציאו?
סכום סידרה חשבונית פחות מהסכום של כל המספרים שנשארו במערך, אפשר גם בcounting sort אך נצטרך o(n) מקום.
ב. מה תעשה אם יוציאו עוד מספר, כלומר הוציאו שני מספרים מהמערך?
יש לנו משוואה אחת שאנחנו יודעים את הסכום של שני המשתנים - סכום של סידרה חשבונית פחות מהסכום של כל המספרים במערך יתן לנו סכום של שני המספרים שהוציאו. אנחנו צריכים משוואה נוספת אז נקח ונכפול את כל המספרים מ1 ועד N ונכפול את כל המספרים שנמצאים במערך ונקבל שני משוואות, אחת של סכום ואחת של כפל ויש לנו שני נעלמים.
ג. ואם אי אפשר להשתמש בכפל?
אנחנו יודעים את הסכום של שני מספרים אז נוריד מהמערך את כל המספרים הגדולים מהסכום ואז נקבל מערך קטן הרבה יותר ועליו נעשה חיפוש בינארי רק על חצי מהמספרים שיכולים להרכיב את הסכום.
2. 4 אנשים באירגון רוצים לחשב את המשכורת הממוצעת שלהם אך לא יכולים להגיד אחד לשני את המשכורת של כל אחד מהם, איך הם יעשו את זה?
אחד יגריל מספר ויגיד אותו לשני, השני יוסיף למספר זה את המשכורת שלו ויעביר לשלישי, השלישי יוסיף את המשכורת שלו עד שזה יגיע לראשון והראשון פשוט יחסיר את המספר שהגריל ויוסיף את המשכורת שלו ויחלק ב4 יקבל ממוצע.
3. יש כפר ובו יש נשים בוגדות בבעלים שלהם(לפחות אישה אחת קיימת), כל בעל יודע לגבי כל הנשים האחרות אם הם בוגדות או לא אבל לא לגבי אישתו הוא לא יודע וכל בעל שמגלה שאישתו בוגדת בו יכול להרוג אותה בבוקר. כמה יריות יהיו ביום רביעי אם יהיו?
בואו נניח שיש רק בוגדת אחת אז הבעל שאישתו בוגדת בו יודע שיש לפחות אחת אבל הוא לא מכיר עוד נשים שבוגדות אז זאתי אישתו והוא הורג אותה ביום הראשון. אם יש שני נשים בוגדות אז שני הבעלים יחכו ליום השני ואז יהיו שני יריות כי בלילה הראשון לא יהיו יריות כי כל בעל מכיר אישה בוגדת אחת אבל כשהוא לא שומע יריה בלילה הראשון הוא מבין שיש עוד בוגדת והוא מכיר רק אחת אחרת אז זאתי אישתו אז ככה זה יהיה, ביום השלישי שלוש יריות ביום רביעי 4 אם יש 4 נשים בוגדות.
4. יש לך שני שקים ויש לך 50 כדורים לבנים ו50 כדורים שחורים, איך תחלק את הכדורים בין שני השקים כך שההסתברות להוציא לבן תהיה הגבוהה ביותר?
שם בשק אחד כדור לבן אחד ובשק השני את ה50 כדורים השחורים וה49 כדורים לבנים וככה אתה מרוויח אוטומטית 0.5 על השק עם הכדור הלבן ועוד 0.5*)49/100(
5. יש 100 כדים עם משקה בתוכם, אחד מהם מורעל, איך תגלה את המורעל בוודאות עם כמה שפחות עבדים?
מסתבר שאפשר עם 7 עבדים. עבד אחד יכול להבדיל בין 2 כדים, שני עבדים בין 4 כדים, שלוש בין 8 וככה הלאה, יוצא 7 עבדים.
ההתרשמות שלי מהחברה ממש טובה, נראים אחלה אנשים ואחלה חברה לגדול בה, התחום מאוד מעניין, אפילו שלא התקבלתי, היה להם תהליך ממש מהיר, יום חמישי היה לי ראיון עם ה5 שאלות ההגיון האלו, לאחר מכן נתנו מבחן ביתי ללא הגבלת זמן, רצו שאני יבנה classifier בפייתון, שמקבל רשומות של פרטים על אנשים ויסווג לפי כל הפרמטרים השונים האם הם מרוויחים מעל 50 אלף או פחות(training set) ואז יבדוק לפי הtest set שבאמת המכונה מאומנת ולבסוף לשלוח מייל עם התשובה, עשיתי להם תוך יומיים, התקשרו בשני והזמינו לראיון hr ומנכ"ל, עשיתי את שנהם, הבטיחו שיחזירו תשובה עד הסופ"ש ולבסוף החזירו תשובה שלילית בראשון אבל לפחות החזירו, מכבד אותם.
זה הקוד שכתבתי, מקווה שיעזור:
from sklearn import svm
from sklearn.feature_extraction import DictVectorizer
import smtplib
from email.mime.text import MIMEText
class ClassifierAssignment:
def buildSet(self, location):
trainingSet = []
target = []
fin = open(location,'r')
for line in fin:
line = line.strip()
line_list = line.split(',')
record = {}
record["age"] = float(line_list[0])
record["workclass"] = line_list[1]
record["fnlwgt"] = float(line_list[2])
record["education"] = line_list[3]
record["education-num"] = float(line_list[4])
record["marital-status"] = line_list[5]
record["occupation"] = line_list[6]
record["relationship"] = line_list[7]
record["race"] = line_list[8]
record["sex"] = line_list[9]
record["capital-gain"] = float(line_list[10])
record["capital-loss"] = float(line_list[11])
record["hours-per-week"] = float(line_list[12])
record["native-country"] = line_list[13]
if not "<" in line_list[14]:
target.append(1)
else:
target.append(0)
trainingSet.append(record)
return trainingSet, target
def trainMachine(self, data, target):
dv = DictVectorizer()
x = dv.fit_transform(data)
clf = svm.LinearSVC()
clf.fit(x, target)
return clf,dv
def testMachine(self, clf, testSet,dv, target2):
x = dv.transform(testSet)
testsRun = 0
testsPassed = 0
for t in x:
if clf.predict(t) == target2[testsRun]:
testsPassed = testsPassed + 1
testsRun = testsRun + 1
success = (100 * testsPassed / testsRun)
return success, 100-success
def sendEmail(self, success, failure):
text = '''
'''%(success, failure)
msg = MIMEText(text, 'plain')
msg['Subject'] = ""
me =''
msg['To'] = me
conn = smtplib.SMTP('smtp.gmail.com:587')
conn.starttls()
conn.login('', '')
try:
conn.sendmail(me, me, msg.as_string())
finally:
conn.close()
def main():
# building classifier assignment object
ca = ClassifierAssignment()
#building the training set file
data, target = ca.buildSet("sets/adualt.data")
#training the machine
clf,dv = ca.trainMachine(data, target)
#building the test set file
testSet, target2 = ca.buildSet("sets/adualt.test")
#testing the machine
success, failure = ca.testMachine(clf, testSet,dv, target2)
#send answer via email
ca.sendEmail(success, failure)
if __name__ == "__main__":
main()