Showing posts with label Python Coding Challenge. Show all posts
Showing posts with label Python Coding Challenge. Show all posts

Thursday, 29 January 2026

Python Coding challenge - Day 994| What is the output of the following Python Code?

 


Code Explanation:

1. Defining the Base Class

class Base:

A class named Base is defined.

This class will be callable because it defines __call__.

2. Defining __call__ in Base
    def __call__(self, x):
        return x + 1


__call__ allows objects of Base (or its subclasses) to be called like a function.

It takes one argument x.

Returns x + 1.

Example:

Base()(3) → 4

3. Defining the Child Class
class Child(Base):

Class Child inherits from Base.

It automatically gains access to Base.__call__.

4. Overriding __call__ in Child
    def __call__(self, x):
        return super().__call__(x) * 2

This method does two things:

Calls the parent class’s __call__ using super():

super().__call__(x)


Multiplies the result by 2.

5. Creating an Object
c = Child()

An instance c of class Child is created.
Since Child defines __call__, c is callable.

6. Calling the Object
print(c(3))

Step-by-step execution:

c(3) calls:

Child.__call__(c, 3)


Inside Child.__call__:

super().__call__(3) → Base.__call__(3) → 3 + 1 = 4

Result is multiplied:

4 * 2 = 8

7. Final Output
8

✅ Final Answer
✔ Output:
8

Python Coding challenge - Day 993| What is the output of the following Python Code?

 


Code Explanation:

1. Defining the Class
class Counter:

A class named Counter is defined.

This class will create objects that can be called like functions.

2. Initializing Instance State
    def __init__(self):
        self.n = 0

__init__ is the constructor.

It runs once when an object is created.

An instance variable n is created and initialized to 0.

3. Defining the __call__ Method
    def __call__(self):
        self.n += 1
        return self.n

__call__ makes the object callable.

Each time the object is called:

self.n is increased by 1

The updated value is returned

4. Creating an Object
c = Counter()

An object c of class Counter is created.

self.n is set to 0.

5. First Call: c()
c()

Python internally calls:

c.__call__()


self.n becomes 1

Returns 1

6. Second Call: c()
c()

self.n becomes 2

Returns 2

7. Third Call: c()
c()

self.n becomes 3

Returns 3

8. Printing the Results
print(c(), c(), c())

Prints the return values of the three calls.

9. Final Output
1 2 3

Final Answer
✔ Output:
1 2 3


Python Coding challenge - Day 992| What is the output of the following Python Code?


 Code Explanation:

1. Defining the Class
class Action:

A class named Action is defined.

This class will later behave like a function.

2. Defining the __call__ Method
    def __call__(self, x):
        return x * 2

__call__ is a special method in Python.

When an object is called like a function (obj()), Python internally calls:

obj.__call__()


This method takes one argument x and returns x * 2.

3. Creating an Instance
a = Action()

An object a of class Action is created.

Since Action defines __call__, the object becomes callable.

4. Calling the Object Like a Function
print(a(5))


Step-by-step:

Python sees a(5).

It translates this into:

a.__call__(5)


Inside __call__:

x = 5

5 * 2 = 10

The value 10 is returned.

5. Final Output
10

Final Answer
✔ Output:
10

Python Coding challenge - Day 991| What is the output of the following Python Code?

 


Code Explanation:

1. Defining the Class
class Cache:

A class named Cache is defined.

2. Defining __getattr__
    def __getattr__(self, name):

__getattr__ is a special method.

It is called only when an attribute is NOT found in:

the instance (self.__dict__)

the class

parent classes

3. Creating the Attribute Dynamically
        self.__dict__[name] = 7

A new attribute is added to the instance dynamically.

The attribute name is whatever was requested (name).

Its value is set to 7.

Example:

c.a = 7

4. Returning the Value
        return 7

The method returns 7.

This value becomes the result of the attribute access.

5. Creating an Object
c = Cache()

An instance c of class Cache is created.

Initially:

c.__dict__ == {}

6. First Access: c.a
c.a

Step-by-step:

Python looks for a in c.__dict__ → not found

Looks in class Cache → not found

Calls __getattr__(self, "a")

Inside __getattr__:

self.__dict__["a"] = 7

Returns 7

Now:

c.__dict__ == {"a": 7}

7. Second Access: c.a
c.a

