Saturday, November 4, 2023

AI: Detecting phone number and email in messages

In e-commerce applications operating on a marketplace model, a significant challenge is the exchange of phone numbers and email addresses through messages between vendors and customers. This allows them to bypass the platform, resulting in a loss of commission revenue for the site. Users may employ inventive methods to evade standard detection algorithms that rely on regular expressions, such as spelling out numbers, e.g. "fivethreetwo" instead of "532". To develop a comprehensive list of such techniques, you could prompt ChatGPT with: 'I have a webpage with a messaging feature. I want to prevent the inclusion of phone numbers and emails in messages. What are some ways users might try to circumvent my safeguards?'

Thursday, April 13, 2023

Adventures with chatGPT

Recently I came across a surprising result with a short C++ code and asked GPT4 for guidance, it performed well:

Me: On visual studio 2022, when building in debug x86, why is the variable "a" printed as strange values like 4294967296 in the following c++ code: 

#include <stdio.h>
int main() {
    for (unsigned long long i = 0; i < 5; i++) {
        unsigned long long a = i;
        printf("i = %u, a = %llu\n", i, a);
    }
    getchar();
    return 0;
}

Thursday, March 23, 2023

Why are your grades important?

Below is the formula used by TÜBİTAK to rank and filter job applicants before an interview:

If the score that comes out of this equation is less than 3.2, you will not even be considered. 

The effect of CGPA on the score is constant and direct. A one-unit increase in CGPA results in an exact one-unit increase in the score, regardless of the value of x. Mathematically:

The effect of x (exam rank) on the score is non-linear, negative, and diminishes rapidly as x increases. Mathematically:

This means the score is highly sensitive to small changes in x when x is small (e.g., x=100), but becomes insensitive to changes in x when x is large. As your exam rank increases, CGPA becomes more important to differentiate you from others with similar exam ranks.

Here are the plots for two different regions, x = 100...1000 and x = 1000...50000:


Let’s say your Turkish university exam rank was 50,000. Then you would need a CGPA of at least 3.2 – 10,000 / 50,000 = 3.0 (75%) just to satisfy the minimum criteria, which might still not be enough. If  you can't make it to the interview, it doesn’t matter how good you are in other areas.

On the other hand, if your exam rank was 500, you wouldn’t need to worry about your CGPA, because 10,000 / 500 = 20.

As you can see, the university entrance exam rank has the greatest impact because it is a more objective criterion than CGPA, since the difficulty of earning good grades varies widely across universities. However, university entrance stage is long past for most of you, so now you should focus on your CGPA.

If your score is above 3.2, you are added to the the ranking list. For example, if five people are to be hired, typically the top 4×5 = 20 applicants (ranked by their scores) are selected for interviews. If, let's say, your score is 3.3 but there are more than 20 people with higher scores, you will still not be called for an interview.

If you make it to the shortlist, you move on to the interview stage, where your engineering, past projects and communication skills become more important than your CGPA. But to get the opportunity to demonstrate your skills, you need good grades.

To maximize your chances of getting job interviews, keep your CGPA high. If you exam rank is more than 20000, aim for a CGPA above 3.5. A minor/major in another field is not worth the effort. Do extra projects only after you have a very high CGPA.

27.10.2025: In the latest interview batch, 30 recent graduates were invited for 6 engineering positions. They were ranked according to the formula above, and the lowest score (the 30th candidate) was 4.2. A student with a CGPA of 3.7 and an exam rank of 40K had a score of 10K/40K + 3.7 = 3.95 and was not invited to the interview, since his score was less than 4.2. In this case, only a CGPA close to 4.0 would have placed him on the list.

Wednesday, December 28, 2022

Using scanf to get user input from console

In C, you can use scanf to get character input from console. However, if you do it multiple times, you will realize that pressing enter after the first scanf affects the next scanf call. This happens when you have a space after your prompt, e.g. printf("Choice: "); char c; scanf("%c"). Either don't put a space at the end of printf or use a space in scanf like so: scanf(" %c")

Friday, September 16, 2022

When is inheritance useful?

A major disadvantage of inheritance is not being able to follow the program flow by ctrl + clicking function calls due to some functionality being implemented in ancestor classes. Therefore, I prefer composition over inheritance whenever possible. The one case where inheritance shines is reusing workflows. Let's say all your child classes have a run() method that calls f1(), f2() and f2() in order, where f1, f2, f3 functions are implemented in child classes. If we move the run() method to the ancestor class, child classes would just call that run method, saving you from duplicating the f1, f2, f3 calls in each child.

