Find profession in a special family
Last Updated :
12 Jun, 2022
Consider a special family of Engineers and Doctors with following rules :
- Everybody has two children.
- First child of an Engineer is an Engineer and second child is a Doctor.
- First child of an Doctor is Doctor and second child is an Engineer.
- All generations of Doctors and Engineers start with Engineer.
We can represent the situation using below diagram:
E
/
E D
/ /
E D D E
/ / / /
E D D E D E E D
Given level and position of a person in above ancestor tree, find the profession of the person.
Examples :
Input : level = 4, pos = 2
Output : Doctor
Input : level = 3, pos = 4
Output : Engineer
Method 1 (Recursive)
The idea is based on the fact that profession of a person depends on following two.
- Profession of parent.
- Position of node : If position of a node is odd, then its profession is same as its parent. Else profession is different from its parent.
We recursively find the profession of parent, then use point 2 above to find the profession of current node.
Below is implementation of above idea.
C++
#include<bits/stdc++.h>
using namespace std;
char findProffesion( int level, int pos)
{
if (level == 1)
return 'e' ;
if (findProffesion(level-1, (pos+1)/2) == 'd' )
return (pos%2)? 'd' : 'e' ;
return (pos%2)? 'e' : 'd' ;
}
int main( void )
{
int level = 4, pos = 2;
(findProffesion(level, pos) == 'e' )? cout << "Engineer"
: cout << "Doctor" ;
return 0;
}
|
Java
import java.io.*;
class GFG
{
static char findProffesion( int level,
int pos)
{
if (level == 1 )
return 'e' ;
if (findProffesion(level - 1 ,
(pos + 1 ) / 2 ) == 'd' )
return (pos % 2 > 0 ) ?
'd' : 'e' ;
return (pos % 2 > 0 ) ?
'e' : 'd' ;
}
public static void main (String[] args)
{
int level = 4 , pos = 2 ;
if (findProffesion(level,
pos) == 'e' )
System.out.println( "Engineer" );
else
System.out.println( "Doctor" );
}
}
|
Python3
def findProffesion(level, pos):
if (level = = 1 ):
return 'e'
if (findProffesion(level - 1 , (pos + 1 ) / / 2 ) = = 'd' ):
if (pos % 2 ):
return 'd'
else :
return 'e'
if (pos % 2 ):
return 'e'
else :
return 'd'
if __name__ = = '__main__' :
level = 3
pos = 4
if (findProffesion(level, pos) = = 'e' ):
print ( "Engineer" )
else :
print ( "Doctor" )
|
C#
using System;
class GFG
{
static char findProffesion( int level,
int pos)
{
if (level == 1)
return 'e' ;
if (findProffesion(level - 1,
(pos + 1) / 2) == 'd' )
return (pos % 2 > 0) ?
'd' : 'e' ;
return (pos % 2 > 0) ?
'e' : 'd' ;
}
public static void Main ()
{
int level = 4, pos = 2;
if (findProffesion(level,
pos) == 'e' )
Console.WriteLine( "Engineer" );
else
Console.WriteLine( "Doctor" );
}
}
|
PHP
<?php
function findProffesion( $level , $pos )
{
if ( $level == 1)
return 'e' ;
if (findProffesion( $level - 1,
( $pos + 1) / 2) == 'd' )
return ( $pos % 2) ? 'd' : 'e' ;
return ( $pos % 2) ? 'e' : 'd' ;
}
$level = 4; $pos = 2;
if ((findProffesion( $level ,
$pos ) == 'e' ) == true)
echo "Engineer" ;
else
echo "Doctor" ;
?>
|
Javascript
<script>
function findProffesion(level,
pos)
{
if (level == 1)
return 'e' ;
if (findProffesion(level - 1,
(pos + 1) / 2) == 'd ')
return (pos % 2 > 0) ?
' d ' : ' e ';
// If parent is an engineer,
// then current node will be
// an engineer if at add
// position and doctor if even
// position.
return (pos % 2 > 0) ?
' e ' : ' d ';
}
// Driver Code
let level = 4, pos = 2;
if(findProffesion(level,
pos) == ' e')
document.write( "Engineer" );
else
document.write( "Doctor" );
</script>
|
Output :
Doctor
Time Complexity: O(logn)
Auxiliary Space: O(1)
Method 2 (Using Bitwise Operators)
Level 1: E
Level 2: ED
Level 3: EDDE
Level 4: EDDEDEED
Level 5: EDDEDEEDDEEDEDDE
Level input isn’t necessary (if we ignore max position limit) because first elements are same.
The result is based on count of 1’s in binary representation of position minus one. If count of 1’s is even then result is Engineer, else then Doctor.
And of course position limit is 2^(Level-1)
C++
#include<bits/stdc++.h>
using namespace std;
int countSetBits( int n)
{
int count = 0;
while (n)
{
n &= (n-1) ;
count++;
}
return count;
}
char findProffesion( int level, int pos)
{
int c = countSetBits(pos-1);
return (c%2)? 'd' : 'e' ;
}
int main( void )
{
int level = 3, pos = 4;
(findProffesion(level, pos) == 'e' )? cout << "Engineer"
: cout << "Doctor" ;
return 0;
}
|
Java
class GFG{
static int countSetBits( int n)
{
int count = 0 ;
while (n!= 0 )
{
n &= (n- 1 ) ;
count++;
}
return count;
}
static char findProffesion( int level, int pos)
{
int c = countSetBits(pos- 1 );
return (c% 2 != 0 )? 'd' : 'e' ;
}
public static void main(String [] args)
{
int level = 3 , pos = 4 ;
String prof = (findProffesion(level, pos) == 'e' )? "Engineer"
: "Doctor" ;
System.out.print(prof);
}
}
|
Python3
def countSetBits(n):
count = 0
while n > 0 :
n & = (n - 1 )
count + = 1
return count
def findProffesion(level, pos):
c = countSetBits(pos - 1 )
if c % 2 = = 0 :
return 'e'
else :
return 'd'
level, pos = 3 , 4
if findProffesion(level, pos) = = 'e' :
print ( "Engineer" )
else :
print ( "Doctor" )
|
C#
using System;
public class GFG
{
public static int countSetBits( int n)
{
int count = 0;
while (n != 0)
{
n &= (n - 1);
count++;
}
return count;
}
public static char findProffesion( int level, int pos)
{
int c = countSetBits(pos - 1);
return (c % 2 != 0)? 'd' : 'e' ;
}
public static void Main( string [] args)
{
int level = 3, pos = 4;
string prof = (findProffesion(level, pos) == 'e' )? "Engineer" : "Doctor" ;
Console.Write(prof);
}
}
|
PHP
<?php
function countSetBits( $n )
{
$count = 0;
while ( $n )
{
$n &= ( $n - 1) ;
$count ++;
}
return $count ;
}
function findProffesion( $level , $pos )
{
$c = countSetBits( $pos - 1);
return ( $c % 2) ? 'd' : 'e' ;
}
$level = 3;
$pos = 4;
if ((findProffesion( $level ,
$pos ) == 'e' ) == true)
echo "Engineer \n" ;
else
echo "Doctor \n" ;
?>
|
Javascript
<script>
function countSetBits(n)
{
let count = 0;
while (n != 0)
{
n &= (n - 1);
count++;
}
return count;
}
function findProffesion(level, pos)
{
let c = countSetBits(pos - 1);
return (c % 2 != 0)? 'd' : 'e' ;
}
let level = 3, pos = 4;
let prof = (findProffesion(level, pos) == 'e' )?
"Engineer" : "Doctor" ;
document.write(prof);
</script>
|
Output :
Engineer
Time Complexity: O(logn)
Auxiliary Space: O(1)
Thanks to Furkan Uslu for suggesting this method.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...