Step-by-step:

Python looks for a in c.__dict__

Finds a = 7

__getattr__ is NOT called

Value 7 is returned directly

8. Printing the Values
print(c.a, c.a)


First c.a → 7

Second c.a → 7

9. Final Output
7 7

Final Answer
✔ Output:
7 7

Python Coding challenge - Day 990| What is the output of the following Python Code?

 


Code Explanation:

1. Class Definition
class Cleaner:

Explanation:

This line defines a class named Cleaner.

2. Method Definition
    def run(self):

Explanation:

run is an instance method of the Cleaner class.

self refers to the current object that calls this method.

3. Deleting the Method from the Class
        del Cleaner.run

Explanation:

This line deletes the run method from the class Cleaner itself.

After this executes:

The method run no longer exists in the Cleaner class.

This affects all instances of Cleaner, not just the current one.

Important:

The method is deleted while it is executing.

Python allows this because the function object is already being used.

4. Returning a Value
        return "done"

Explanation:

Even though Cleaner.run has been deleted,

The current call continues normally and returns "done".

5. Creating an Object
c = Cleaner()

Explanation:

Creates an instance of the Cleaner class.

The object c can initially access run through the class.

6. Calling the Method
print(c.run())

Explanation:

c.run() calls the method:

Python finds run in Cleaner.

Method execution starts.

Cleaner.run is deleted during execution.

"done" is returned.

Output:
done

7. Checking If Method Still Exists
print(hasattr(Cleaner, "run"))

Explanation:

hasattr(Cleaner, "run") checks whether the class Cleaner
still has an attribute named run.

Since del Cleaner.run was executed earlier:

The method no longer exists in the class.

Output:
False

8. Final Summary 
Methods belong to the class, not the object.

A method can be deleted from the class while it is running.

Deleting a class method affects all instances.

The current method call still completes successfully.

Final Output of the Program
done

Tuesday, 27 January 2026

Python Coding challenge - Day 989| What is the output of the following Python Code?

 


Code Explanation:

1. Class Definition
class Device:
    mode = "auto"

Explanation:

class Device:
→ This defines a class named Device.

mode = "auto"
→ This is a class variable.

It belongs to the class itself, not to any specific object.

All objects of Device can access this variable unless overridden.

2. Creating an Object
d = Device()

Explanation:

Device()
→ Creates a new object (instance) of the Device class.

d =
→ Stores that object in the variable d.

At this point:

d does not have its own mode

It uses Device.mode → "auto"

3. Accessing the Variable
print(d.mode)

Explanation:

Python looks for mode inside object d.

Since d has no instance variable called mode,

Python checks the class variable Device.mode.

Output:
auto

4. Modifying the Variable
d.mode = "manual"

Explanation:

This creates a new instance variable mode inside d only.

It does NOT change the class variable.

Now:

d.mode → "manual"

Device.mode → "auto"

5. Printing Class vs Object Variable
print(Device.mode, d.mode)

Explanation:

Device.mode
→ Refers to the class variable → "auto"

d.mode
→ Refers to the instance variable → "manual"

Output:
 auto auto manual

Python Coding challenge - Day 988| What is the output of the following Python Code?

 


Code Explanation:

1. Defining the Class

class Player:
    def play(self): 
        return "playing"


A class named Player is defined.

It has a method play() that returns the string "playing".

At this point:

Player.play → method

2. Creating an Instance
p = Player()


An object p of class Player is created.

Initially, p does not have its own play attribute.

Method lookup would normally find play on the class.

3. Assigning a New Attribute on the Instance
p.play = lambda: "paused"


This line creates an instance attribute named play.

The instance attribute shadows (overrides) the class method.

Now:

p.__dict__["play"] → lambda: "paused"


Important:

Instance attributes have higher priority than class attributes during lookup.

4. Calling p.play()
print(p.play())

Step-by-step:

Python looks for play on the instance p.

Finds the instance attribute (lambda: "paused").

Calls the lambda.

Returns "paused".

5. Final Output
paused

Final Answer
✔ Output:
paused


Python Coding challenge - Day 987 | What is the output of the following Python Code?

 


Code Explanation:

1. Defining the Class
class Engine:

A class named Engine is defined.

2. Defining the Method start
    def start(self):
        self.start = "running"
        return "init"

This method does two important things:

