using System;
using System.Collections .Generic ;
namespace BasicFormatting
{
public enum State { If, For} ;
static class Data{
public static string[ ] Input = {
"12" ,
"····" ,
"VAR I" ,
"·FOR I=1 TO 31" ,
"»»»»IF !(I MOD 3) THEN" ,
"··PRINT \" FIZZ\" " ,
"··»»ENDIF" ,
"»»»»····IF !(I MOD 5) THEN" ,
"»»»»··PRINT \" BUZZ\" " ,
"··»»»»»»ENDIF" ,
"»»»»IF (I MOD 3) && (I MOD 5) THEN" ,
"······PRINT \" FIZZBUZZ\" " ,
"··»»ENDIF" ,
"»»»»·NEXT"
} ;
}
class MainClass
{
public static void Main ( )
{
var state = new List< State> ( ) ;
char [ ] spaceChars = { '»' , '·' } ;
var lines = Int32.Parse ( Data.Input [ 0 ] ) ;
var indent = Data.Input [ 1 ] ;
for ( int line = 1 ; line < lines+ 1 ; line++ ) {
var thisLine = Data.Input [ line+ 1 ] .TrimStart ( spaceChars) ;
if ( thisLine.ToUpper ( ) .StartsWith ( "NEXT" ) ) {
if ( state.Count > 0 && state[ state.Count - 1 ] == State.For )
state.RemoveAt ( state.Count - 1 ) ;
else {
throw new FormatException ( String.Format ( "NEXT without FOR (line: {0})" , line) ) ;
}
}
if ( thisLine.ToUpper ( ) .StartsWith ( "ENDIF" ) ) {
if ( state.Count > 0 && state [ state.Count - 1 ] == State.If )
state.RemoveAt ( state.Count - 1 ) ;
else {
throw new FormatException ( String.Format ( "ENDIF without IF (line: {0})" , line) ) ;
}
}
var indentChars = "" ;
for ( int ind = 0 ; ind < state.Count ; ind++ ) {
indentChars += indent;
}
thisLine = indentChars+ thisLine;
if ( thisLine.ToUpper ( ) .TrimStart ( spaceChars) .StartsWith ( "IF " ) ) state.Add ( State.If ) ;
if ( thisLine.ToUpper ( ) .TrimStart ( spaceChars) .StartsWith ( "FOR " ) ) state.Add ( State.For ) ;
Console.WriteLine ( thisLine) ;
}
if ( state.Count > 0 )
{
if ( state.Contains ( State.If ) ) Console.WriteLine ( "ERROR: Not closed all IF Statements" ) ;
if ( state.Contains ( State.For ) ) Console.WriteLine ( "ERROR: Not closed all FOR Statements" ) ;
}
}
}
public class FormatException: Exception{
public FormatException( string message) : base( message)
{
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCm5hbWVzcGFjZSBCYXNpY0Zvcm1hdHRpbmcKewoJcHVibGljIGVudW0gU3RhdGUge0lmLCBGb3J9OwoKCXN0YXRpYyBjbGFzcyBEYXRhewoJCXB1YmxpYyBzdGF0aWMgc3RyaW5nW10gSW5wdXQgPSB7IAoJCQkiMTIiLAoJCQkiwrfCt8K3wrciLAoJCQkiVkFSIEkiLAoJCQkiwrdGT1IgST0xIFRPIDMxIiwKCQkJIsK7wrvCu8K7SUYgIShJIE1PRCAzKSBUSEVOIiwKCQkJIsK3wrdQUklOVCBcIkZJWlpcIiIsCgkJCSLCt8K3wrvCu0VORElGIiwKCQkJIsK7wrvCu8K7wrfCt8K3wrdJRiAhKEkgTU9EIDUpIFRIRU4iLAoJCQkiwrvCu8K7wrvCt8K3UFJJTlQgXCJCVVpaXCIiLAoJCQkiwrfCt8K7wrvCu8K7wrvCu0VORElGIiwKCQkJIsK7wrvCu8K7SUYgKEkgTU9EIDMpICYmIChJIE1PRCA1KSBUSEVOIiwKCQkJIsK3wrfCt8K3wrfCt1BSSU5UIFwiRklaWkJVWlpcIiIsCgkJCSLCt8K3wrvCu0VORElGIiwKCQkJIsK7wrvCu8K7wrdORVhUIgoJCX07IAoJfQoKCWNsYXNzIE1haW5DbGFzcwoJewoJCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluICgpCgkJewoJCQl2YXIgc3RhdGUgPSBuZXcgTGlzdDxTdGF0ZT4oKSA7CgkJCWNoYXJbXSBzcGFjZUNoYXJzID0geyAnwrsnLCAnwrcnIH07CgkJCXZhciBsaW5lcyA9IEludDMyLlBhcnNlIChEYXRhLklucHV0WzBdKTsKCQkJdmFyIGluZGVudCA9IERhdGEuSW5wdXRbMV07CgoJCQlmb3IgKGludCBsaW5lID0gMTsgbGluZSA8IGxpbmVzKzE7IGxpbmUrKykgewoJCQkJdmFyIHRoaXNMaW5lID0gRGF0YS5JbnB1dFtsaW5lKzFdLlRyaW1TdGFydChzcGFjZUNoYXJzKTsKCgkJCQlpZiAodGhpc0xpbmUuVG9VcHBlciAoKS5TdGFydHNXaXRoICgiTkVYVCIpKSB7CgkJCQkJaWYgKHN0YXRlLkNvdW50PjAgJiYgc3RhdGVbc3RhdGUuQ291bnQgLSAxXSA9PSBTdGF0ZS5Gb3IpIAoJCQkJCQlzdGF0ZS5SZW1vdmVBdCAoc3RhdGUuQ291bnQgLSAxKTsgIAoJCQkJCWVsc2V7CgkJCQkJCXRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24gKFN0cmluZy5Gb3JtYXQgKCJORVhUIHdpdGhvdXQgRk9SIChsaW5lOiB7MH0pIiwgbGluZSkpOwoJCQkJCX0KCQkJCX0KCgoJCQkJaWYgKHRoaXNMaW5lLlRvVXBwZXIgKCkuU3RhcnRzV2l0aCAoIkVORElGIikpIHsKCQkJCQlpZiAoc3RhdGUuQ291bnQ+MCAmJiBzdGF0ZSBbc3RhdGUuQ291bnQgLSAxXSA9PSBTdGF0ZS5JZikKCQkJCQkJc3RhdGUuUmVtb3ZlQXQgKHN0YXRlLkNvdW50IC0gMSk7CgkJCQkJZWxzZSB7CgkJCQkJCXRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24gKFN0cmluZy5Gb3JtYXQgKCJFTkRJRiB3aXRob3V0IElGIChsaW5lOiB7MH0pIiwgbGluZSkpOwoJCQkJCX0KCQkJCX0KCgkJCQl2YXIgaW5kZW50Q2hhcnMgPSAiIjsKCQkJCWZvciAoaW50IGluZCA9IDA7IGluZCA8IHN0YXRlLkNvdW50OyBpbmQrKykgewoJCQkJCWluZGVudENoYXJzICs9IGluZGVudDsKCQkJCX0KCQkJCXRoaXNMaW5lID0gaW5kZW50Q2hhcnMrdGhpc0xpbmU7CgoJCQkJaWYodGhpc0xpbmUuVG9VcHBlcigpLlRyaW1TdGFydChzcGFjZUNoYXJzKS5TdGFydHNXaXRoKCJJRiAiKSkgc3RhdGUuQWRkIChTdGF0ZS5JZik7CgkJCQlpZih0aGlzTGluZS5Ub1VwcGVyKCkuVHJpbVN0YXJ0KHNwYWNlQ2hhcnMpLlN0YXJ0c1dpdGgoIkZPUiAiKSkgc3RhdGUuQWRkIChTdGF0ZS5Gb3IpOwoJCQkKCQkJCUNvbnNvbGUuV3JpdGVMaW5lKHRoaXNMaW5lKTsKCQkJfQoKCQkJaWYoc3RhdGUuQ291bnQ+MCkKCQkJewoJCQkJaWYoc3RhdGUuQ29udGFpbnMgKFN0YXRlLklmKSkgQ29uc29sZS5Xcml0ZUxpbmUgKCJFUlJPUjogTm90IGNsb3NlZCBhbGwgSUYgU3RhdGVtZW50cyIpOwoJCQkJaWYoc3RhdGUuQ29udGFpbnMgKFN0YXRlLkZvcikpIENvbnNvbGUuV3JpdGVMaW5lICgiRVJST1I6IE5vdCBjbG9zZWQgYWxsIEZPUiBTdGF0ZW1lbnRzIik7CgkJCX0KCQl9Cgl9CgoJcHVibGljIGNsYXNzIEZvcm1hdEV4Y2VwdGlvbjpFeGNlcHRpb257CgkJcHVibGljIEZvcm1hdEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSk6YmFzZShtZXNzYWdlKQoJCXsKCQl9Cgl9Cgp9