Replacement Array is an array of elements.
Format String contains conversion specifier %s, followed by optional index specifier [1], followed by optional length specifier :3.
Format String: %s[1]:3
%s is conversion specifier - mark the starting of conversion string
[1] is index specifier - corresponding index of Replacement Array
:3 is length specifier - number of characters to be taken from string
The replacement works as follows:
Example:
Replacement Array: Smart site India comparison Best
Format String: %sprix is the %s[4] online %s[3]:6 shopping %s:9 in %s
Output: Smartprix is the Best online compar shopping site in India.
If no index specifier is present with conversion specifier %s, Index 0, 1, 2, 3... are assigned to all in sequence from left to right.
In above example %sprix is %s[0]prix; %s:9 is %s[1]:9 and so on.
The specifier string is replaced by element of Replacement Array denoted by index specifier. If no element is found the specifier is not replaced.
In above example %s[4] is replaced by element at 4th index of the Replacement Array "Best". %sprix is replaced by Smartprix and so on.
%s[3]:6 is replaced by 'first 6 characters' of the element at 3rd index of the Replacement Array, i.e., "compar".
If the 'length specifier' is not present or is greater than length of the element then use whole string.
%s:9 is replaced by site, %s[4] is replaced by Best.
For any error case, specifier is not replaced.
Input:
There will be 2 lines in the input.
1st line contains space separated elements of Replacement Array
2nd line is Format String
Output:
Formatted String
INPUT 1
smart site india comaprision best
%sprix is the %s[4] online %s[3]:6 shopping %s:9 in %s
OUTPUT
smartprix is the best online comapr shopping site in india
INPUT 2
india boom startup up hub
%s %s[is] a %sing %s:5%s:5 %s[4]. and %s[6] are :4 of %s[-1].
OUTPUT
india %s[is] a booming startup hub. and %s[6] are :4 of %s[-1].
INPUT 3
hello lavish kothari
%s[2]:xyz
OUTPUT
%s[2]:xyz
Format String contains conversion specifier %s, followed by optional index specifier [1], followed by optional length specifier :3.
Format String: %s[1]:3
%s is conversion specifier - mark the starting of conversion string
[1] is index specifier - corresponding index of Replacement Array
:3 is length specifier - number of characters to be taken from string
The replacement works as follows:
Example:
Replacement Array: Smart site India comparison Best
Format String: %sprix is the %s[4] online %s[3]:6 shopping %s:9 in %s
Output: Smartprix is the Best online compar shopping site in India.
If no index specifier is present with conversion specifier %s, Index 0, 1, 2, 3... are assigned to all in sequence from left to right.
In above example %sprix is %s[0]prix; %s:9 is %s[1]:9 and so on.
The specifier string is replaced by element of Replacement Array denoted by index specifier. If no element is found the specifier is not replaced.
In above example %s[4] is replaced by element at 4th index of the Replacement Array "Best". %sprix is replaced by Smartprix and so on.
%s[3]:6 is replaced by 'first 6 characters' of the element at 3rd index of the Replacement Array, i.e., "compar".
If the 'length specifier' is not present or is greater than length of the element then use whole string.
%s:9 is replaced by site, %s[4] is replaced by Best.
For any error case, specifier is not replaced.
Input:
There will be 2 lines in the input.
1st line contains space separated elements of Replacement Array
2nd line is Format String
Output:
Formatted String
INPUT 1
smart site india comaprision best
%sprix is the %s[4] online %s[3]:6 shopping %s:9 in %s
OUTPUT
smartprix is the best online comapr shopping site in india
INPUT 2
india boom startup up hub
%s %s[is] a %sing %s:5%s:5 %s[4]. and %s[6] are :4 of %s[-1].
OUTPUT
india %s[is] a booming startup hub. and %s[6] are :4 of %s[-1].
INPUT 3
hello lavish kothari
%s[2]:xyz
OUTPUT
%s[2]:xyz
#include<bits/stdc++.h>
using namespace std;
int findCase(string &b,int index)
{
if(index+2>=b.size())
return 1;
/*
if(b[index+2]!=':' && b[index+2]!='[')
return 1;
*/
if(b[index+2]==':' && index+3<b.size() && b[index+3]>='0' && b[index+3]<='9')
return 4;
if(b[index+2]==':')
return 0;
if(b[index+2]=='[')
{
int i=index+3;
if(i>=b.size() || b[i]<='0' || b[i]>='9')
return 0;
while(i<b.size() && b[i]>='0' && b[i]<='9')
i++;
if(i==b.size())
return 0; // for case %s[1234
else if(b[i]==']')
{
if(i+1>=b.size() || b[i+1]!=':')
return 2;
else if(b[i+1]==':')
{
if(i+2>=b.size())
return 0;
else if(b[i+2]>='0' && b[i+2]<='9')
return 3;
else
return 0;
}
}
else return 1;
}
return 1;
}
int extract(string &b,int index)
{
int sum=0;
while(index<b.size() && b[index]>='0' && b[index]<='9')
{
sum=sum*10+b[index]-'0';
index++;
}
return sum;
}
void findFormattedString(string &a,string &b)
{
vector<string>vs;
int start=0;int len=0;
for(int i=0;i<a.size();i++)
{
if(a[i]==' ')
{
vs.push_back(a.substr(start,len));
while(i<a.size() && a[i]==' ')
i++;
start=i;
len=0;
}
len++;
}
if(a[a.size()-1]!=' ')
vs.push_back(a.substr(start,a.size()-start));
/*
for(int i=0;i<vs.size();i++)
cout<<"**"<<vs[i]<<endl;
*/
int counter=0,startfrom=0;
while(1)
{
int index=b.find("%s",startfrom);
if(index<0)
break;
int c=findCase(b,index);
if(c==1)
{
if(counter>=vs.size())
{
startfrom=index+1;
continue;
}
b.erase(b.begin()+index,b.begin()+index+2);
b.insert(index,vs[counter]);
counter++;
}
else if(c==2)
{
int number=extract(b,index+3);
if(number<0 || number>=vs.size())
{
startfrom=index+1;
continue;
}
int i=index+3;
while(i<b.size() && b[i]>='0' && b[i]<='9')
i++;
b.erase(b.begin()+index,b.begin()+i+1);
b.insert(index,vs[number]);
}
else if(c==3)
{
int number1=extract(b,index+3);
if(number1<0 || number1>=vs.size())
{
startfrom=index+1;
continue;
}
int i=index+3;
while(i<b.size() && b[i]>='0' && b[i]<='9')
i++;
b.erase(b.begin()+index,b.begin()+i+2);
int number2=extract(b,index);
i=index;
while(i<b.size() && b[i]>='0' && b[i]<='9')
i++;
b.erase(b.begin()+index,b.begin()+i);
if(vs[number1].size()<=number2)
{
b.insert(index,vs[number1]);
}
else
b.insert(index,vs[number1].substr(0,number2));
}
else if(c==4)
{
if(counter>=vs.size())
{
startfrom=index+1;
continue;
}
int number=extract(b,index+3);
int i=index+3;
while(i<b.size() && b[i]>='0' && b[i]<='9')
i++;
b.erase(b.begin()+index,b.begin()+i);
if(vs[counter].size()<=number)
{
b.insert(index,vs[counter++]);
}
else
b.insert(index,vs[counter++].substr(0,number));
}
else if(c==0)
startfrom=index+1;
}
}
int main()
{
string a,b;
getline(cin,a);
getline(cin,b);
findFormattedString(a,b);
cout<<b<<endl;
return 0;
}
No comments:
Post a Comment