Creates an instance attribute named start

self.start = "running"


This overwrites the method name on the instance.

After this line, start on the object is no longer a method.

Returns a string

return "init"

3. Creating an Object
e = Engine()

An instance e of class Engine is created.

At this point:

e.start → method (from class)

4. First Call: e.start()
e.start()

Step-by-step:

Python finds start on the class.

Calls the method.

Inside the method:

self.start = "running" creates an instance attribute

The instance attribute shadows the method.

The method returns "init".

Result of first call:

"init"

5. Second Access: e.start
e.start

Python looks for start on the instance.

Finds the instance attribute:

e.start == "running"

The method on the class is no longer used.

6. Printing Both Values
print(e.start(), e.start)

First e.start() → "init"

Second e.start → "running"

7. Final Output
init running

Final Answer
✔ Output:
init running

Thursday, 22 January 2026

Python Coding challenge - Day 986| What is the output of the following Python Code?

 


Code Explanation:

1. Defining a Custom Metaclass
class Meta(type):

Meta is a metaclass because it inherits from type.

Metaclasses control class-level behavior, including how isinstance() works.

2. Overriding __instancecheck__
    def __instancecheck__(cls, obj):
        return obj == 5

__instancecheck__ is called whenever isinstance(obj, Class) is executed.

Instead of normal type checking, it compares the object value.

It returns:

True if obj is equal to 5

False otherwise

3. Defining Class A Using the Metaclass
class A(metaclass=Meta): pass

Class A is created using the metaclass Meta.

Any isinstance(..., A) check will now use Meta.__instancecheck__.

4. Evaluating isinstance(5, A)
isinstance(5, A)

Step-by-step:

Python sees A has a custom metaclass.

Calls:

Meta.__instancecheck__(A, 5)


obj == 5 → True

5. Evaluating isinstance(3, A)
isinstance(3, A)


Step-by-step:

Calls:

Meta.__instancecheck__(A, 3)


obj == 5 → False

6. Printing the Results
print(isinstance(5, A), isinstance(3, A))


Prints the results of both checks.

7. Final Output
True False

✅ Final Answer
✔ Output:
True False

500 Days Python Coding Challenges with Explanation

Python Coding challenge - Day 985| What is the output of the following Python Code?

 


Code Explanation:

1. Defining Class A
class A:
    def f(self): return "A"

Class A defines a method f.

f() returns the string "A".

2. Defining Class B
class B:
    def f(self): return "B"

Class B also defines a method f.

f() returns the string "B".

3. Defining Class C Inheriting from A
class C(A): pass

Class C inherits from A.

At this point, the inheritance chain is:

C → A → object

4. Creating an Object of C
obj = C()

An instance obj of class C is created.

At this moment:

obj.f() → "A"

5. Changing the Base Class at Runtime
C.__bases__ = (B,)

This line modifies the inheritance of class C at runtime.

Now, C no longer inherits from A, but from B.

The new inheritance chain becomes:

C → B → object

Important:

This change affects all instances of C, including ones already created.

6. Calling f() After Base Change
print(obj.f())

Step-by-step method lookup:

Python looks for f in class C → not found.

Python looks in B (new base class) → found.

B.f() is called.

7. Final Output
B

Final Answer
✔ Output:
B

100 Python Programs for Beginner with explanation

Python Coding challenge - Day 984| What is the output of the following Python Code?

 


Code Explanation:

1. Defining the Class
class A:

A class named A is defined.

2. Defining Method f
    def f(self):
        A.f = lambda self: "X"
        return "A"

This method does two things:

Reassigns the class method A.f

It replaces A.f with a new lambda function:

lambda self: "X"


Returns "A" for the current call.

Important:

This reassignment happens during the execution of the method.

3. Creating an Instance
a = A()

An object a of class A is created.

At this point:

A.f → original method (returns "A")

4. First Call: a.f()
a.f()

Step-by-step:

Python finds method f on class A.

Executes the original method.

Inside the method:

A.f is replaced with the lambda returning "X".

The method returns "A".

Result of first call:

"A"

5. Second Call: a.f()
a.f()

Step-by-step:

Python again looks for f on class A.

Now A.f is the new lambda function.

The lambda runs and returns "X".

Result of second call:

"X"

6. Printing Both Results
print(a.f(), a.f())

First a.f() → "A"