Monday, September 5, 2022

Studying Algorithms and Data Structures Effectively

There are many ways to solve programming problems. The ideal solution is the one running the fastest and consuming the least amount of memory. The field of algorithms and data structures equips you with the tools to find the best solution. A good solution might run  a million times faster than a naive/brute force solution, which might be the difference between a successful and failed project. It has similarities to mathematics because mathematics always tries to find more concise formulae. For example you can find the sum of consecutive integers from 1 to n by summing each number one by one which has a time complexity of O(n). Or you could think a little more about the problem and observe that there are n/2 pairs of the value of n+1, yielding the famous Gauss formula of n/2*(n+1), which has a time complexity of O(1), i.e. the brute force method gets slower and slower as n increases while the formula always runs at constant time! See a similar Codility problem. A good solution is also environmentally friendly since it consumes less energy.

When studying algorithms and data structures, besides course material, I recommend solving the relevant leetcode questions. Start with the easy ones but note that if this is your first attempt at solving "easy" questions, they won't be easy at all, watch this video for a general approach. Don't just focus on the answer, analyze your solution process even after your solution passes all tests so that it really sinks in.

The good news is that once you solve easy questions, medium ones are not that difficult. The website NeetCode organizes problems nicely according to data structure type and difficulty, I personally use the NeetCode 150 group (see my notes). Python is a concise language to solve coding problems, this 26 minute video teaches you enough python for that. After you finish 29 easy questions on NeetCode 150, move to medium questions, and finally solve the hard ones. It will probably take a couple of months to solve all 150 questions. Besides strengthening you algorithms and data structures foundation, you also will have practiced for coding interviews.

If you want to practice more in a specific area, you can use chatGPT to generate additional questions/problems, e.g. "generate a medium level coding question related to trie data structure"

Visualizing algorithms: Visualgo

05.10.2025: For junior roles, consider this smaller set of 49 questions curated by Aman Manazir, designed to be completed in 8 weeks:

ARRAYS & HASHING
01 Easy Contains Duplicate
02 Easy Valid Anagram
03 Easy Two Sum
04 Medium Group Anagrams
05 Medium Top K Frequent Elements
06 Medium Valid Sudoku
07 Medium Product of Array Except Self
08 Medium Longest Consecutive Sequence

TWO POINTERS
09 Easy Valid Palindrome
10 Medium Two Sum II Input Array Is Sorted
11 Medium 3Sum
12 Medium Container With Most Water

SLIDING WINDOW
13 Easy Best Time to Buy And Sell Stock
14 Medium Longest Substring Without Repeating Characters
15 Medium Longest Repeating Character Replacement

STACK
16 Easy Valid Parentheses
17 Medium Min Stack
18 Medium Daily Temperatures

BINARY SEARCH
19 Easy Binary Search
20 Medium Find Minimum In Rotated Sorted Array
21 Medium Search In Rotated Sorted Array

LINKED LIST
22 Easy Reverse Linked List
23 Easy Merge Two Sorted Lists
24 Medium Reorder List
25 Medium Remove Nth Node From End of List
26 Easy Linked List Cycle
27 Medium LRU Cache

TREES
28 Easy Invert Binary Tree
29 Easy Maximum Depth of Binary Tree
30 Easy Diameter of Binary Tree
31 Easy Balanced Binary Tree
32 Easy Same Tree
33 Easy Subtree of Another Tree
34 Medium Lowest Common Ancestor of a Binary Search Tree
35 Medium Binary Tree Level Order Traversal
36 Medium Binary Tree Right Side View
37 Medium Count Good Nodes In Binary Tree
38 Medium Validate Binary Search Tree
39 Medium Kth Smallest Element In a Bst

HEAP / PRIORITY QUEUE
40 Easy Kth Largest Element In a Stream
41 Easy Last Stone Weight
42 Medium Kth Largest Element In An Array

GRAPHS
43 Medium Number of Islands
44 Medium Max Area of Island
45 Medium Clone Graph
46 Medium Pacific Atlantic Water Flow
47 Medium Surrounded Regions
48 Medium Course Schedule
49 Medium Course Schedule II

29.10.2025leetcode-75

Thursday, August 11, 2022

Leetcode notes

You can find solutions of Leetcode problems online. Sometimes my own solutions are more intuitive to me. Here I present my solutions that I find interesting in Python3 and my notes.