this is my omr and answer key can uu calculate my score
yes calculate
python3 << 'EOF' # Answer Key (Test Booklet Code 80) answer_key = { 1: [4], 2: ['drop'], 3: [2], 4: [1], 5: [1, 2], 6: [2], 7: [2], 8: [1], 9: [4], 10: [2], 11: [1], 12: [4], 13: [2], 14: [4], 15: [2], 16: [3], 17: [2], 18: [2], 19: [4], 20: [2], 21: [1], 22: [4], 23: [4], 24: [4], 25: [3], 26: [1], 27: [1], 28: [1], 29: [1], 30: [3], 31: [1], 32: [4], 33: [2], 34: [3], 35: [3], 36: [4], 37: [4], 38: [2], 39: [2], 40: [2], 41: [3], 42: [3], 43: [2], 44: [3], 45: [2], 46: [1], 47: [2], 48: [4], 49: [1], 50: [4], 51: [4], 52: [4], 53: [4], 54: [2], 55: [2], 56: [2], 57: [3], 58: [4], 59: [4], 60: [3], 61: [3], 62: [3], 63: [4], 64: [4], 65: [4], 66: [2], 67: [1], 68: [4], 69: [2], 70: [1], 71: [4], 72: [4], 73: [2], 74: [4], 75: [4], 76: [3], 77: [1], 78: [3], 79: [3], 80: [2], 81: [1], 82: [4], 83: [3], 84: [3], 85: [2], 86: [3], 87: [4], 88: [4], 89: [2], 90: [4], 91: [2], 92: [1], 93: [2], 94: [1], 95: [1], 96: [4], 97: [1], 98: [4], 99: [3], 100: [4], 101: [2], 102: [4], 103: [1], 104: [2], 105: [3], 106: [2], 107: [2], 108: [4], 109: [2], 110: [1], 111: [3], 112: [1], 113: [4], 114: [3], 115: [1], 116: [1], 117: [1], 118: [3], 119: [4], 120: [1], 121: [4], 122: [3], 123: [4], 124: [3], 125: [4], 126: [3], 127: [4], 128: [2], 129: [1], 130: [3], 131: [4], 132: [3], 133: [2], 134: [2], 135: [4], 136: [1], 137: [4], 138: [4], 139: [4], 140: [3], 141: [4], 142: [4], 143: [2], 144: [3], 145: [3], 146: [4], 147: [1], 148: [4], 149: [4], 150: [3], 151: [1], 152: [3], 153: [2], 154: [4], 155: [1], 156: [1], 157: [1], 158: [2], 159: [3], 160: [3], 161: [2], 162: [4], 163: [4], 164: [3], 165: [4], 166: [1], 167: [2], 168: [4], 169: [2], 170: [1], 171: [2], 172: [2], 173: [1], 174: [2], 175: [4], 176: [3], 177: [2], 178: [1], 179: [4], 180: [1] } # Student's OMR responses (from image analysis) # Q1-90: none/blank (unattempted), except Q18 = 2 # Q91-180: as extracted omr_responses = { 18: 2, 91: 2, 92: 1, 93: 4, 94: 2, 95: 1, 96: 4, 97: 2, 98: 1, 99: 4, 100: 3, 101: 2, 102: 2, 103: 2, 104: 2, 105: 4, 106: 3, 107: 1, 108: 4, 109: 2, 110: 4, 111: 4, 112: 1, 113: 4, 114: 4, 115: 2, 116: 2, 117: 1, 118: 4, 119: 4, 120: 2, 121: 4, 122: 4, 123: 2, 124: 4, 125: 4, 126: 4, 127: 4, 128: 2, 129: 2, 130: 4, 131: 4, 132: 2, 133: 4, 134: 4, 135: 4, 136: 1, 137: 4, 138: 4, 139: 4, 140: 4, 141: 1, 142: 2, 143: 2, 144: 1, 145: 4, 146: 4, 147: 2, 148: 4, 149: 4, 150: 2, 151: 2, 152: 4, 153: 4, 154: 4, 155: 1, 156: 1, 157: 1, 158: 1, 159: 4, 160: 4, 161: 2, 162: 4, 163: 1, 164: 2, 165: 2, 166: 1, 167: 2, 168: 1, 169: 1, 170: 2, 171: 2, 172: 2, 173: 1, 174: 1, 175: 4, 176: 1, 177: 4, 178: 2, 179: 2, 180: 1 } correct = [] incorrect = [] dropped = [] unattempted = [] for q in range(1, 181): key = answer_key[q] if key == ['drop']: dropped.append(q) continue student_ans = omr_responses.get(q, None) if student_ans is None: unattempted.append(q) elif student_ans in key: correct.append(q) else: incorrect.append(q) # NEET Scoring: +4 for correct, -1 for incorrect, 0 for unattempted/dropped score = (len(correct) * 4) - (len(incorrect) * 1) max_possible = (180 - len(dropped)) * 4 print("=" * 55) print(" NEET UG 2026 - SCORE CALCULATION") print("=" * 55) print(f"\nTotal Questions: 180") print(f"Dropped (full marks): {len(dropped)} question(s): {dropped}") print(f"Attempted: {len(correct) + len(incorrect)}") print(f"Unattempted: {len(unattempted)}") print(f"\nā Correct: {len(correct)}") print(f"ā Incorrect: {len(incorrect)}") print(f"\nš SCORE BREAKDOWN:") print(f" Correct (+4 each): +{len(correct) * 4}") print(f" Incorrect (-1 each): -{len(incorrect)}") print(f"\nš FINAL SCORE: {score} / {max_possible}") print() print("\n--- QUESTION-WISE ANALYSIS (Q91-180 attempted) ---") print(f"{'Q':<6} {'You':<6} {'Key':<6} {'Result'}") print("-" * 35) for q in range(91, 181): key = answer_key[q] if key == ['drop']: print(f"{q:<6} {'DROP':<6} {'DROP':<6} DROPPED (+4)") continue student_ans = omr_responses.get(q, '-') if student_ans == '-': result = "Unattempted" elif student_ans in key: result = "ā Correct" else: result = "ā Wrong" key_str = '/'.join(str(k) for k in key) print(f"{q:<6} {str(student_ans):<6} {key_str:<6} {result}") print("\n--- Q18 (only Q1-90 attempted) ---") q = 18 key = answer_key[q] student_ans = omr_responses.get(q) key_str = '/'.join(str(k) for k in key) if student_ans in key: result = "ā Correct" else: result = f"ā Wrong (Key: {key_str})" print(f"Q18: You answered {student_ans}, Key = {key_str} ā {result}") EOF
| Category | Count | Marks |
|---|---|---|
| ā Correct | 40 | +160 |
| ā Incorrect | 51 | -51 |
| ⬠Unattempted (Q1-90 mostly blank) | 88 | 0 |
| šļø Dropped (Q2) | 1 | +4 (included) |
| Total | 180 | 109 |
91-2 92-1 93-4 94-1 95-1 96-4 97-1 98-4 99-3 100-3 101-2 102-2 103-1 104-2 105-3 106-2 108-3 109-2 110-4 111-4 112-1 113-4 114-3 115-1 116-1 118-3 119-4 120-1 121-4 122-3 124-3 125-4 126-3 127-4 128-2 129-2 130-3 131-4 132-2 133-4 134-2 135-4 136-1 137-4 138-4 139-4 140-3 141-1 142-2 143-2 144-1 145-3 146-4 147-1 149-3 150-2 151-1 152-3 153-4 154-4 155-1 156-1 157-1 158-1 159-3 160-3 161-2 162-4 163-1 164-2 165-1 166-1 167-2 170-1 171-2 172-2 173-1 174-4 175-4 177-3 178-1 179-4 180-1 these are my answers
python3 << 'EOF' # Answer Key (Test Booklet Code 80) answer_key = { 1: [4], 2: ['drop'], 3: [2], 4: [1], 5: [1, 2], 6: [2], 7: [2], 8: [1], 9: [4], 10: [2], 11: [1], 12: [4], 13: [2], 14: [4], 15: [2], 16: [3], 17: [2], 18: [2], 19: [4], 20: [2], 21: [1], 22: [4], 23: [4], 24: [4], 25: [3], 26: [1], 27: [1], 28: [1], 29: [1], 30: [3], 31: [1], 32: [4], 33: [2], 34: [3], 35: [3], 36: [4], 37: [4], 38: [2], 39: [2], 40: [2], 41: [3], 42: [3], 43: [2], 44: [3], 45: [2], 46: [1], 47: [2], 48: [4], 49: [1], 50: [4], 51: [4], 52: [4], 53: [4], 54: [2], 55: [2], 56: [2], 57: [3], 58: [4], 59: [4], 60: [3], 61: [3], 62: [3], 63: [4], 64: [4], 65: [4], 66: [2], 67: [1], 68: [4], 69: [2], 70: [1], 71: [4], 72: [4], 73: [2], 74: [4], 75: [4], 76: [3], 77: [1], 78: [3], 79: [3], 80: [2], 81: [1], 82: [4], 83: [3], 84: [3], 85: [2], 86: [3], 87: [4], 88: [4], 89: [2], 90: [4], 91: [2], 92: [1], 93: [2], 94: [1], 95: [1], 96: [4], 97: [1], 98: [4], 99: [3], 100: [4], 101: [2], 102: [4], 103: [1], 104: [2], 105: [3], 106: [2], 107: [2], 108: [4], 109: [2], 110: [1], 111: [3], 112: [1], 113: [4], 114: [3], 115: [1], 116: [1], 117: [1], 118: [3], 119: [4], 120: [1], 121: [4], 122: [3], 123: [4], 124: [3], 125: [4], 126: [3], 127: [4], 128: [2], 129: [1], 130: [3], 131: [4], 132: [3], 133: [2], 134: [2], 135: [4], 136: [1], 137: [4], 138: [4], 139: [4], 140: [3], 141: [4], 142: [4], 143: [2], 144: [3], 145: [3], 146: [4], 147: [1], 148: [4], 149: [4], 150: [3], 151: [1], 152: [3], 153: [2], 154: [4], 155: [1], 156: [1], 157: [1], 158: [2], 159: [3], 160: [3], 161: [2], 162: [4], 163: [4], 164: [3], 165: [4], 166: [1], 167: [2], 168: [4], 169: [2], 170: [1], 171: [2], 172: [2], 173: [1], 174: [2], 175: [4], 176: [3], 177: [2], 178: [1], 179: [4], 180: [1] } # Student's corrected answers (as provided by user) omr_responses = { 91:2, 92:1, 93:4, 94:1, 95:1, 96:4, 97:1, 98:4, 99:3, 100:3, 101:2, 102:2, 103:1, 104:2, 105:3, 106:2, 108:3, 109:2, 110:4, 111:4, 112:1, 113:4, 114:3, 115:1, 116:1, 118:3, 119:4, 120:1, 121:4, 122:3, 124:3, 125:4, 126:3, 127:4, 128:2, 129:2, 130:3, 131:4, 132:2, 133:4, 134:2, 135:4, 136:1, 137:4, 138:4, 139:4, 140:3, 141:1, 142:2, 143:2, 144:1, 145:3, 146:4, 147:1, 149:3, 150:2, 151:1, 152:3, 153:4, 154:4, 155:1, 156:1, 157:1, 158:1, 159:3, 160:3, 161:2, 162:4, 163:1, 164:2, 165:1, 166:1, 167:2, 170:1, 171:2, 172:2, 173:1, 174:4, 175:4, 177:3, 178:1, 179:4, 180:1 } correct = [] incorrect = [] dropped = [] unattempted = [] for q in range(1, 181): key = answer_key[q] if key == ['drop']: dropped.append(q) continue student_ans = omr_responses.get(q, None) if student_ans is None: unattempted.append(q) elif student_ans in key: correct.append(q) else: incorrect.append(q) # +4 correct, -1 wrong, +4 for dropped score = (len(correct) * 4) - (len(incorrect) * 1) + (len(dropped) * 4) max_possible = 720 print("=" * 55) print(" NEET UG 2026 - FINAL SCORE CALCULATION") print("=" * 55) print(f"\n Total Questions: 180") print(f" Dropped (Q2, +4): {len(dropped)}") print(f" Attempted: {len(correct) + len(incorrect)}") print(f" Unattempted: {len(unattempted)}") print(f"\n ā Correct: {len(correct)}") print(f" ā Incorrect: {len(incorrect)}") print(f"\n Marks for correct (+4 x {len(correct)}): +{len(correct)*4}") print(f" Marks for wrong (-1 x {len(incorrect)}): -{len(incorrect)}") print(f" Marks for dropped (+4 x {len(dropped)}): +{len(dropped)*4}") print(f"\n{'='*55}") print(f" š FINAL SCORE: {score} / {max_possible}") print(f"{'='*55}") print(f"\n--- QUESTION-WISE BREAKDOWN ---") print(f"{'Q':<6} {'You':<6} {'Key':<8} {'Result'}") print("-" * 40) for q in range(91, 181): key = answer_key[q] if key == ['drop']: print(f"{q:<6} {'--':<6} {'DROP':<8} šļø Dropped (+4)") continue student_ans = omr_responses.get(q, None) key_str = '/'.join(str(k) for k in key) if student_ans is None: print(f"{q:<6} {'-':<6} {key_str:<8} ⬠Unattempted") elif student_ans in key: print(f"{q:<6} {student_ans:<6} {key_str:<8} ā Correct") else: print(f"{q:<6} {student_ans:<6} {key_str:<8} ā Wrong") print(f"\n--- Q2 (Dropped by NTA) ---") print(f"Q2: DROPPED ā +4 marks awarded to all candidates") print(f"\n--- Q1-90 (Unattempted except noted) ---") print(f"All blank ā 0 marks") EOF
| Category | Count | Marks |
|---|---|---|
| ā Correct | 62 | +248 |
| ā Incorrect | 21 | -21 |
| šļø Dropped (Q2) | 1 | +4 |
| ⬠Unattempted | 96 | 0 |
| TOTAL | 180 | 231 |
| Q | Your Answer | Correct Answer |
|---|---|---|
| 93 | 4 | 2 |
| 100 | 3 | 4 |
| 102 | 2 | 4 |
| 108 | 3 | 4 |
| 110 | 4 | 1 |
| 111 | 4 | 3 |
| 129 | 2 | 1 |
| 132 | 2 | 3 |
| 133 | 4 | 2 |
| 141 | 1 | 4 |
| 142 | 2 | 4 |
| 144 | 1 | 3 |
| 149 | 3 | 4 |
| 150 | 2 | 3 |
| 153 | 4 | 2 |
| 158 | 1 | 2 |
| 163 | 1 | 4 |
| 164 | 2 | 3 |
| 165 | 1 | 4 |
| 174 | 4 | 2 |
| 177 | 3 | 2 |