Second a.f() → "X"

7. Final Output
A X

Final Answer
✔ Output:
A X

400 Days Python Coding Challenges with Explanation


Python Coding challenge - Day 983| What is the output of the following Python Code?

 


Code Explanation:

1. Defining a Custom Metaclass
class Meta(type):

Meta is a metaclass because it inherits from type.

A metaclass controls how classes are created.

2. Overriding __new__ in the Metaclass
def __new__(cls, name, bases, dct):
    return super().__new__(cls, name, (), dct)

__new__ is executed every time a class using this metaclass is created.

Instead of using the original bases, it forces bases to be empty ().

Python rule:

If no base class is provided, Python automatically inserts object.

3. Creating Class A
class A(metaclass=Meta): pass

What happens internally:

Meta.__new__ is called.

bases is replaced with ().

Python automatically inserts object.

Result:

A.__bases__ == (object,)

4. Creating Class B
class B(A): pass

Very important behavior:

B inherits the metaclass from its parent A.

So Meta.__new__ is also called for B.

Internally:

Meta.__new__(Meta, "B", (A,), {...})


The metaclass again replaces bases with ()

Python inserts object

Result:

B.__bases__ == (object,)

5. Printing the Base Classes
print(B.__bases__)

Prints the direct parent class(es) of B.

6. Final Output
(<class 'object'>,)


Final Answer
✔ Output:
(object,)

Python Coding challenge - Day 982| What is the output of the following Python Code?

 


Code Explanatiion:

1. Defining a Metaclass Meta
class Meta(type):

Meta is a metaclass.

A metaclass is a class that creates other classes.

Here, Meta inherits from type, which is the default metaclass in Python.

2. Overriding the __new__ Method of the Metaclass
    def __new__(cls, name, bases, dct):

__new__ is called when a new class is being created

Parameters:

cls → the metaclass (Meta)

name → name of the class being created ("A")

bases → base classes of A (here, (object,))

dct → dictionary containing class attributes and methods

3. Adding a Class Attribute Inside __new__
        dct["version"] = 1

A new entry version is added to the class dictionary.

This means every class created using Meta will have version = 1.

4. Creating the Class Object Using type.__new__
        return super().__new__(cls, name, bases, dct)


Calls the parent metaclass (type) to actually create the class.

Returns the newly created class object.

5. Defining Class A Using the Metaclass
class A(metaclass=Meta):
    pass


Class A is created using the metaclass Meta.

pass means no attributes or methods are explicitly defined in A.

During class creation:

Meta.__new__ is executed

version = 1 is injected into A

So internally, A becomes:

class A:
    version = 1

6. Accessing the Class Attribute
print(A.version)


version is a class attribute, not an instance attribute.

It was added automatically by the metaclass.

Python finds version in A and prints its value.

7. Final Output
1

Python Coding challenge - Day 981| What is the output of the following Python Code?

 


Code Explanation:

1. Defining a Descriptor Class D
class D:

This defines a class named D.

It is intended to be used as a descriptor.

2. Implementing the __get__ Method
    def __get__(self, obj, owner):
        return 50

__get__ is a descriptor method.

It is automatically called when the attribute is accessed.

Parameters:

self → the descriptor object (D instance)

obj → the instance accessing the attribute (a)

owner → the class owning the attribute (A)

It always returns 50, regardless of the object or class.

3. Defining Class A
class A:

This defines a class named A.

4. Creating a Descriptor Attribute in Class A
    x = D()

x is a class attribute.

It is assigned an instance of D.

Because D defines __get__, x becomes a non-data descriptor
(it has __get__ but no __set__).

5. Creating an Object of Class A
a = A()

An instance a of class A is created.

6. Assigning a Value to a.x
a.x = 10

This creates an instance attribute x in object a.

Since D does not define __set__, it is a non-data descriptor.

Instance attributes override non-data descriptors.

So now:

a.__dict__ = {'x': 10}

7. Accessing a.x
print(a.x)

Python looks for x in the following order:

Instance dictionary (a.__dict__)

Class attributes / descriptors

Since a.__dict__['x'] exists, it is returned.

The descriptor’s __get__ method is not called.

8. Final Output
10

Tuesday, 20 January 2026

Python Coding challenge - Day 980| What is the output of the following Python Code?

 


Code Explanation:

