ERROR - Editorial

PROBLEM LINK:

Practice
Contest

Author: Vivek Hamirwasia
Tester: Mahbub
Editorialist: Jingbo Shang

DIFFICULTY:

Cakewalk

PREREQUISITES:

Programming Language.

PROBLEM:

Determine whether the given binary string contains the substring (consecutive) “010” or “101”.

EXPLANATION:

You can use a loop and condition clauses to check directly. Also, you can use some built-in functions to solve this problem too.

For example, C++, we can use

int position = strstr(s, "010") - s;

to get the first occurrence of “010” and check whether this position is in range. Or, if string is used in C++, then

int position = s.find("010");

will work for string.

Similarly, Java, Python, etc… a lot of languages have such functions. Post your accepted solution and let’s find which one is the shortest! I think it will be interesting :stuck_out_tongue:

AUTHOR’S AND TESTER’S SOLUTIONS:

Author’s solution can be found here.
Tester’s solution can be found here.

3 Likes

Using Python’s elegance
CodeChef: Practical coding for everyone

for _ in xrange(input()):
    s = raw_input()
    if "010" in s or "101" in s: print "Good"
    else:                        print "Bad"

P.S.: Waiting for a one liner in Perl or GolfScript :stuck_out_tongue:

UPDATE: If that’s the case @shangjingbo, then how about a Perl regex check

$s =~ m/"101"/
1 Like

Well, when I’m good with Monads I can return and fully solve this one in Haskell, but, the built-in functions sure are a charm:

isInfixOf "010" "10010"

:smiley:

1 Like

@all:

May i know what is wrong with this approach. CodeChef: Practical coding for everyone

I was checking characters at i, i-1, i-2 in a loop.

Thanks :slight_smile:

what is wrong wid this…
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main(void)
{
int t;
char a , b , c ,d ,count ;
scanf("%d" , &t);
while(t–)
{
count = 0;
a = getchar();
b = getchar();
c = getchar();
while( (d = getchar()) != ‘\n’)
( (a==‘0’ && b==‘1’ && c==‘0’) || (a == ‘1’ && b==‘0’ && c==‘1’)) ? ( (count++) , (a = b) , ( b = c) , (c = d )): ((a = b) , ( b = c), (c = d ));
(count > 0)?(printf(“Good\n”)):(printf(“Bad\n”));
}
getch();
return 0;
}

@ rd13123013
When 010 or 101 comes at the last of the string …then d==’\n’ .Therefore ,it doesn’t enters into While loop…so the count doesn’t increasing …and there lies the bug.

 So , you can overcome this by using "do() ...while()..loop" :)
2 Likes

int main()
{
int t;
cin>>t;
while(t–) {
std::string str("");
cin>>str;
if((str.find(“010”)==!std::string::npos) || (str.find(“101”)==!std::string::npos))
{
cout<<endl<<“Good”<<endl;
}
else
{
cout<<endl<<“Bad”<<endl;
}
}
system(“pause”);
return 0;
}

What is wrong with this code? Similar code accepted in java but this is not working.

class Sample7

@t=0
@str

def initialize
t=gets.to_i

for i in 0...t
  str=gets
  if str.include?"101"||"010"
    puts "Good"
  else puts "Bad"
  end
end

end
end

obj=Sample7.new

WHAT IS WRONG IN MY CODE?
#include
#include<string.h>
using namespace std;
int main()
{
int t;
long int l,i,c,d,j,e;
cin>>t;
while(t–)
{
char s[100005];
cin>>s;
l=strlen(s);
for(i=0;i<l-2;i++)
{
e=2;
c=0;
j=i;
while(e–)
{
if(s[j]!=s[j+1])
c++;
else
break;
j++;
}
if(c==2)
{
cout<<“good”<<endl;
break;
}
}
if(c!=2)
cout<<“bad”<<endl;
}
return 0;
}

Guys can anyone tell what is wrong with this python code for the problem, according to me it is correct.....

lst=[]
a=int(input())
i=0
while i<a:
    str1=input()
    lst.append(str1)
    i=i+1

i=0

for j in lst:
    if '010' in j and '101' in j:
        print("Good")
    else:
        print("Bad")

Guys can anyone tell what is wrong with this python code for the problem, according to me it is correct…

lst=[]
a=int(input())
i=0
while i<a:
    str1=input()
    lst.append(str1)
    i=i+1

i=0

for j in lst:
    if '010' in j and '101' in j:
        print("Good")
    else:
        print("Bad")

#include
#include
using namespace std;
int main(){
int a;
cin>>a;
while(a–){
string s;int c=0;
cin>>s;
for(int i=0;i<(s.length()-1)&&c<2;i++){
if(s[i]!=s[i+1])c++;
else c=0;
}
if(c==2)cout<<“Good”<<endl;
else cout<<“Bad”<<endl;
}
return 0;
}

link text

@s_pandey01
It is in the checking stage. if ‘010’ in j and ‘101’ in j:
it should use ‘or’ instead of ‘and’. If ‘and’ is used, then ‘Good’ will only print out when both ‘010’ and ‘101’ are in the line.

1 Like

import java.util.Scanner;
class untitled
{
public static void main(String[] args)
{
Scanner kb=new Scanner(System.in);
int test=kb.nextInt();
while(test–>0)
{
String s1=kb.next();
String s2=“010”;
String s3=“101”;
if(s1.contains(s2)||s1.contains(s3))
System.out.println(“Good”);
else
System.out.println(“Bad”);
}
}
}
benefit of java!..
:stuck_out_tongue:

I think it may be the shortest one :slight_smile:

sound great, but you have benn beaten by @kuruma, have another try :smiley:

1 Like

@shangjingbo >> I was not trying to enter any competition for shortest code. I was just demonstrating Python’s elegance. :smiley:

The problem with this check is that it doesn’t receive input and produce output, instead, it can be used in an interactive fashion, but, I’m loving Haskell so far :smiley:

Wow, great!

I foolishly tried to implement “Z- algo”… :P. Someone kick me on my ass…

4 Likes