fork download
  1. def check_basic(test_case):
  2. output = []
  3. depth = 0
  4. stack = []
  5. errors = []
  6. test_case = test_case.split('\n')
  7. indent_char = test_case[1]
  8. test_case = test_case[2:]
  9. expected = {'NEXT': 'FOR', 'ENDIF': 'IF'}
  10. for line_num, line in enumerate(test_case, 1):
  11. newline = line.strip(r'·» \t\s')
  12. if newline and not newline.isdigit():
  13. if newline.startswith('NEXT') or newline.startswith('ENDIF'):
  14. block_end = newline.split()[0]
  15. if not stack or expected[block_end] != stack.pop():
  16. errors.append('Error in line number {}: {} found when another close was expected'.format(line_num, block_end))
  17. depth -= 1
  18. depth -= 1
  19. print((indent_char * depth) + newline)
  20. if newline.startswith('FOR') or newline.startswith('IF'):
  21. stack.append(newline.split()[0])
  22. depth += 1
  23.  
  24. if stack:
  25. print('Error: There was a problem closing the following block(s): {}'.format(', '.join(stack)))
  26. if errors:
  27. print('\n'.join(errors))
  28.  
  29. print('\n-------- Test case 1: --------')
  30. input1 = """12
  31. ····
  32. VAR I
  33. ·FOR I=1 TO 31
  34. »»»»IF !(I MOD 3) THEN
  35. ··PRINT "FIZZ"
  36. ··»»ENDIF
  37. »»»»····IF !(I MOD 5) THEN
  38. »»»»··PRINT "BUZZ"
  39. ··»»»»»»ENDIF
  40. »»»»IF (I MOD 3) && (I MOD 5) THEN
  41. ······PRINT "FIZZBUZZ"
  42. ··»»ENDIF
  43. »»»»·NEXT
  44. """
  45. check_basic(input1)
  46.  
  47. print('\n-------- Test case 2: --------')
  48. print('-------- (using asterix as indent) --------')
  49. input2 = """10
  50. ****
  51. FOR I=0 TO 10
  52. ····IF I MOD 2 THEN
  53. ········PRINT I
  54. NEXT
  55. FOR I=0 TO 10
  56. ····IF I MOD 2 THEN
  57. ········PRINT I
  58. FOR I=0 TO 10
  59. ····PRINT I
  60. ENDIF
  61. """
  62. check_basic(input2)
Success #stdin #stdout 0.02s 9984KB
stdin
Standard input is empty
stdout
--------       Test case 1:        --------
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

--------       Test case 2:        --------
-------- (using asterix as indent) --------
FOR I=0 TO 10
****IF I MOD 2 THEN
********PRINT I
NEXT
FOR I=0 TO 10
****IF I MOD 2 THEN
********PRINT I
********FOR I=0 TO 10
************PRINT I
****ENDIF
Error: There was a problem closing the following block(s): FOR, FOR, IF
Error in line number 4: NEXT found when another close was expected
Error in line number 10: ENDIF found when another close was expected