1. Defining the Class
class A:

A class named A is defined.

2. Declaring a Class Variable
    count = 0

count is a class variable.

It belongs to the class A, not to individual objects.

Initially:

A.count == 0

3. Defining the Constructor (__init__)
    def __init__(self):
        self.count += 1

__init__ runs every time an object of A is created.
self.count += 1 works like this:

Python looks for count on the object (self) → not found

It then looks at the class → finds A.count

Reads the value (0)

Adds 1

Creates a new instance variable self.count

Important:
This does NOT modify A.count — it creates an instance attribute.

4. Creating First Object
a = A()

__init__ runs.

self.count += 1 → a.count = 1

Now:

a.count == 1
A.count == 0

5. Creating Second Object
b = A()

__init__ runs again.

self.count += 1 → b.count = 1

Now:

b.count == 1
A.count == 0

6. Printing the Values
print(a.count, b.count, A.count)

a.count → instance variable → 1

b.count → instance variable → 1

A.count → class variable → 0

7. Final Output
1 1 0

Final Answer
✔ Output:
1 1 0

100 Python Programs for Beginner with explanation

Python Coding challenge - Day 979| What is the output of the following Python Code?

 


Code Explanation:

1. Defining the Descriptor Class
class D:

D is a descriptor class because it defines the __get__ method.

Descriptors control how attributes are accessed.

2. Implementing the __get__ Method
    def __get__(self, obj, owner):
        return "descriptor"

__get__ is called whenever the managed attribute is accessed.

Parameters:

self → the descriptor object

obj → the instance accessing the attribute

owner → the owner class (A)

It always returns the string "descriptor".

 3. Defining the Owner Class
class A:
    x = D()

The attribute x of class A is assigned a D object.

This makes x a managed attribute controlled by the descriptor.

4. Creating an Instance
a = A()

An object a of class A is created.

Initially, a has no attribute x in its instance dictionary.

5. Assigning to the Instance Attribute
a.x = "instance"

This creates an entry {"x": "instance"} in a.__dict__.

However, this does not override the descriptor when accessing x.

 6. Accessing the Attribute
print(a.x)

Step-by-step attribute lookup:

Python checks if x is a data descriptor on the class.

D defines __get__ → it is a descriptor.

Descriptors take priority over instance attributes.

D.__get__ is called.

"descriptor" is returned.

7. Final Output
descriptor

Final Answer
✔ Output:
descriptor

Monday, 19 January 2026

Python Coding challenge - Day 978| What is the output of the following Python Code?

 


Code Explanation:

1. Class Definition
class A:


This line defines a class named A.

A class is a blueprint for creating objects.

2. Overriding __getattribute__ Method
def __getattribute__(self, name):


__getattribute__ is a special (magic) method in Python.

It is called every time an attribute of an object is accessed.

self → the current object (a)

name → the name of the attribute being accessed (as a string)

3. Checking the Attribute Name
if name == "ok":


This line checks whether the requested attribute name is "ok".

4. Returning a Custom Value
return "yes"


If the attribute name is "ok", the method returns the string "yes".

This means a.ok will not look for a real attribute — it directly returns "yes".

5. Raising an Error for Other Attributes
raise AttributeError


If the attribute name is not "ok", an AttributeError is raised.

This tells Python that the attribute does not exist.

Without this, Python’s normal attribute lookup would break.

6. Creating an Object
a = A()

An object a is created from class A.

7. Accessing the Attribute
print(a.ok)

Python calls a.__getattribute__("ok").

Since the name is "ok", the method returns "yes".

print() outputs the returned value.

8. Final Output
yes


Python Coding challenge - Day 977| What is the output of the following Python Code?

 


Code Explanation:

1. Defining the Descriptor Class D
class D:
    def __get__(self, obj, owner):
        obj.__dict__.pop("x", None)
        return 7

Explanation

class D:
Defines a class that will act as a descriptor.

def __get__(self, obj, owner):
This is the descriptor protocol method.

self → the descriptor instance (D()).

obj → the instance accessing the attribute (a).

owner → the class of the instance (A).

obj.__dict__.pop("x", None)

Removes the key "x" from the instance dictionary (a.__dict__) if it exists.

None prevents a KeyError if "x" is not present.

return 7

Always returns the value 7 when the attribute is accessed.

2. Defining the Class A
class A:
    x = D()

Explanation

class A:
Defines a new class.

x = D()

x is a class attribute.

Since D implements __get__, x becomes a non-data descriptor.

Accessing a.x may invoke D.__get__().

3. Creating an Instance of A
a = A()

Explanation

Creates an instance a of class A.

Initially:

a.__dict__ == {}

4. Assigning to a.x
a.x = 3

Explanation

This assignment does not trigger __get__.

Since D does not define __set__, it is a non-data descriptor.

Python allows instance attributes to override non-data descriptors.

Result:

a.__dict__ == {'x': 3}

5. Accessing a.x
print(a.x, a.__dict__)

Step-by-Step Resolution of a.x

Python finds x in a.__dict__ ({'x': 3}).

But since x is also a descriptor in the class:

Python checks the class attribute.

D.__get__(self, obj, owner) is called.

Inside __get__:

"x" is removed from a.__dict__.

7 is returned.

Final State

Value printed for a.x → 7

Instance dictionary becomes:

{}

6. Final Output
7 {}

400 Days Python Coding Challenges with Explanation


Python Coding challenge - Day 976| What is the output of the following Python Code?

 



Code Explanation:

1. Defining the Class
class A:
    def f(self):
        return "A"

A class A is defined.

It has an instance method f that returns "A".

At this moment:

A.f → method that returns "A"

2. Creating an Instance
a = A()


An object a of class A is created.

a does not store method f inside itself.

Methods are looked up on the class, not copied into the object.

3. Replacing the Method on the Class
A.f = lambda self: "X"


The method f on class A is reassigned.

The original method is replaced by a lambda function that returns "X".

Now:

A.f → lambda self: "X"


This affects all instances, including ones created earlier.

4. Calling the Method on the Existing Instance
print(a.f())


Step-by-step:

Python looks for f on the instance a → not found.

Python looks for f on the class A → finds the new lambda.

The lambda is called with self = a.

It returns "X".

5. Final Output
X

Final Answer
✔ Output:
X

Sunday, 18 January 2026

Python Coding challenge - Day 975| What is the output of the following Python Code?

 


Code Explanation:

1. Defining a Custom Metaclass
class Meta(type):

Meta is a metaclass because it inherits from type.

A metaclass controls class-level behavior.

2. Overriding __instancecheck__
    def __instancecheck__(cls, obj):
        return False

__instancecheck__ is a special method used by isinstance(obj, cls).

By overriding it, we can control the result of isinstance.

This implementation always returns False, no matter the object.

3. Defining Class A Using the Metaclass
class A(metaclass=Meta): pass

Class A is created with Meta as its metaclass.

Any isinstance(..., A) check will now use Meta.__instancecheck__.

 4. Checking the Instance
print(isinstance(A(), A))

Step-by-step:

A() creates an instance of class A.

isinstance(A(), A) calls:

Meta.__instancecheck__(A, obj)


The method returns False.

 5. Final Output
False

Final Answer
✔ Output:
False

Popular Posts

Categories

100 Python Programs for Beginner (118) AI (190) Android (25) AngularJS (1) Api (7) Assembly Language (2) aws (28) Azure (8) BI (10) Books (261) Bootcamp (1) C (78) C# (12) C++ (83) Course (84) Coursera (299) Cybersecurity (29) data (1) Data Analysis (25) Data Analytics (18) data management (15) Data Science (252) Data Strucures (15) Deep Learning (106) Django (16) Downloads (3) edx (21) Engineering (15) Euron (30) Events (7) Excel (18) Finance (9) flask (3) flutter (1) FPL (17) Generative AI (54) Git (9) Google (47) Hadoop (3) HTML Quiz (1) HTML&CSS (48) IBM (41) IoT (3) IS (25) Java (99) Leet Code (4) Machine Learning (229) Meta (24) MICHIGAN (5) microsoft (9) Nvidia (8) Pandas (13) PHP (20) Projects (32) Python (1245) Python Coding Challenge (992) Python Mistakes (43) Python Quiz (406) Python Tips (5) Questions (3) R (72) React (7) Scripting (3) security (4) Selenium Webdriver (4) Software (19) SQL (46) Udemy (17) UX Research (1) web application (11) Web development (8) web scraping (3)

Followers

Python Coding for Kids ( Free Demo for Everyone)