3v324v23 commited on
Commit
81a02cb
ยท
1 Parent(s): 5a3991e

Enhance math skills functionality and testing

Browse files

- Updated `requirements-dev.txt` to include `sympy` for algebra answer recomputation in tests.
- Modified `math.js` to implement a new round system for skills with more than 10 questions, ensuring unsolved questions are prioritized.
- Adjusted question navigation logic to accommodate the new round system.
- Enhanced the user interface to reflect the current question progress based on rounds.
- Added tests in `test_math_skills.py` to verify the correctness of algebraic expressions and equations, ensuring marked answers are accurate.
- Implemented new tests in `test_sky_browser.py` to validate the round functionality and progress tracking for skills.

app/math_algebra9.json CHANGED
@@ -418,836 +418,2824 @@
418
  "mistake": "sign_product"
419
  }
420
  ]
421
- }
422
- ]
423
- },
424
- {
425
- "id": "t_simplify",
426
- "unit": "t",
427
- "name": "ืคื™ืฉื•ื˜ ื‘ื™ื˜ื•ื™ื™ื ื‘ืขื–ืจืช ื”ืคื™ืœื•ื’ ื”ืžื•ืจื—ื‘",
428
- "short": "ืคื™ืฉื•ื˜ ื‘ื™ื˜ื•ื™ื™ื",
429
- "prereqs": [
430
- "t_ext"
431
- ],
432
- "description": "ืคื•ืชื—ื™ื ืกื•ื’ืจื™ื™ื ื‘ืคื™ืœื•ื’ ื”ืžื•ืจื—ื‘, ืฉืžื™ื ืœื‘ ืœืกื™ืžืŸ ืฉืœืคื ื™ ื›ืœ ืžื›ืคืœื” ื•ืžื›ื ืกื™ื ืื™ื‘ืจื™ื ื“ื•ืžื™ื.",
433
- "month": "ืกืคื˜ืžื‘ืจ",
434
- "questions": [
435
  {
436
- "question": "ืคืฉื˜ื•: $(x + 2)(x + 3) โˆ’ x(x + 4)$",
437
  "choices": [
438
  {
439
- "text": "$x + 6$",
440
  "correct": true
441
  },
442
  {
443
- "text": "$9x + 6$",
444
- "mistake": "minus_paren"
445
  },
446
  {
447
- "text": "$6 โˆ’ 4x$",
448
- "mistake": "ext_partial"
 
 
 
 
449
  }
450
  ]
451
  },
452
  {
453
- "question": "ืคืฉื˜ื•: $(x โˆ’ 1)(x + 5) + (x + 2)(x โˆ’ 3)$",
454
  "choices": [
455
  {
456
- "text": "$2xยฒ + 3x โˆ’ 11$",
457
  "correct": true
458
  },
459
  {
460
- "text": "$2xยฒ โˆ’ 11$",
461
  "mistake": "ext_partial"
462
  },
463
  {
464
- "text": "$2xยฒ โˆ’ 3x โˆ’ 11$",
465
  "mistake": "sign_mid"
466
  },
467
  {
468
- "text": "$2xยฒ + 3x + 11$",
469
  "mistake": "sign_product"
470
  }
471
  ]
472
  },
473
  {
474
- "question": "ืคืฉื˜ื•: $(2x + 1)(x + 4) โˆ’ 2xยฒ$",
475
  "choices": [
476
  {
477
- "text": "$9x + 4$",
478
  "correct": true
479
  },
480
  {
481
- "text": "$8x + 4$",
482
  "mistake": "ext_partial"
483
  },
484
  {
485
- "text": "$4$",
 
 
 
 
 
 
 
 
 
 
 
 
 
486
  "mistake": "ext_partial"
487
  },
488
  {
489
- "text": "$4xยฒ + 9x + 4$",
490
- "mistake": "minus_paren"
 
 
 
 
491
  }
492
  ]
493
  },
494
  {
495
- "question": "ืคืฉื˜ื•: $(x + 3)(x โˆ’ 3) โˆ’ (x โˆ’ 1)(x + 2)$",
496
  "choices": [
497
  {
498
- "text": "$โˆ’x โˆ’ 7$",
499
  "correct": true
500
  },
501
  {
502
- "text": "$x โˆ’ 11$",
503
- "mistake": "minus_paren"
504
- },
505
- {
506
- "text": "$โˆ’7$",
507
  "mistake": "ext_partial"
508
  },
509
  {
510
- "text": "$x โˆ’ 7$",
511
  "mistake": "sign_mid"
 
 
 
 
512
  }
513
  ]
514
  },
515
  {
516
- "question": "ืคืฉื˜ื•: $3x(x + 1) โˆ’ (x + 2)(3x โˆ’ 1)$",
517
  "choices": [
518
  {
519
- "text": "$2 โˆ’ 2x$",
520
  "correct": true
521
  },
522
  {
523
- "text": "$8x โˆ’ 2$",
524
- "mistake": "minus_paren"
525
  },
526
  {
527
- "text": "$3x + 2$",
528
- "mistake": "ext_partial"
 
 
 
 
529
  }
530
  ]
531
  },
532
  {
533
- "question": "ืคืฉื˜ื•: $(a + 2)(a + 5) โˆ’ (a + 1)(a + 6)$",
534
  "choices": [
535
  {
536
- "text": "$4$",
537
  "correct": true
538
  },
539
  {
540
- "text": "$14a + 16$",
541
- "mistake": "minus_paren"
542
  },
543
  {
544
- "text": "$0$",
 
 
 
 
545
  "mistake": "const_added"
546
  }
547
  ]
548
  },
549
  {
550
- "question": "ืคืฉื˜ื•: $(2x โˆ’ 3)(x + 1) โˆ’ (x + 1)(x โˆ’ 1)$",
551
  "choices": [
552
  {
553
- "text": "$xยฒ โˆ’ x โˆ’ 2$",
554
  "correct": true
555
  },
556
  {
557
- "text": "$xยฒ โˆ’ x โˆ’ 4$",
558
- "mistake": "minus_paren"
559
  },
560
  {
561
- "text": "$xยฒ + x โˆ’ 2$",
562
- "mistake": "sign_mid"
563
  },
564
  {
565
- "text": "$xยฒ โˆ’ 2$",
566
- "mistake": "ext_partial"
567
  }
568
  ]
569
  },
570
  {
571
- "question": "ืื™ื–ื” ื‘ื™ื˜ื•ื™ ืฉื•ื•ื” ืœึพ$(x + 4)(x โˆ’ 1) โˆ’ xยฒ$?",
572
  "choices": [
573
  {
574
- "text": "$3x โˆ’ 4$",
575
  "correct": true
576
  },
577
  {
578
- "text": "$โˆ’4$",
579
  "mistake": "ext_partial"
580
  },
581
  {
582
- "text": "$โˆ’3x โˆ’ 4$",
583
  "mistake": "sign_mid"
584
  },
585
  {
586
- "text": "$3x + 4$",
587
  "mistake": "sign_product"
588
  }
589
  ]
590
  },
591
  {
592
- "question": "ืคืฉื˜ื•: $5 โˆ’ (x + 1)(x โˆ’ 2)$",
593
  "choices": [
594
  {
595
- "text": "$โˆ’xยฒ + x + 7$",
596
  "correct": true
597
  },
598
  {
599
- "text": "$โˆ’xยฒ โˆ’ x + 3$",
600
- "mistake": "minus_paren"
601
  },
602
  {
603
- "text": "$7 โˆ’ xยฒ$",
604
- "mistake": "ext_partial"
605
  }
606
  ]
607
  },
608
  {
609
- "question": "ืคืฉื˜ื•: $2(x + 3)(x โˆ’ 1)$",
610
  "choices": [
611
  {
612
- "text": "$2xยฒ + 4x โˆ’ 6$",
613
  "correct": true
614
  },
615
  {
616
- "text": "$4xยฒ + 8x โˆ’ 12$",
617
- "mistake": "double_both"
618
  },
619
  {
620
- "text": "$2xยฒ + 4x โˆ’ 3$",
621
- "mistake": "partial_dist"
 
 
 
 
 
 
 
 
 
622
  },
623
  {
624
- "text": "$2xยฒ โˆ’ 6$",
625
  "mistake": "ext_partial"
 
 
 
 
 
 
 
 
626
  }
627
  ]
628
- }
629
- ]
630
- },
631
- {
632
- "id": "t_ext_eq",
633
- "unit": "t",
634
- "name": "ืคืชืจื•ืŸ ืžืฉื•ื•ืื•ืช ื‘ืขื–ืจืช ื”ืคื™ืœื•ื’ ื”ืžื•ืจื—ื‘",
635
- "short": "ืžืฉื•ื•ืื” ื•ืคื™ืœื•ื’",
636
- "prereqs": [
637
- "t_ext"
638
- ],
639
- "description": "ืคื•ืชื—ื™ื ืกื•ื’ืจื™ื™ื ื‘ืคื™ืœื•ื’ ื”ืžื•ืจื—ื‘, ื”ืื™ื‘ืจื™ื ืขื $xยฒ$ ืžืชื‘ื˜ืœื™ื, ื•ืคื•ืชืจื™ื ืžืฉื•ื•ืื” ืžืžืขืœื” ืจืืฉื•ื ื”.",
640
- "month": "ืกืคื˜ืžื‘ืจ",
641
- "questions": [
642
  {
643
- "question": "ืคืชืจื•: $(x + 2)(x + 3) = xยฒ + 16$",
644
  "choices": [
645
  {
646
- "text": "$x = 2$",
647
  "correct": true
648
  },
649
  {
650
- "text": "$x = 4.4$",
651
- "mistake": "move_sign"
652
  },
653
  {
654
- "text": "$x = 10$",
655
- "mistake": "forgot_divide"
656
  },
657
  {
658
- "text": "ืื™ืŸ ืคืชืจื•ืŸ",
659
- "mistake": "ext_partial"
660
  }
661
  ]
662
  },
663
  {
664
- "question": "ืคืชืจื•: $(x + 4)(x โˆ’ 1) = xยฒ + 8$",
665
  "choices": [
666
  {
667
- "text": "$x = 4$",
668
  "correct": true
669
  },
670
  {
671
- "text": "$x = 4/3$",
672
- "mistake": "move_sign"
673
  },
674
  {
675
- "text": "$x = 12$",
676
- "mistake": "forgot_divide"
677
  },
678
  {
679
- "text": "$x = โˆ’4$",
680
- "mistake": "sign_mid"
681
  }
682
  ]
683
  },
684
  {
685
- "question": "ืคืชืจื•: $(2x โˆ’ 1)(x + 3) = 2xยฒ + 1$",
686
  "choices": [
687
  {
688
- "text": "$x = 0.8$",
689
  "correct": true
690
  },
691
  {
692
- "text": "$x = โˆ’0.4$",
693
- "mistake": "move_sign"
694
  },
695
  {
696
- "text": "$x = 4$",
697
- "mistake": "forgot_divide"
698
  },
699
  {
700
- "text": "ืื™ืŸ ืคืชืจื•ืŸ",
701
- "mistake": "ext_partial"
702
  }
703
  ]
704
  },
705
  {
706
- "question": "ืคืชืจื•: $(x โˆ’ 3)(x โˆ’ 5) = xยฒ โˆ’ 1$",
707
  "choices": [
708
  {
709
- "text": "$x = 2$",
710
  "correct": true
711
  },
712
  {
713
- "text": "$x = โˆ’2$",
714
- "mistake": "neg_divide"
715
  },
716
  {
717
- "text": "$x = โˆ’1.75$",
718
- "mistake": "move_sign"
719
  },
720
  {
721
- "text": "$x = โˆ’16$",
722
- "mistake": "forgot_divide"
723
  }
724
  ]
725
  },
726
  {
727
- "question": "ืคืชืจื•: $x(x + 6) = (x + 2)(x + 3)$",
728
  "choices": [
729
  {
730
- "text": "$x = 6$",
731
  "correct": true
732
  },
733
  {
734
- "text": "$x = 1$",
735
  "mistake": "ext_partial"
736
  },
737
  {
738
- "text": "$x = 6/11$",
739
- "mistake": "move_sign"
 
 
 
 
740
  }
741
  ]
742
  },
743
  {
744
- "question": "ืคืชืจื•: $(x + 5)(x โˆ’ 2) โˆ’ xยฒ = 11$",
745
  "choices": [
746
  {
747
- "text": "$x = 7$",
748
  "correct": true
749
  },
750
  {
751
- "text": "$x = โˆ’7$",
752
- "mistake": "sign_mid"
753
  },
754
  {
755
- "text": "$x = 21$",
756
- "mistake": "forgot_divide"
757
  },
758
  {
759
- "text": "$x = 1/3$",
760
- "mistake": "move_sign"
761
  }
762
  ]
763
  },
764
  {
765
- "question": "ืคืชืจื•: $(3 โˆ’ x)(x + 4) = 10 โˆ’ xยฒ$",
766
  "choices": [
767
  {
768
- "text": "$x = 2$",
769
  "correct": true
770
  },
771
  {
772
- "text": "$x = โˆ’2$",
773
- "mistake": "neg_divide"
774
  },
775
  {
776
- "text": "$x = โˆ’22$",
777
- "mistake": "move_sign"
 
 
 
 
778
  }
779
  ]
780
  },
781
  {
782
- "question": "ืคืชืจื•: $(2x + 3)(x โˆ’ 4) = 2(xยฒ โˆ’ 5)$",
783
  "choices": [
784
  {
785
- "text": "$x = โˆ’0.4$",
786
  "correct": true
787
  },
788
  {
789
- "text": "$x = โˆ’1.4$",
790
- "mistake": "partial_dist"
791
  },
792
  {
793
- "text": "$x = 0.4$",
794
- "mistake": "neg_divide"
795
  },
796
  {
797
- "text": "$x = 4.4$",
798
- "mistake": "move_sign"
799
  }
800
  ]
801
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
802
  {
803
- "question": "ืžื›ืคืœืช $x + 1$ ื‘ึพ$x + 7$ ื’ื“ื•ืœื” ื‘ึพ$23$ ืžึพ$xยฒ$. ืžืฆืื• ืืช $x$.",
804
  "choices": [
805
  {
806
- "text": "$x = 2$",
807
  "correct": true
808
  },
809
  {
810
- "text": "$x = โˆ’3.75$",
811
- "mistake": "diff_order"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
812
  },
813
  {
814
- "text": "$x = 16$",
815
- "mistake": "forgot_divide"
816
  },
817
  {
818
- "text": "$x = 3.75$",
819
- "mistake": "move_sign"
820
  }
821
  ]
822
  },
823
  {
824
- "question": "ืคืชืจื•: $(x โˆ’ 6)(x + 1) = x(x โˆ’ 7) + 4$",
825
  "choices": [
826
  {
827
- "text": "$x = 5$",
828
  "correct": true
829
  },
830
  {
831
- "text": "$x = 10$",
832
- "mistake": "forgot_divide"
833
- },
834
- {
835
- "text": "$x = 10/7$",
836
- "mistake": "ext_partial"
837
  },
838
  {
839
- "text": "$x = 5/6$",
840
- "mistake": "sign_mid"
841
  }
842
  ]
843
- }
844
- ]
845
- },
846
- {
847
- "id": "t_area",
848
- "unit": "t",
849
- "name": "ื”ืฉื•ื•ืืช ืฉื˜ื—ื™ื ื‘ืขื–ืจืช ื”ืคื™ืœื•ื’",
850
- "short": "ื”ืฉื•ื•ืืช ืฉื˜ื—ื™ื",
851
- "prereqs": [
852
- "t_ext"
853
- ],
854
- "description": "ืžื‘ื˜ืื™ื ืฉื˜ื—ื™ื ื›ืžื›ืคืœื•ืช ืฉืœ ื‘ื™ื˜ื•ื™ื™ื ืืœื’ื‘ืจื™ื™ื ื•ืžืฉื•ื•ื™ื ื‘ื™ื ื™ื”ื.",
855
- "month": "ืกืคื˜ืžื‘ืจ",
856
- "questions": [
857
  {
858
- "question": "ืื•ืจืš ืžืœื‘ืŸ $x + 4$ ื•ืจื•ื—ื‘ื• $x + 1$. ืฆืœืข ืจื™ื‘ื•ืข $x + 2$. ื‘ื›ืžื” ืฉื˜ื— ื”ืžืœื‘ืŸ ื’ื“ื•ืœ ืžืฉื˜ื— ื”ืจื™ื‘ื•ืข?",
859
  "choices": [
860
  {
861
- "text": "$x$",
862
  "correct": true
863
  },
864
  {
865
- "text": "$5x$",
866
  "mistake": "forgot_middle"
867
  },
868
  {
869
- "text": "$2$",
870
- "mistake": "area_perimeter"
871
- },
872
- {
873
- "text": "$โˆ’x$",
874
- "mistake": "diff_order"
875
  }
876
  ]
877
  },
878
  {
879
- "question": "ืื•ืจืš ืžืœื‘ืŸ $x + 5$ ื•ืจื•ื—ื‘ื• $x โˆ’ 2$. ืžื” ืฉื˜ื—ื•?",
880
  "choices": [
881
  {
882
- "text": "$xยฒ + 3x โˆ’ 10$",
883
  "correct": true
884
  },
885
  {
886
- "text": "$xยฒ โˆ’ 10$",
887
- "mistake": "ext_partial"
888
- },
889
- {
890
- "text": "$4x + 6$",
891
- "mistake": "area_perimeter"
892
  },
893
  {
894
- "text": "$xยฒ โˆ’ 3x โˆ’ 10$",
895
- "mistake": "sign_mid"
896
  }
897
  ]
898
  },
899
  {
900
- "question": "ืฆืœืข ืจื™ื‘ื•ืข ื”ื™ื $x$. ืžื’ื“ื™ืœื™ื ืฆืœืข ืื—ืช ื‘ึพ$3$ ื•ืžืงื˜ื™ื ื™ื ืืช ื”ืฆืœืข ื”ืฉื ื™ื™ื” ื‘ึพ$3$, ื•ืžืชืงื‘ืœ ืžืœื‘ืŸ. ืžื” ืงืจื” ืœืฉื˜ื—?",
901
  "choices": [
902
  {
903
- "text": "ื”ืฉื˜ื— ืงื˜ืŸ ื‘ึพ$9$",
904
  "correct": true
905
  },
906
  {
907
- "text": "ื”ืฉื˜ื— ืœื ื”ืฉืชื ื”",
908
- "mistake": "shift_balance"
909
  },
910
  {
911
- "text": "ื”ืฉื˜ื— ื’ื“ืœ ื‘ึพ$9$",
912
- "mistake": "diff_order"
 
 
 
 
913
  }
914
  ]
915
  },
916
  {
917
- "question": "ืžืœื‘ืŸ ืืณ: $x + 6$ ืขืœ $x$. ืžืœื‘ืŸ ื‘ืณ: $x + 2$ ืขืœ $x + 3$. ื‘ื›ืžื” ืฉื˜ื— ืžืœื‘ืŸ ืืณ ื’ื“๏ฟฝ๏ฟฝืœ ืžืฉื˜ื— ืžืœื‘ืŸ ื‘ืณ?",
918
  "choices": [
919
  {
920
- "text": "$x โˆ’ 6$",
921
  "correct": true
922
  },
923
  {
924
- "text": "$11x + 6$",
925
- "mistake": "minus_paren"
926
  },
927
  {
928
- "text": "$6x โˆ’ 6$",
929
- "mistake": "ext_partial"
930
  },
931
  {
932
- "text": "$6 โˆ’ x$",
933
- "mistake": "diff_order"
934
  }
935
  ]
936
  },
937
  {
938
- "question": "ื’ื™ื ื” ืžืœื‘ื ื™ืช ืฉืžื™ื“ื•ืชื™ื” $x$ ืขืœ $x + 4$ ืžื•ืงืคืช ื‘ืฉื‘ื™ืœ ื‘ืจื•ื—ื‘ $1$ ืžื›ืœ ืฆื“. ืžื” ื”ืฉื˜ื— ืฉืœ ื”ื’ื™ื ื” ื™ื—ื“ ืขื ื”ืฉื‘ื™ืœ?",
939
  "choices": [
940
  {
941
- "text": "$xยฒ + 8x + 12$",
942
  "correct": true
943
  },
944
  {
945
- "text": "$xยฒ + 6x + 5$",
946
- "mistake": "frame_one_side"
947
  },
948
  {
949
- "text": "$xยฒ + 12$",
950
- "mistake": "ext_partial"
 
 
 
 
951
  }
952
  ]
953
  },
954
  {
955
- "question": "ื’ื™ื ื” ืžืœื‘ื ื™ืช ืฉืžื™ื“ื•ืชื™ื” $x$ ืขืœ $x + 4$ ืžื•ืงืคืช ื‘ืฉื‘ื™ืœ ื‘ืจื•ื—ื‘ $1$ ืžื›ืœ ืฆื“. ืžื” ืฉื˜ื— ื”ืฉื‘ื™ืœ ืœื‘ื“ื•?",
956
  "choices": [
957
  {
958
- "text": "$4x + 12$",
959
  "correct": true
960
  },
961
  {
962
- "text": "$12x + 12$",
963
- "mistake": "minus_paren"
964
  },
965
  {
966
- "text": "$2x + 5$",
967
- "mistake": "frame_one_side"
 
 
 
 
968
  }
969
  ]
970
  },
971
  {
972
- "question": "ืฉื˜ื— ืžืœื‘ืŸ ืฉืžื™ื“ื•ืชื™ื• $x + 7$ ืขืœ $x โˆ’ 1$ ืฉื•ื•ื” ืœืฉื˜ื— ืจื™ื‘ื•ืข ืฉืฆืœืขื• $x + 2$. ืžืฆืื• ืืช $x$.",
973
  "choices": [
974
  {
975
- "text": "$x = 5.5$",
976
  "correct": true
977
  },
978
  {
979
- "text": "$x = 11/6$",
980
- "mistake": "forgot_middle"
981
  },
982
  {
983
- "text": "$x = โˆ’2.75$",
984
- "mistake": "ext_partial"
 
 
 
 
985
  }
986
  ]
987
  },
988
  {
989
- "question": "ืฆืœืข ืจื™ื‘ื•ืข ื”ื™ื $x$. ืื•ืจืš ืžืœื‘ืŸ ื’ื“ื•ืœ ื‘ึพ$5$ ืžืฆืœืข ื”ืจื™ื‘ื•ืข, ื•ืจื•ื—ื‘ื• ืงื˜ืŸ ื‘ึพ$2$ ืžืžื ื”. ื‘ื›ืžื” ืฉื˜ื— ื”ืžืœื‘ืŸ ื’ื“ื•ืœ ืžืฉื˜ื— ื”ืจื™ื‘ื•ืข?",
990
  "choices": [
991
  {
992
- "text": "$3x โˆ’ 10$",
993
  "correct": true
994
  },
995
  {
996
- "text": "$โˆ’10$",
997
- "mistake": "ext_partial"
998
  },
999
  {
1000
- "text": "$โˆ’3x โˆ’ 10$",
1001
- "mistake": "sign_mid"
1002
  },
1003
  {
1004
- "text": "$6$",
1005
- "mistake": "area_perimeter"
1006
  }
1007
  ]
1008
  },
1009
  {
1010
- "question": "ืžืœื‘ืŸ ืฉืžื™ื“ื•ืชื™ื• $x + 3$ ืขืœ $x + 5$, ื•ืจื™ื‘ื•ืข ืฉืฆืœืขื• $x + 4$. ืื™ื–ื” ืฉื˜ื— ื’ื“ื•ืœ ื™ื•ืชืจ, ื•ื‘ื›ืžื”?",
1011
  "choices": [
1012
  {
1013
- "text": "ืฉื˜ื— ื”ืจื™ื‘ื•ืข, ื‘ึพ$1$",
1014
  "correct": true
1015
  },
1016
  {
1017
- "text": "ืฉื˜ื— ื”ืžืœื‘ืŸ, ื‘ึพ$1$",
1018
- "mistake": "diff_order"
1019
  },
1020
  {
1021
- "text": "ื”ืฉื˜ื—ื™ื ืฉื•ื•ื™ื",
1022
- "mistake": "shift_balance"
 
 
 
 
1023
  }
1024
  ]
1025
  },
1026
  {
1027
- "question": "ื ื™ืฆื‘ื™ ืžืฉื•ืœืฉ ื™ืฉืจ ื–ื•ื•ื™ืช ื”ื $x + 4$ ื•ึพ$x โˆ’ 2$. ืžื” ืฉื˜ื— ื”ืžืฉื•ืœืฉ?",
1028
  "choices": [
1029
  {
1030
- "text": "$(xยฒ + 2x โˆ’ 8) : 2$",
1031
  "correct": true
1032
  },
1033
  {
1034
- "text": "$xยฒ + 2x โˆ’ 8$",
1035
- "mistake": "forgot_half_area"
1036
  },
1037
  {
1038
- "text": "$(xยฒ โˆ’ 8) : 2$",
1039
- "mistake": "ext_partial"
1040
  }
1041
  ]
1042
- }
1043
- ]
1044
- },
1045
- {
1046
- "id": "t_formulas",
1047
- "unit": "t",
1048
- "name": "ื ื•ืกื—ืื•ืช ื”ื›ืคืœ ื”ืžืงื•ืฆืจ",
1049
- "short": "ื›ืคืœ ืžืงื•ืฆืจ",
1050
- "prereqs": [
1051
- "t_ext"
1052
- ],
1053
- "description": "$(a ยฑ b)ยฒ = aยฒ ยฑ 2ab + bยฒ$ ื•ึพ$(a + b)(a โˆ’ b) = aยฒ โˆ’ bยฒ$. ืืคืฉืจ ืœืจืื•ืช ืื•ืชืŸ ื’ื ื›ืฉื˜ื—ื™ื ืฉืœ ืจื™ื‘ื•ืขื™ื ื•ืžืœื‘ื ื™ื.",
1054
- "month": "ืกืคื˜ืžื‘ืจ",
1055
- "questions": [
1056
  {
1057
- "question": "$(2x โˆ’ 3)ยฒ = ?$",
1058
  "choices": [
1059
  {
1060
- "text": "$4xยฒ โˆ’ 12x + 9$",
1061
  "correct": true
1062
  },
1063
  {
1064
- "text": "$4xยฒ + 9$",
1065
- "mistake": "forgot_middle"
1066
  },
1067
  {
1068
- "text": "$4xยฒ โˆ’ 6x + 9$",
1069
- "mistake": "middle_no_2"
1070
  },
1071
  {
1072
- "text": "$2xยฒ โˆ’ 12x + 9$",
1073
  "mistake": "coef_not_raised"
1074
  }
1075
  ]
1076
  },
1077
  {
1078
- "question": "$(3x + 5)(3x โˆ’ 5) = ?$",
1079
  "choices": [
1080
  {
1081
- "text": "$9xยฒ โˆ’ 25$",
1082
  "correct": true
1083
  },
1084
  {
1085
- "text": "$9xยฒ + 25$",
1086
  "mistake": "diff_sign"
1087
  },
1088
  {
1089
- "text": "$3xยฒ โˆ’ 25$",
1090
- "mistake": "coef_not_raised"
1091
- },
1092
- {
1093
- "text": "$9xยฒ โˆ’ 30x + 25$",
1094
  "mistake": "diffsq_as_square"
1095
  }
1096
  ]
1097
  },
1098
  {
1099
- "question": "$(x + 6)ยฒ = ?$",
1100
  "choices": [
1101
  {
1102
- "text": "$xยฒ + 12x + 36$",
1103
  "correct": true
1104
  },
1105
  {
1106
- "text": "$xยฒ + 36$",
1107
- "mistake": "forgot_middle"
1108
  },
1109
  {
1110
- "text": "$xยฒ + 6x + 36$",
1111
- "mistake": "middle_no_2"
1112
  },
1113
  {
1114
- "text": "$xยฒ + 12x + 12$",
1115
- "mistake": "sq_as_double"
1116
  }
1117
  ]
1118
  },
1119
  {
1120
- "question": "$(x โˆ’ 4)ยฒ = ?$",
1121
  "choices": [
1122
  {
1123
- "text": "$xยฒ โˆ’ 8x + 16$",
1124
  "correct": true
1125
  },
1126
  {
1127
- "text": "$xยฒ โˆ’ 16$",
1128
- "mistake": "diffsq_as_square"
1129
  },
1130
  {
1131
- "text": "$xยฒ + 8x + 16$",
1132
- "mistake": "sign_mid"
1133
  },
1134
  {
1135
- "text": "$xยฒ โˆ’ 8x โˆ’ 16$",
1136
- "mistake": "neg_times_neg"
1137
  }
1138
  ]
1139
  },
1140
  {
1141
- "question": "$(a + 2b)ยฒ = ?$",
1142
  "choices": [
1143
  {
1144
- "text": "$aยฒ + 4ab + 4bยฒ$",
1145
  "correct": true
1146
  },
1147
  {
1148
- "text": "$aยฒ + 2ab + 4bยฒ$",
1149
  "mistake": "middle_no_2"
1150
  },
1151
  {
1152
- "text": "$aยฒ + 4ab + 2bยฒ$",
1153
  "mistake": "coef_not_raised"
1154
  },
1155
  {
1156
- "text": "$aยฒ + 4bยฒ$",
1157
  "mistake": "forgot_middle"
1158
  }
1159
  ]
1160
  },
1161
  {
1162
- "question": "$(7 โˆ’ x)(7 + x) = ?$",
1163
  "choices": [
1164
  {
1165
- "text": "$49 โˆ’ xยฒ$",
1166
  "correct": true
1167
  },
1168
  {
1169
- "text": "$xยฒ โˆ’ 49$",
1170
- "mistake": "diffsq_order"
1171
  },
1172
  {
1173
- "text": "$49 โˆ’ 14x + xยฒ$",
1174
  "mistake": "diffsq_as_square"
1175
  },
1176
  {
1177
- "text": "$14 โˆ’ xยฒ$",
1178
- "mistake": "sq_as_double"
1179
  }
1180
  ]
1181
  },
1182
  {
1183
- "question": "$(5x + 1)ยฒ = ?$",
1184
  "choices": [
1185
  {
1186
- "text": "$25xยฒ + 10x + 1$",
1187
  "correct": true
1188
  },
1189
  {
1190
- "text": "$25xยฒ + 5x + 1$",
1191
  "mistake": "middle_no_2"
1192
  },
1193
  {
1194
- "text": "$5xยฒ + 10x + 1$",
1195
  "mistake": "coef_not_raised"
1196
  },
1197
  {
1198
- "text": "$25xยฒ + 1$",
1199
  "mistake": "forgot_middle"
1200
  }
1201
  ]
1202
  },
1203
  {
1204
- "question": "ืจื™ื‘ื•ืข ืฉืฆืœืขื• $a + b$ ืžื—ื•ืœืง ืœืจื™ื‘ื•ืข ืฉืฆืœืขื• $a$, ืœืจื™ื‘ื•ืข ืฉืฆืœืขื• $b$ ื•ืœืฉื ื™ ืžืœื‘ื ื™ื. ืžื” ืกื›ื•ื ื”ืฉื˜ื—ื™ื ืฉืœ ืฉื ื™ ื”ืžืœื‘ื ื™ื?",
1205
  "choices": [
1206
  {
1207
- "text": "$2ab$",
1208
  "correct": true
1209
  },
1210
  {
1211
- "text": "$ab$",
1212
- "mistake": "middle_no_2"
1213
  },
1214
  {
1215
- "text": "$aยฒ + bยฒ$",
1216
- "mistake": "other_quantity"
 
 
 
 
1217
  }
1218
  ]
1219
  },
1220
  {
1221
- "question": "ื—ืฉื‘ื• ื‘ืขื–ืจืช ื ื•ืกื—ืช ื”ื›ืคืœ ื”ืžืงื•ืฆืจ: $51ยฒ = ?$",
1222
  "choices": [
1223
  {
1224
- "text": "$2601$",
1225
  "correct": true
1226
  },
1227
  {
1228
- "text": "$2501$",
1229
- "mistake": "forgot_middle"
1230
  },
1231
  {
1232
- "text": "$2551$",
1233
- "mistake": "middle_no_2"
 
 
 
 
1234
  }
1235
  ]
1236
  },
1237
  {
1238
- "question": "ื—ืฉื‘ื• ื‘ืขื–ืจืช ื ื•ืกื—ืช ื”ื›ืคืœ ื”ืžืงื•ืฆืจ: $98 ยท 102 = ?$",
1239
  "choices": [
1240
  {
1241
- "text": "$9996$",
1242
  "correct": true
1243
  },
1244
  {
1245
- "text": "$10004$",
1246
  "mistake": "diff_sign"
1247
  },
1248
  {
1249
- "text": "$9604$",
1250
  "mistake": "diffsq_as_square"
 
 
 
 
1251
  }
1252
  ]
1253
  }
 
418
  "mistake": "sign_product"
419
  }
420
  ]
421
+ },
 
 
 
 
 
 
 
 
 
 
 
 
 
422
  {
423
+ "question": "$(x โˆ’ 2)(x + 8) = ?$",
424
  "choices": [
425
  {
426
+ "text": "$xยฒ + 6x โˆ’ 16$",
427
  "correct": true
428
  },
429
  {
430
+ "text": "$xยฒ โˆ’ 16$",
431
+ "mistake": "ext_partial"
432
  },
433
  {
434
+ "text": "$xยฒ โˆ’ 6x โˆ’ 16$",
435
+ "mistake": "sign_mid"
436
+ },
437
+ {
438
+ "text": "$xยฒ + 6x + 16$",
439
+ "mistake": "sign_product"
440
  }
441
  ]
442
  },
443
  {
444
+ "question": "$(3x + 1)(2x โˆ’ 3) = ?$",
445
  "choices": [
446
  {
447
+ "text": "$6xยฒ โˆ’ 7x โˆ’ 3$",
448
  "correct": true
449
  },
450
  {
451
+ "text": "$6xยฒ โˆ’ 3$",
452
  "mistake": "ext_partial"
453
  },
454
  {
455
+ "text": "$6xยฒ + 7x โˆ’ 3$",
456
  "mistake": "sign_mid"
457
  },
458
  {
459
+ "text": "$6xยฒ โˆ’ 7x + 3$",
460
  "mistake": "sign_product"
461
  }
462
  ]
463
  },
464
  {
465
+ "question": "$(3a + 2b)(a + 2b) = ?$",
466
  "choices": [
467
  {
468
+ "text": "$3aยฒ + 8ab + 4bยฒ$",
469
  "correct": true
470
  },
471
  {
472
+ "text": "$3aยฒ + 4bยฒ$",
473
  "mistake": "ext_partial"
474
  },
475
  {
476
+ "text": "$3aยฒ โˆ’ 8ab + 4bยฒ$",
477
+ "mistake": "sign_mid"
478
+ }
479
+ ]
480
+ },
481
+ {
482
+ "question": "$(x + 5)(3x โˆ’ 5) = ?$",
483
+ "choices": [
484
+ {
485
+ "text": "$3xยฒ + 10x โˆ’ 25$",
486
+ "correct": true
487
+ },
488
+ {
489
+ "text": "$3xยฒ โˆ’ 25$",
490
  "mistake": "ext_partial"
491
  },
492
  {
493
+ "text": "$3xยฒ โˆ’ 10x โˆ’ 25$",
494
+ "mistake": "sign_mid"
495
+ },
496
+ {
497
+ "text": "$3xยฒ + 10x + 25$",
498
+ "mistake": "sign_product"
499
  }
500
  ]
501
  },
502
  {
503
+ "question": "$(3a + 2b)(2a โˆ’ 3b) = ?$",
504
  "choices": [
505
  {
506
+ "text": "$6aยฒ โˆ’ 5ab โˆ’ 6bยฒ$",
507
  "correct": true
508
  },
509
  {
510
+ "text": "$6aยฒ โˆ’ 6bยฒ$",
 
 
 
 
511
  "mistake": "ext_partial"
512
  },
513
  {
514
+ "text": "$6aยฒ + 5ab โˆ’ 6bยฒ$",
515
  "mistake": "sign_mid"
516
+ },
517
+ {
518
+ "text": "$6aยฒ โˆ’ 5ab + 6bยฒ$",
519
+ "mistake": "sign_product"
520
  }
521
  ]
522
  },
523
  {
524
+ "question": "$(7 โˆ’ x)(x + 2) = ?$",
525
  "choices": [
526
  {
527
+ "text": "$โˆ’xยฒ + 5x + 14$",
528
  "correct": true
529
  },
530
  {
531
+ "text": "$14 โˆ’ xยฒ$",
532
+ "mistake": "ext_partial"
533
  },
534
  {
535
+ "text": "$โˆ’xยฒ โˆ’ 5x + 14$",
536
+ "mistake": "sign_mid"
537
+ },
538
+ {
539
+ "text": "$xยฒ + 5x + 14$",
540
+ "mistake": "sign_product"
541
  }
542
  ]
543
  },
544
  {
545
+ "question": "$(x + 3)(x + 9) = ?$",
546
  "choices": [
547
  {
548
+ "text": "$xยฒ + 12x + 27$",
549
  "correct": true
550
  },
551
  {
552
+ "text": "$xยฒ + 27$",
553
+ "mistake": "ext_partial"
554
  },
555
  {
556
+ "text": "$xยฒ + 12x + 12$",
557
+ "mistake": "const_added"
558
+ },
559
+ {
560
+ "text": "$xยฒ + 27x + 12$",
561
  "mistake": "const_added"
562
  }
563
  ]
564
  },
565
  {
566
+ "question": "$(x + 4)(x + 7) = ?$",
567
  "choices": [
568
  {
569
+ "text": "$xยฒ + 11x + 28$",
570
  "correct": true
571
  },
572
  {
573
+ "text": "$xยฒ + 28$",
574
+ "mistake": "ext_partial"
575
  },
576
  {
577
+ "text": "$xยฒ + 11x + 11$",
578
+ "mistake": "const_added"
579
  },
580
  {
581
+ "text": "$xยฒ + 28x + 11$",
582
+ "mistake": "const_added"
583
  }
584
  ]
585
  },
586
  {
587
+ "question": "$(9 โˆ’ x)(x + 3) = ?$",
588
  "choices": [
589
  {
590
+ "text": "$โˆ’xยฒ + 6x + 27$",
591
  "correct": true
592
  },
593
  {
594
+ "text": "$27 โˆ’ xยฒ$",
595
  "mistake": "ext_partial"
596
  },
597
  {
598
+ "text": "$โˆ’xยฒ โˆ’ 6x + 27$",
599
  "mistake": "sign_mid"
600
  },
601
  {
602
+ "text": "$xยฒ + 6x + 27$",
603
  "mistake": "sign_product"
604
  }
605
  ]
606
  },
607
  {
608
+ "question": "$(2a + 3b)(2a + b) = ?$",
609
  "choices": [
610
  {
611
+ "text": "$4aยฒ + 8ab + 3bยฒ$",
612
  "correct": true
613
  },
614
  {
615
+ "text": "$4aยฒ + 3bยฒ$",
616
+ "mistake": "ext_partial"
617
  },
618
  {
619
+ "text": "$4aยฒ โˆ’ 8ab + 3bยฒ$",
620
+ "mistake": "sign_mid"
621
  }
622
  ]
623
  },
624
  {
625
+ "question": "$(2a + b)(a + b) = ?$",
626
  "choices": [
627
  {
628
+ "text": "$2aยฒ + 3ab + bยฒ$",
629
  "correct": true
630
  },
631
  {
632
+ "text": "$2aยฒ + bยฒ$",
633
+ "mistake": "ext_partial"
634
  },
635
  {
636
+ "text": "$2aยฒ โˆ’ 3ab + bยฒ$",
637
+ "mistake": "sign_mid"
638
+ }
639
+ ]
640
+ },
641
+ {
642
+ "question": "$(x โˆ’ 8)(2x + 7) = ?$",
643
+ "choices": [
644
+ {
645
+ "text": "$2xยฒ โˆ’ 9x โˆ’ 56$",
646
+ "correct": true
647
  },
648
  {
649
+ "text": "$2xยฒ โˆ’ 56$",
650
  "mistake": "ext_partial"
651
+ },
652
+ {
653
+ "text": "$2xยฒ + 9x โˆ’ 56$",
654
+ "mistake": "sign_mid"
655
+ },
656
+ {
657
+ "text": "$2xยฒ โˆ’ 9x + 56$",
658
+ "mistake": "sign_product"
659
  }
660
  ]
661
+ },
 
 
 
 
 
 
 
 
 
 
 
 
 
662
  {
663
+ "question": "$(a + 2b)(2a โˆ’ 2b) = ?$",
664
  "choices": [
665
  {
666
+ "text": "$2aยฒ + 2ab โˆ’ 4bยฒ$",
667
  "correct": true
668
  },
669
  {
670
+ "text": "$2aยฒ โˆ’ 4bยฒ$",
671
+ "mistake": "ext_partial"
672
  },
673
  {
674
+ "text": "$2aยฒ โˆ’ 2ab โˆ’ 4bยฒ$",
675
+ "mistake": "sign_mid"
676
  },
677
  {
678
+ "text": "$2aยฒ + 2ab + 4bยฒ$",
679
+ "mistake": "sign_product"
680
  }
681
  ]
682
  },
683
  {
684
+ "question": "$(2x โˆ’ 6)(x + 5) = ?$",
685
  "choices": [
686
  {
687
+ "text": "$2xยฒ + 4x โˆ’ 30$",
688
  "correct": true
689
  },
690
  {
691
+ "text": "$2xยฒ โˆ’ 30$",
692
+ "mistake": "ext_partial"
693
  },
694
  {
695
+ "text": "$2xยฒ โˆ’ 4x โˆ’ 30$",
696
+ "mistake": "sign_mid"
697
  },
698
  {
699
+ "text": "$2xยฒ + 4x + 30$",
700
+ "mistake": "sign_product"
701
  }
702
  ]
703
  },
704
  {
705
+ "question": "$(6 โˆ’ x)(x + 8) = ?$",
706
  "choices": [
707
  {
708
+ "text": "$โˆ’xยฒ โˆ’ 2x + 48$",
709
  "correct": true
710
  },
711
  {
712
+ "text": "$48 โˆ’ xยฒ$",
713
+ "mistake": "ext_partial"
714
  },
715
  {
716
+ "text": "$โˆ’xยฒ + 2x + 48$",
717
+ "mistake": "sign_mid"
718
  },
719
  {
720
+ "text": "$xยฒ โˆ’ 2x + 48$",
721
+ "mistake": "sign_product"
722
  }
723
  ]
724
  },
725
  {
726
+ "question": "$(8 โˆ’ x)(x + 4) = ?$",
727
  "choices": [
728
  {
729
+ "text": "$โˆ’xยฒ + 4x + 32$",
730
  "correct": true
731
  },
732
  {
733
+ "text": "$32 โˆ’ xยฒ$",
734
+ "mistake": "ext_partial"
735
  },
736
  {
737
+ "text": "$โˆ’xยฒ โˆ’ 4x + 32$",
738
+ "mistake": "sign_mid"
739
  },
740
  {
741
+ "text": "$xยฒ + 4x + 32$",
742
+ "mistake": "sign_product"
743
  }
744
  ]
745
  },
746
  {
747
+ "question": "$(x โˆ’ 9)(3x โˆ’ 8) = ?$",
748
  "choices": [
749
  {
750
+ "text": "$3xยฒ โˆ’ 35x + 72$",
751
  "correct": true
752
  },
753
  {
754
+ "text": "$3xยฒ + 72$",
755
  "mistake": "ext_partial"
756
  },
757
  {
758
+ "text": "$3xยฒ + 35x + 72$",
759
+ "mistake": "sign_mid"
760
+ },
761
+ {
762
+ "text": "$3xยฒ โˆ’ 35x โˆ’ 72$",
763
+ "mistake": "neg_times_neg"
764
  }
765
  ]
766
  },
767
  {
768
+ "question": "$(2x โˆ’ 1)(x + 6) = ?$",
769
  "choices": [
770
  {
771
+ "text": "$2xยฒ + 11x โˆ’ 6$",
772
  "correct": true
773
  },
774
  {
775
+ "text": "$2xยฒ โˆ’ 6$",
776
+ "mistake": "ext_partial"
777
  },
778
  {
779
+ "text": "$2xยฒ โˆ’ 11x โˆ’ 6$",
780
+ "mistake": "sign_mid"
781
  },
782
  {
783
+ "text": "$2xยฒ + 11x + 6$",
784
+ "mistake": "sign_product"
785
  }
786
  ]
787
  },
788
  {
789
+ "question": "$(2 โˆ’ x)(x + 1) = ?$",
790
  "choices": [
791
  {
792
+ "text": "$โˆ’xยฒ + x + 2$",
793
  "correct": true
794
  },
795
  {
796
+ "text": "$2 โˆ’ xยฒ$",
797
+ "mistake": "ext_partial"
798
  },
799
  {
800
+ "text": "$โˆ’xยฒ โˆ’ x + 2$",
801
+ "mistake": "sign_mid"
802
+ },
803
+ {
804
+ "text": "$xยฒ + x + 2$",
805
+ "mistake": "sign_product"
806
  }
807
  ]
808
  },
809
  {
810
+ "question": "$(x + 5)(x + 7) = ?$",
811
  "choices": [
812
  {
813
+ "text": "$xยฒ + 12x + 35$",
814
  "correct": true
815
  },
816
  {
817
+ "text": "$xยฒ + 35$",
818
+ "mistake": "ext_partial"
819
  },
820
  {
821
+ "text": "$xยฒ + 12x + 12$",
822
+ "mistake": "const_added"
823
  },
824
  {
825
+ "text": "$xยฒ + 35x + 12$",
826
+ "mistake": "const_added"
827
  }
828
  ]
829
+ }
830
+ ]
831
+ },
832
+ {
833
+ "id": "t_simplify",
834
+ "unit": "t",
835
+ "name": "ืคื™ืฉื•ื˜ ื‘ื™ื˜ื•ื™ื™ื ื‘ืขื–ืจืช ื”ืคื™ืœื•ื’ ื”ืžื•ืจื—ื‘",
836
+ "short": "ืคื™ืฉื•ื˜ ื‘ื™ื˜ื•ื™ื™ื",
837
+ "prereqs": [
838
+ "t_ext"
839
+ ],
840
+ "description": "ืคื•ืชื—ื™ื ืกื•ื’ืจื™ื™ื ื‘ืคื™ืœื•ื’ ื”ืžื•ืจื—ื‘, ืฉืžื™ื ืœื‘ ืœืกื™ืžืŸ ืฉืœืคื ื™ ื›ืœ ืžื›ืคืœื” ื•ืžื›ื ืกื™ื ืื™ื‘ืจื™ื ื“ื•ืžื™ื.",
841
+ "month": "ืกืคื˜ืžื‘ืจ",
842
+ "questions": [
843
  {
844
+ "question": "ืคืฉื˜ื•: $(x + 2)(x + 3) โˆ’ x(x + 4)$",
845
  "choices": [
846
  {
847
+ "text": "$x + 6$",
848
  "correct": true
849
  },
850
  {
851
+ "text": "$9x + 6$",
852
+ "mistake": "minus_paren"
853
+ },
854
+ {
855
+ "text": "$6 โˆ’ 4x$",
856
+ "mistake": "ext_partial"
857
+ }
858
+ ]
859
+ },
860
+ {
861
+ "question": "ืคืฉื˜ื•: $(x โˆ’ 1)(x + 5) + (x + 2)(x โˆ’ 3)$",
862
+ "choices": [
863
+ {
864
+ "text": "$2xยฒ + 3x โˆ’ 11$",
865
+ "correct": true
866
+ },
867
+ {
868
+ "text": "$2xยฒ โˆ’ 11$",
869
+ "mistake": "ext_partial"
870
+ },
871
+ {
872
+ "text": "$2xยฒ โˆ’ 3x โˆ’ 11$",
873
+ "mistake": "sign_mid"
874
+ },
875
+ {
876
+ "text": "$2xยฒ + 3x + 11$",
877
+ "mistake": "sign_product"
878
+ }
879
+ ]
880
+ },
881
+ {
882
+ "question": "ืคืฉื˜ื•: $(2x + 1)(x + 4) โˆ’ 2xยฒ$",
883
+ "choices": [
884
+ {
885
+ "text": "$9x + 4$",
886
+ "correct": true
887
+ },
888
+ {
889
+ "text": "$8x + 4$",
890
+ "mistake": "ext_partial"
891
+ },
892
+ {
893
+ "text": "$4$",
894
+ "mistake": "ext_partial"
895
+ },
896
+ {
897
+ "text": "$4xยฒ + 9x + 4$",
898
+ "mistake": "minus_paren"
899
+ }
900
+ ]
901
+ },
902
+ {
903
+ "question": "ืคืฉื˜ื•: $(x + 3)(x โˆ’ 3) โˆ’ (x โˆ’ 1)(x + 2)$",
904
+ "choices": [
905
+ {
906
+ "text": "$โˆ’x โˆ’ 7$",
907
+ "correct": true
908
+ },
909
+ {
910
+ "text": "$x โˆ’ 11$",
911
+ "mistake": "minus_paren"
912
+ },
913
+ {
914
+ "text": "$โˆ’7$",
915
+ "mistake": "ext_partial"
916
+ },
917
+ {
918
+ "text": "$x โˆ’ 7$",
919
+ "mistake": "sign_mid"
920
+ }
921
+ ]
922
+ },
923
+ {
924
+ "question": "ืคืฉื˜ื•: $3x(x + 1) โˆ’ (x + 2)(3x โˆ’ 1)$",
925
+ "choices": [
926
+ {
927
+ "text": "$2 โˆ’ 2x$",
928
+ "correct": true
929
+ },
930
+ {
931
+ "text": "$8x โˆ’ 2$",
932
+ "mistake": "minus_paren"
933
+ },
934
+ {
935
+ "text": "$3x + 2$",
936
+ "mistake": "ext_partial"
937
+ }
938
+ ]
939
+ },
940
+ {
941
+ "question": "ืคืฉื˜ื•: $(a + 2)(a + 5) โˆ’ (a + 1)(a + 6)$",
942
+ "choices": [
943
+ {
944
+ "text": "$4$",
945
+ "correct": true
946
+ },
947
+ {
948
+ "text": "$14a + 16$",
949
+ "mistake": "minus_paren"
950
+ },
951
+ {
952
+ "text": "$0$",
953
+ "mistake": "const_added"
954
+ }
955
+ ]
956
+ },
957
+ {
958
+ "question": "ืคืฉื˜ื•: $(2x โˆ’ 3)(x + 1) โˆ’ (x + 1)(x โˆ’ 1)$",
959
+ "choices": [
960
+ {
961
+ "text": "$xยฒ โˆ’ x โˆ’ 2$",
962
+ "correct": true
963
+ },
964
+ {
965
+ "text": "$xยฒ โˆ’ x โˆ’ 4$",
966
+ "mistake": "minus_paren"
967
+ },
968
+ {
969
+ "text": "$xยฒ + x โˆ’ 2$",
970
+ "mistake": "sign_mid"
971
+ },
972
+ {
973
+ "text": "$xยฒ โˆ’ 2$",
974
+ "mistake": "ext_partial"
975
+ }
976
+ ]
977
+ },
978
+ {
979
+ "question": "ืื™ื–ื” ื‘ื™ื˜ื•ื™ ืฉื•ื•ื” ืœึพ$(x + 4)(x โˆ’ 1) โˆ’ xยฒ$?",
980
+ "choices": [
981
+ {
982
+ "text": "$3x โˆ’ 4$",
983
+ "correct": true
984
+ },
985
+ {
986
+ "text": "$โˆ’4$",
987
+ "mistake": "ext_partial"
988
+ },
989
+ {
990
+ "text": "$โˆ’3x โˆ’ 4$",
991
+ "mistake": "sign_mid"
992
+ },
993
+ {
994
+ "text": "$3x + 4$",
995
+ "mistake": "sign_product"
996
+ }
997
+ ]
998
+ },
999
+ {
1000
+ "question": "ืคืฉื˜ื•: $5 โˆ’ (x + 1)(x โˆ’ 2)$",
1001
+ "choices": [
1002
+ {
1003
+ "text": "$โˆ’xยฒ + x + 7$",
1004
+ "correct": true
1005
+ },
1006
+ {
1007
+ "text": "$โˆ’xยฒ โˆ’ x + 3$",
1008
+ "mistake": "minus_paren"
1009
+ },
1010
+ {
1011
+ "text": "$7 โˆ’ xยฒ$",
1012
+ "mistake": "ext_partial"
1013
+ }
1014
+ ]
1015
+ },
1016
+ {
1017
+ "question": "ืคืฉื˜ื•: $2(x + 3)(x โˆ’ 1)$",
1018
+ "choices": [
1019
+ {
1020
+ "text": "$2xยฒ + 4x โˆ’ 6$",
1021
+ "correct": true
1022
+ },
1023
+ {
1024
+ "text": "$4xยฒ + 8x โˆ’ 12$",
1025
+ "mistake": "double_both"
1026
+ },
1027
+ {
1028
+ "text": "$2xยฒ + 4x โˆ’ 3$",
1029
+ "mistake": "partial_dist"
1030
+ },
1031
+ {
1032
+ "text": "$2xยฒ โˆ’ 6$",
1033
+ "mistake": "ext_partial"
1034
+ }
1035
+ ]
1036
+ },
1037
+ {
1038
+ "question": "ืคืฉื˜ื•: $(x + 7)(x โˆ’ 5) + (x โˆ’ 1)(x + 6)$",
1039
+ "choices": [
1040
+ {
1041
+ "text": "$2xยฒ + 7x โˆ’ 41$",
1042
+ "correct": true
1043
+ },
1044
+ {
1045
+ "text": "$2xยฒ โˆ’ 41$",
1046
+ "mistake": "ext_partial"
1047
+ },
1048
+ {
1049
+ "text": "$2xยฒ โˆ’ 7x โˆ’ 41$",
1050
+ "mistake": "sign_mid"
1051
+ }
1052
+ ]
1053
+ },
1054
+ {
1055
+ "question": "ืคืฉื˜ื•: $4(x + 7)(x โˆ’ 2)$",
1056
+ "choices": [
1057
+ {
1058
+ "text": "$4xยฒ + 20x โˆ’ 56$",
1059
+ "correct": true
1060
+ },
1061
+ {
1062
+ "text": "$4xยฒ โˆ’ 56$",
1063
+ "mistake": "ext_partial"
1064
+ },
1065
+ {
1066
+ "text": "$4xยฒ + 20x โˆ’ 14$",
1067
+ "mistake": "partial_dist"
1068
+ },
1069
+ {
1070
+ "text": "$16xยฒ + 80x โˆ’ 224$",
1071
+ "mistake": "double_both"
1072
+ }
1073
+ ]
1074
+ },
1075
+ {
1076
+ "question": "ืคืฉื˜ื•: $(x + 2)(x + 1) โˆ’ x(x + 7)$",
1077
+ "choices": [
1078
+ {
1079
+ "text": "$โˆ’4x + 2$",
1080
+ "correct": true
1081
+ },
1082
+ {
1083
+ "text": "$10x + 2$",
1084
+ "mistake": "minus_paren"
1085
+ },
1086
+ {
1087
+ "text": "$4x + 2$",
1088
+ "mistake": "sign_mid"
1089
+ },
1090
+ {
1091
+ "text": "$โˆ’7x + 2$",
1092
+ "mistake": "ext_partial"
1093
+ }
1094
+ ]
1095
+ },
1096
+ {
1097
+ "question": "ืคืฉื˜ื•: $(x โˆ’ 7)(x + 5) โˆ’ x(x + 1)$",
1098
+ "choices": [
1099
+ {
1100
+ "text": "$โˆ’3x โˆ’ 35$",
1101
+ "correct": true
1102
+ },
1103
+ {
1104
+ "text": "$โˆ’x โˆ’ 35$",
1105
+ "mistake": "ext_partial"
1106
+ },
1107
+ {
1108
+ "text": "$3x โˆ’ 35$",
1109
+ "mistake": "sign_mid"
1110
+ }
1111
+ ]
1112
+ },
1113
+ {
1114
+ "question": "ืคืฉื˜ื•: $(x + 3)(x + 2) โˆ’ x(x + 2)$",
1115
+ "choices": [
1116
+ {
1117
+ "text": "$3x + 6$",
1118
+ "correct": true
1119
+ },
1120
+ {
1121
+ "text": "$โˆ’3x + 6$",
1122
+ "mistake": "sign_mid"
1123
+ },
1124
+ {
1125
+ "text": "$โˆ’2x + 6$",
1126
+ "mistake": "ext_partial"
1127
+ },
1128
+ {
1129
+ "text": "$7x + 6$",
1130
+ "mistake": "minus_paren"
1131
+ }
1132
+ ]
1133
+ },
1134
+ {
1135
+ "question": "ืคืฉื˜ื•: $(x โˆ’ 5)(x + 2) โˆ’ (x + 7)(x + 4)$",
1136
+ "choices": [
1137
+ {
1138
+ "text": "$โˆ’14x โˆ’ 38$",
1139
+ "correct": true
1140
+ },
1141
+ {
1142
+ "text": "$โˆ’38$",
1143
+ "mistake": "ext_partial"
1144
+ },
1145
+ {
1146
+ "text": "$8x + 18$",
1147
+ "mistake": "minus_paren"
1148
+ },
1149
+ {
1150
+ "text": "$14x โˆ’ 38$",
1151
+ "mistake": "sign_mid"
1152
+ }
1153
+ ]
1154
+ },
1155
+ {
1156
+ "question": "ืื™ื–ื” ื‘ื™ื˜ื•ื™ ืฉื•ื•ื” ืœึพ$(x โˆ’ 5)(x + 7) โˆ’ (x โˆ’ 5)(x + 5)$?",
1157
+ "choices": [
1158
+ {
1159
+ "text": "$2x โˆ’ 10$",
1160
+ "correct": true
1161
+ },
1162
+ {
1163
+ "text": "$โˆ’10$",
1164
+ "mistake": "ext_partial"
1165
+ },
1166
+ {
1167
+ "text": "$2x โˆ’ 60$",
1168
+ "mistake": "minus_paren"
1169
+ },
1170
+ {
1171
+ "text": "$โˆ’2x โˆ’ 10$",
1172
+ "mistake": "sign_mid"
1173
+ }
1174
+ ]
1175
+ },
1176
+ {
1177
+ "question": "ืคืฉื˜ื•: $(x โˆ’ 5)(x + 1) โˆ’ (x + 5)(x โˆ’ 4)$",
1178
+ "choices": [
1179
+ {
1180
+ "text": "$โˆ’5x + 15$",
1181
+ "correct": true
1182
+ },
1183
+ {
1184
+ "text": "$5x + 15$",
1185
+ "mistake": "sign_mid"
1186
+ },
1187
+ {
1188
+ "text": "$15$",
1189
+ "mistake": "ext_partial"
1190
+ },
1191
+ {
1192
+ "text": "$โˆ’3x โˆ’ 25$",
1193
+ "mistake": "minus_paren"
1194
+ }
1195
+ ]
1196
+ },
1197
+ {
1198
+ "question": "ืคืฉื˜ื•: $(x โˆ’ 6)(x โˆ’ 7) โˆ’ (x + 6)(x โˆ’ 2)$",
1199
+ "choices": [
1200
+ {
1201
+ "text": "$โˆ’17x + 54$",
1202
+ "correct": true
1203
+ },
1204
+ {
1205
+ "text": "$54$",
1206
+ "mistake": "ext_partial"
1207
+ },
1208
+ {
1209
+ "text": "$โˆ’9x + 30$",
1210
+ "mistake": "minus_paren"
1211
+ },
1212
+ {
1213
+ "text": "$17x + 54$",
1214
+ "mistake": "sign_mid"
1215
+ }
1216
+ ]
1217
+ },
1218
+ {
1219
+ "question": "ืื™ื–ื” ื‘ื™ื˜ื•ื™ ืฉื•ื•ื” ืœึพ$(x โˆ’ 2)(x + 3) โˆ’ x(x โˆ’ 3)$?",
1220
+ "choices": [
1221
+ {
1222
+ "text": "$4x โˆ’ 6$",
1223
+ "correct": true
1224
+ },
1225
+ {
1226
+ "text": "$โˆ’4x โˆ’ 6$",
1227
+ "mistake": "sign_mid"
1228
+ },
1229
+ {
1230
+ "text": "$โˆ’2x โˆ’ 6$",
1231
+ "mistake": "minus_paren"
1232
+ },
1233
+ {
1234
+ "text": "$3x โˆ’ 6$",
1235
+ "mistake": "ext_partial"
1236
+ }
1237
+ ]
1238
+ },
1239
+ {
1240
+ "question": "ืคืฉื˜ื•: $3 โˆ’ (x + 2)(x โˆ’ 4)$",
1241
+ "choices": [
1242
+ {
1243
+ "text": "$โˆ’xยฒ + 2x + 11$",
1244
+ "correct": true
1245
+ },
1246
+ {
1247
+ "text": "$โˆ’xยฒ + 11$",
1248
+ "mistake": "ext_partial"
1249
+ },
1250
+ {
1251
+ "text": "$โˆ’xยฒ โˆ’ 2x โˆ’ 5$",
1252
+ "mistake": "minus_paren"
1253
+ },
1254
+ {
1255
+ "text": "$โˆ’xยฒ โˆ’ 2x + 11$",
1256
+ "mistake": "sign_mid"
1257
+ }
1258
+ ]
1259
+ },
1260
+ {
1261
+ "question": "ืื™ื–ื” ื‘ื™ื˜ื•ื™ ืฉื•ื•ื” ืœึพ$(x + 7)(x โˆ’ 5) + (x โˆ’ 7)(x + 3)$?",
1262
+ "choices": [
1263
+ {
1264
+ "text": "$2xยฒ โˆ’ 2x โˆ’ 56$",
1265
+ "correct": true
1266
+ },
1267
+ {
1268
+ "text": "$2xยฒ + 2x โˆ’ 56$",
1269
+ "mistake": "sign_mid"
1270
+ },
1271
+ {
1272
+ "text": "$2xยฒ โˆ’ 56$",
1273
+ "mistake": "ext_partial"
1274
+ }
1275
+ ]
1276
+ },
1277
+ {
1278
+ "question": "ืคืฉื˜ื•: $(x + 3)(x โˆ’ 4) โˆ’ xยฒ$",
1279
+ "choices": [
1280
+ {
1281
+ "text": "$โˆ’x โˆ’ 12$",
1282
+ "correct": true
1283
+ },
1284
+ {
1285
+ "text": "$x โˆ’ 12$",
1286
+ "mistake": "sign_mid"
1287
+ },
1288
+ {
1289
+ "text": "$โˆ’12$",
1290
+ "mistake": "ext_partial"
1291
+ }
1292
+ ]
1293
+ },
1294
+ {
1295
+ "question": "ืื™ื–ื” ื‘ื™ื˜ื•ื™ ืฉื•ื•ื” ืœึพ$10 โˆ’ (x โˆ’ 5)(x โˆ’ 1)$?",
1296
+ "choices": [
1297
+ {
1298
+ "text": "$โˆ’xยฒ + 6x + 5$",
1299
+ "correct": true
1300
+ },
1301
+ {
1302
+ "text": "$โˆ’xยฒ โˆ’ 6x + 5$",
1303
+ "mistake": "sign_mid"
1304
+ },
1305
+ {
1306
+ "text": "$โˆ’xยฒ + 5$",
1307
+ "mistake": "ext_partial"
1308
+ },
1309
+ {
1310
+ "text": "$โˆ’xยฒ โˆ’ 6x + 15$",
1311
+ "mistake": "minus_paren"
1312
+ }
1313
+ ]
1314
+ },
1315
+ {
1316
+ "question": "ืคืฉื˜ื•: $3(x โˆ’ 2)(x โˆ’ 5)$",
1317
+ "choices": [
1318
+ {
1319
+ "text": "$3xยฒ โˆ’ 21x + 30$",
1320
+ "correct": true
1321
+ },
1322
+ {
1323
+ "text": "$3xยฒ + 21x + 30$",
1324
+ "mistake": "sign_mid"
1325
+ },
1326
+ {
1327
+ "text": "$9xยฒ โˆ’ 63x + 90$",
1328
+ "mistake": "double_both"
1329
+ },
1330
+ {
1331
+ "text": "$3xยฒ โˆ’ 21x + 10$",
1332
+ "mistake": "partial_dist"
1333
+ }
1334
+ ]
1335
+ },
1336
+ {
1337
+ "question": "ืคืฉื˜ื•: $6 โˆ’ (x โˆ’ 6)(x + 1)$",
1338
+ "choices": [
1339
+ {
1340
+ "text": "$โˆ’xยฒ + 5x + 12$",
1341
+ "correct": true
1342
+ },
1343
+ {
1344
+ "text": "$โˆ’xยฒ โˆ’ 5x$",
1345
+ "mistake": "minus_paren"
1346
+ },
1347
+ {
1348
+ "text": "$โˆ’xยฒ โˆ’ 5x + 12$",
1349
+ "mistake": "sign_mid"
1350
+ },
1351
+ {
1352
+ "text": "$โˆ’xยฒ + 12$",
1353
+ "mistake": "ext_partial"
1354
+ }
1355
+ ]
1356
+ },
1357
+ {
1358
+ "question": "ืคืฉื˜ื•: $(x โˆ’ 6)(x + 7) + (x + 3)(x โˆ’ 2)$",
1359
+ "choices": [
1360
+ {
1361
+ "text": "$2xยฒ + 2x โˆ’ 48$",
1362
+ "correct": true
1363
+ },
1364
+ {
1365
+ "text": "$2xยฒ โˆ’ 48$",
1366
+ "mistake": "ext_partial"
1367
+ },
1368
+ {
1369
+ "text": "$2xยฒ โˆ’ 2x โˆ’ 48$",
1370
+ "mistake": "sign_mid"
1371
+ }
1372
+ ]
1373
+ },
1374
+ {
1375
+ "question": "ืคืฉื˜ื•: $(3x โˆ’ 2)(x + 6) โˆ’ 3xยฒ$",
1376
+ "choices": [
1377
+ {
1378
+ "text": "$16x โˆ’ 12$",
1379
+ "correct": true
1380
+ },
1381
+ {
1382
+ "text": "$โˆ’16x โˆ’ 12$",
1383
+ "mistake": "sign_mid"
1384
+ },
1385
+ {
1386
+ "text": "$โˆ’12$",
1387
+ "mistake": "ext_partial"
1388
+ }
1389
+ ]
1390
+ },
1391
+ {
1392
+ "question": "ืคืฉื˜ื•: $5 โˆ’ (x โˆ’ 3)(x + 1)$",
1393
+ "choices": [
1394
+ {
1395
+ "text": "$โˆ’xยฒ + 2x + 8$",
1396
+ "correct": true
1397
+ },
1398
+ {
1399
+ "text": "$โˆ’xยฒ + 8$",
1400
+ "mistake": "ext_partial"
1401
+ },
1402
+ {
1403
+ "text": "$โˆ’xยฒ โˆ’ 2x + 2$",
1404
+ "mistake": "minus_paren"
1405
+ },
1406
+ {
1407
+ "text": "$โˆ’xยฒ โˆ’ 2x + 8$",
1408
+ "mistake": "sign_mid"
1409
+ }
1410
+ ]
1411
+ },
1412
+ {
1413
+ "question": "ืคืฉื˜ื•: $(x โˆ’ 5)(x โˆ’ 6) โˆ’ xยฒ$",
1414
+ "choices": [
1415
+ {
1416
+ "text": "$โˆ’11x + 30$",
1417
+ "correct": true
1418
+ },
1419
+ {
1420
+ "text": "$30$",
1421
+ "mistake": "ext_partial"
1422
+ },
1423
+ {
1424
+ "text": "$11x + 30$",
1425
+ "mistake": "sign_mid"
1426
+ }
1427
+ ]
1428
+ }
1429
+ ]
1430
+ },
1431
+ {
1432
+ "id": "t_ext_eq",
1433
+ "unit": "t",
1434
+ "name": "ืคืชืจื•ืŸ ืžืฉื•ื•ืื•ืช ื‘ืขื–ืจืช ื”ืคื™ืœื•ื’ ื”ืžื•ืจื—ื‘",
1435
+ "short": "ืžืฉื•ื•ืื” ื•ืคื™ืœื•ื’",
1436
+ "prereqs": [
1437
+ "t_ext"
1438
+ ],
1439
+ "description": "ืคื•ืชื—ื™ื ืกื•ื’ืจื™ื™ื ื‘ืคื™ืœื•ื’ ื”ืžื•ืจื—ื‘, ื”ืื™ื‘ืจื™ื ืขื $xยฒ$ ืžืชื‘ื˜ืœื™ื, ื•ืคื•ืชืจื™ื ืžืฉื•ื•ืื” ืžืžืขืœื” ืจืืฉื•ื ื”.",
1440
+ "month": "ืกืคื˜ืžื‘ืจ",
1441
+ "questions": [
1442
+ {
1443
+ "question": "ืคืชืจื•: $(x + 2)(x + 3) = xยฒ + 16$",
1444
+ "choices": [
1445
+ {
1446
+ "text": "$x = 2$",
1447
+ "correct": true
1448
+ },
1449
+ {
1450
+ "text": "$x = 4.4$",
1451
+ "mistake": "move_sign"
1452
+ },
1453
+ {
1454
+ "text": "$x = 10$",
1455
+ "mistake": "forgot_divide"
1456
+ },
1457
+ {
1458
+ "text": "ืื™ืŸ ืคืชืจื•ืŸ",
1459
+ "mistake": "ext_partial"
1460
+ }
1461
+ ]
1462
+ },
1463
+ {
1464
+ "question": "ืคืชืจื•: $(x + 4)(x โˆ’ 1) = xยฒ + 8$",
1465
+ "choices": [
1466
+ {
1467
+ "text": "$x = 4$",
1468
+ "correct": true
1469
+ },
1470
+ {
1471
+ "text": "$x = 4/3$",
1472
+ "mistake": "move_sign"
1473
+ },
1474
+ {
1475
+ "text": "$x = 12$",
1476
+ "mistake": "forgot_divide"
1477
+ },
1478
+ {
1479
+ "text": "$x = โˆ’4$",
1480
+ "mistake": "sign_mid"
1481
+ }
1482
+ ]
1483
+ },
1484
+ {
1485
+ "question": "ืคืชืจื•: $(2x โˆ’ 1)(x + 3) = 2xยฒ + 1$",
1486
+ "choices": [
1487
+ {
1488
+ "text": "$x = 0.8$",
1489
+ "correct": true
1490
+ },
1491
+ {
1492
+ "text": "$x = โˆ’0.4$",
1493
+ "mistake": "move_sign"
1494
+ },
1495
+ {
1496
+ "text": "$x = 4$",
1497
+ "mistake": "forgot_divide"
1498
+ },
1499
+ {
1500
+ "text": "ืื™ืŸ ืคืชืจื•ืŸ",
1501
+ "mistake": "ext_partial"
1502
+ }
1503
+ ]
1504
+ },
1505
+ {
1506
+ "question": "ืคืชืจื•: $(x โˆ’ 3)(x โˆ’ 5) = xยฒ โˆ’ 1$",
1507
+ "choices": [
1508
+ {
1509
+ "text": "$x = 2$",
1510
+ "correct": true
1511
+ },
1512
+ {
1513
+ "text": "$x = โˆ’2$",
1514
+ "mistake": "neg_divide"
1515
+ },
1516
+ {
1517
+ "text": "$x = โˆ’1.75$",
1518
+ "mistake": "move_sign"
1519
+ },
1520
+ {
1521
+ "text": "$x = โˆ’16$",
1522
+ "mistake": "forgot_divide"
1523
+ }
1524
+ ]
1525
+ },
1526
+ {
1527
+ "question": "ืคืชืจื•: $x(x + 6) = (x + 2)(x + 3)$",
1528
+ "choices": [
1529
+ {
1530
+ "text": "$x = 6$",
1531
+ "correct": true
1532
+ },
1533
+ {
1534
+ "text": "$x = 1$",
1535
+ "mistake": "ext_partial"
1536
+ },
1537
+ {
1538
+ "text": "$x = 6/11$",
1539
+ "mistake": "move_sign"
1540
+ }
1541
+ ]
1542
+ },
1543
+ {
1544
+ "question": "ืคืชืจื•: $(x + 5)(x โˆ’ 2) โˆ’ xยฒ = 11$",
1545
+ "choices": [
1546
+ {
1547
+ "text": "$x = 7$",
1548
+ "correct": true
1549
+ },
1550
+ {
1551
+ "text": "$x = โˆ’7$",
1552
+ "mistake": "sign_mid"
1553
+ },
1554
+ {
1555
+ "text": "$x = 21$",
1556
+ "mistake": "forgot_divide"
1557
+ },
1558
+ {
1559
+ "text": "$x = 1/3$",
1560
+ "mistake": "move_sign"
1561
+ }
1562
+ ]
1563
+ },
1564
+ {
1565
+ "question": "ืคืชืจื•: $(3 โˆ’ x)(x + 4) = 10 โˆ’ xยฒ$",
1566
+ "choices": [
1567
+ {
1568
+ "text": "$x = 2$",
1569
+ "correct": true
1570
+ },
1571
+ {
1572
+ "text": "$x = โˆ’2$",
1573
+ "mistake": "neg_divide"
1574
+ },
1575
+ {
1576
+ "text": "$x = โˆ’22$",
1577
+ "mistake": "move_sign"
1578
+ }
1579
+ ]
1580
+ },
1581
+ {
1582
+ "question": "ืคืชืจื•: $(2x + 3)(x โˆ’ 4) = 2(xยฒ โˆ’ 5)$",
1583
+ "choices": [
1584
+ {
1585
+ "text": "$x = โˆ’0.4$",
1586
+ "correct": true
1587
+ },
1588
+ {
1589
+ "text": "$x = โˆ’1.4$",
1590
+ "mistake": "partial_dist"
1591
+ },
1592
+ {
1593
+ "text": "$x = 0.4$",
1594
+ "mistake": "neg_divide"
1595
+ },
1596
+ {
1597
+ "text": "$x = 4.4$",
1598
+ "mistake": "move_sign"
1599
+ }
1600
+ ]
1601
+ },
1602
+ {
1603
+ "question": "ืžื›ืคืœืช $x + 1$ ื‘ึพ$x + 7$ ื’ื“ื•ืœื” ื‘ึพ$23$ ืžึพ$xยฒ$. ืžืฆืื• ืืช $x$.",
1604
+ "choices": [
1605
+ {
1606
+ "text": "$x = 2$",
1607
+ "correct": true
1608
+ },
1609
+ {
1610
+ "text": "$x = โˆ’3.75$",
1611
+ "mistake": "diff_order"
1612
+ },
1613
+ {
1614
+ "text": "$x = 16$",
1615
+ "mistake": "forgot_divide"
1616
+ },
1617
+ {
1618
+ "text": "$x = 3.75$",
1619
+ "mistake": "move_sign"
1620
+ }
1621
+ ]
1622
+ },
1623
+ {
1624
+ "question": "ืคืชืจื•: $(x โˆ’ 6)(x + 1) = x(x โˆ’ 7) + 4$",
1625
+ "choices": [
1626
+ {
1627
+ "text": "$x = 5$",
1628
+ "correct": true
1629
+ },
1630
+ {
1631
+ "text": "$x = 10$",
1632
+ "mistake": "forgot_divide"
1633
+ },
1634
+ {
1635
+ "text": "$x = 10/7$",
1636
+ "mistake": "ext_partial"
1637
+ },
1638
+ {
1639
+ "text": "$x = 5/6$",
1640
+ "mistake": "sign_mid"
1641
+ }
1642
+ ]
1643
+ },
1644
+ {
1645
+ "question": "ืคืชืจื•: $(2x โˆ’ 6)(x + 1) = 2xยฒ โˆ’ 2$",
1646
+ "choices": [
1647
+ {
1648
+ "text": "$x = โˆ’1$",
1649
+ "correct": true
1650
+ },
1651
+ {
1652
+ "text": "$x = 2$",
1653
+ "mistake": "move_sign"
1654
+ },
1655
+ {
1656
+ "text": "$x = 1$",
1657
+ "mistake": "neg_divide"
1658
+ },
1659
+ {
1660
+ "text": "$x = 4$",
1661
+ "mistake": "forgot_divide"
1662
+ }
1663
+ ]
1664
+ },
1665
+ {
1666
+ "question": "ืคืชืจื•: $(x + 5)(x โˆ’ 8) = xยฒ โˆ’ 31$",
1667
+ "choices": [
1668
+ {
1669
+ "text": "$x = โˆ’3$",
1670
+ "correct": true
1671
+ },
1672
+ {
1673
+ "text": "$x = 9$",
1674
+ "mistake": "forgot_divide"
1675
+ },
1676
+ {
1677
+ "text": "$x = 3$",
1678
+ "mistake": "neg_divide"
1679
+ },
1680
+ {
1681
+ "text": "$x = 71/3$",
1682
+ "mistake": "move_sign"
1683
+ }
1684
+ ]
1685
+ },
1686
+ {
1687
+ "question": "ืคืชืจื•: $(x + 3)(x + 2) = xยฒ โˆ’ 19$",
1688
+ "choices": [
1689
+ {
1690
+ "text": "$x = โˆ’5$",
1691
+ "correct": true
1692
+ },
1693
+ {
1694
+ "text": "$x = โˆ’2.6$",
1695
+ "mistake": "move_sign"
1696
+ },
1697
+ {
1698
+ "text": "$x = 5$",
1699
+ "mistake": "sign_mid"
1700
+ },
1701
+ {
1702
+ "text": "$x = โˆ’25$",
1703
+ "mistake": "forgot_divide"
1704
+ }
1705
+ ]
1706
+ },
1707
+ {
1708
+ "question": "ืคืชืจื•: $(x + 6)(x + 5) = x(x + 8)$",
1709
+ "choices": [
1710
+ {
1711
+ "text": "$x = โˆ’10$",
1712
+ "correct": true
1713
+ },
1714
+ {
1715
+ "text": "$x = 10$",
1716
+ "mistake": "move_sign"
1717
+ },
1718
+ {
1719
+ "text": "$x = โˆ’30$",
1720
+ "mistake": "forgot_divide"
1721
+ },
1722
+ {
1723
+ "text": "$x = 3.75$",
1724
+ "mistake": "ext_partial"
1725
+ }
1726
+ ]
1727
+ },
1728
+ {
1729
+ "question": "ืคืชืจื•: $(x + 3)(x โˆ’ 7) โˆ’ xยฒ = 3$",
1730
+ "choices": [
1731
+ {
1732
+ "text": "$x = โˆ’6$",
1733
+ "correct": true
1734
+ },
1735
+ {
1736
+ "text": "$x = 4.5$",
1737
+ "mistake": "move_sign"
1738
+ },
1739
+ {
1740
+ "text": "$x = 6$",
1741
+ "mistake": "neg_divide"
1742
+ },
1743
+ {
1744
+ "text": "$x = 24$",
1745
+ "mistake": "forgot_divide"
1746
+ }
1747
+ ]
1748
+ },
1749
+ {
1750
+ "question": "ืคืชืจื•: $(x + 1)(x + 5) = xยฒ + 2$",
1751
+ "choices": [
1752
+ {
1753
+ "text": "$x = โˆ’0.5$",
1754
+ "correct": true
1755
+ },
1756
+ {
1757
+ "text": "$x = 0.5$",
1758
+ "mistake": "sign_mid"
1759
+ },
1760
+ {
1761
+ "text": "$x = โˆ’3$",
1762
+ "mistake": "forgot_divide"
1763
+ },
1764
+ {
1765
+ "text": "$x = 7/6$",
1766
+ "mistake": "move_sign"
1767
+ }
1768
+ ]
1769
+ },
1770
+ {
1771
+ "question": "ืคืชืจื•: $(x โˆ’ 5)(x โˆ’ 3) = xยฒ + 39$",
1772
+ "choices": [
1773
+ {
1774
+ "text": "$x = โˆ’3$",
1775
+ "correct": true
1776
+ },
1777
+ {
1778
+ "text": "$x = 24$",
1779
+ "mistake": "forgot_divide"
1780
+ },
1781
+ {
1782
+ "text": "$x = 3$",
1783
+ "mistake": "neg_divide"
1784
+ },
1785
+ {
1786
+ "text": "$x = โˆ’6.75$",
1787
+ "mistake": "move_sign"
1788
+ }
1789
+ ]
1790
+ },
1791
+ {
1792
+ "question": "ืคืชืจื•: $(2x + 7)(x + 5) = 2xยฒ + 1$",
1793
+ "choices": [
1794
+ {
1795
+ "text": "$x = โˆ’2$",
1796
+ "correct": true
1797
+ },
1798
+ {
1799
+ "text": "$x = โˆ’34$",
1800
+ "mistake": "forgot_divide"
1801
+ },
1802
+ {
1803
+ "text": "$x = 36/17$",
1804
+ "mistake": "move_sign"
1805
+ },
1806
+ {
1807
+ "text": "$x = 2$",
1808
+ "mistake": "sign_mid"
1809
+ }
1810
+ ]
1811
+ },
1812
+ {
1813
+ "question": "ืคืชืจื•: $(x โˆ’ 1)(x + 8) = x(x + 3)$",
1814
+ "choices": [
1815
+ {
1816
+ "text": "$x = 2$",
1817
+ "correct": true
1818
+ },
1819
+ {
1820
+ "text": "$x = โˆ’2$",
1821
+ "mistake": "sign_mid"
1822
+ },
1823
+ {
1824
+ "text": "$x = 8$",
1825
+ "mistake": "forgot_divide"
1826
+ }
1827
+ ]
1828
+ },
1829
+ {
1830
+ "question": "ืคืชืจื•: $(x โˆ’ 2)(x + 3) = x(x + 6)$",
1831
+ "choices": [
1832
+ {
1833
+ "text": "$x = โˆ’1.2$",
1834
+ "correct": true
1835
+ },
1836
+ {
1837
+ "text": "$x = 1.2$",
1838
+ "mistake": "move_sign"
1839
+ },
1840
+ {
1841
+ "text": "$x = 6$",
1842
+ "mistake": "forgot_divide"
1843
+ },
1844
+ {
1845
+ "text": "$x = โˆ’1$",
1846
+ "mistake": "ext_partial"
1847
+ }
1848
+ ]
1849
+ },
1850
+ {
1851
+ "question": "ืคืชืจื•: $(x โˆ’ 8)(x + 3) โˆ’ xยฒ = โˆ’59$",
1852
+ "choices": [
1853
+ {
1854
+ "text": "$x = 7$",
1855
+ "correct": true
1856
+ },
1857
+ {
1858
+ "text": "$x = โˆ’35$",
1859
+ "mistake": "forgot_divide"
1860
+ },
1861
+ {
1862
+ "text": "$x = โˆ’7$",
1863
+ "mistake": "neg_divide"
1864
+ },
1865
+ {
1866
+ "text": "$x = 16.6$",
1867
+ "mistake": "move_sign"
1868
+ }
1869
+ ]
1870
+ },
1871
+ {
1872
+ "question": "ืคืชืจื•: $(x + 3)(x โˆ’ 4) โˆ’ xยฒ = โˆ’6$",
1873
+ "choices": [
1874
+ {
1875
+ "text": "$x = โˆ’6$",
1876
+ "correct": true
1877
+ },
1878
+ {
1879
+ "text": "$x = 6$",
1880
+ "mistake": "neg_divide"
1881
+ },
1882
+ {
1883
+ "text": "$x = 18$",
1884
+ "mistake": "move_sign"
1885
+ },
1886
+ {
1887
+ "text": "ืื™ืŸ ืคืชืจื•ืŸ",
1888
+ "mistake": "ext_partial"
1889
+ }
1890
+ ]
1891
+ },
1892
+ {
1893
+ "question": "ืค๏ฟฝ๏ฟฝืจื•: $(x + 4)(x + 2) โˆ’ xยฒ = โˆ’22$",
1894
+ "choices": [
1895
+ {
1896
+ "text": "$x = โˆ’5$",
1897
+ "correct": true
1898
+ },
1899
+ {
1900
+ "text": "$x = โˆ’30$",
1901
+ "mistake": "forgot_divide"
1902
+ },
1903
+ {
1904
+ "text": "$x = โˆ’7/3$",
1905
+ "mistake": "move_sign"
1906
+ },
1907
+ {
1908
+ "text": "$x = 5$",
1909
+ "mistake": "sign_mid"
1910
+ }
1911
+ ]
1912
+ },
1913
+ {
1914
+ "question": "ืคืชืจื•: $(x + 4)(x โˆ’ 2) โˆ’ xยฒ = โˆ’7$",
1915
+ "choices": [
1916
+ {
1917
+ "text": "$x = 0.5$",
1918
+ "correct": true
1919
+ },
1920
+ {
1921
+ "text": "$x = โˆ’7.5$",
1922
+ "mistake": "move_sign"
1923
+ },
1924
+ {
1925
+ "text": "$x = โˆ’0.5$",
1926
+ "mistake": "sign_mid"
1927
+ },
1928
+ {
1929
+ "text": "$x = 1$",
1930
+ "mistake": "forgot_divide"
1931
+ }
1932
+ ]
1933
+ },
1934
+ {
1935
+ "question": "ืคืชืจื•: $(x โˆ’ 4)(x โˆ’ 3) = x(x + 8)$",
1936
+ "choices": [
1937
+ {
1938
+ "text": "$x = 0.8$",
1939
+ "correct": true
1940
+ },
1941
+ {
1942
+ "text": "$x = โˆ’12$",
1943
+ "mistake": "forgot_divide"
1944
+ },
1945
+ {
1946
+ "text": "$x = โˆ’0.8$",
1947
+ "mistake": "move_sign"
1948
+ },
1949
+ {
1950
+ "text": "$x = 1.5$",
1951
+ "mistake": "ext_partial"
1952
+ }
1953
+ ]
1954
+ },
1955
+ {
1956
+ "question": "ืคืชืจื•: $(x โˆ’ 1)(x โˆ’ 4) = x(x + 7) โˆ’ 5$",
1957
+ "choices": [
1958
+ {
1959
+ "text": "$x = 0.75$",
1960
+ "correct": true
1961
+ },
1962
+ {
1963
+ "text": "$x = โˆ’9$",
1964
+ "mistake": "forgot_divide"
1965
+ },
1966
+ {
1967
+ "text": "$x = โˆ’0.75$",
1968
+ "mistake": "neg_divide"
1969
+ },
1970
+ {
1971
+ "text": "$x = 1/12$",
1972
+ "mistake": "move_sign"
1973
+ }
1974
+ ]
1975
+ },
1976
+ {
1977
+ "question": "ืคืชืจื•: $(x + 8)(x โˆ’ 1) โˆ’ xยฒ = 48$",
1978
+ "choices": [
1979
+ {
1980
+ "text": "$x = 8$",
1981
+ "correct": true
1982
+ },
1983
+ {
1984
+ "text": "$x = 40/7$",
1985
+ "mistake": "move_sign"
1986
+ },
1987
+ {
1988
+ "text": "$x = โˆ’8$",
1989
+ "mistake": "sign_mid"
1990
+ },
1991
+ {
1992
+ "text": "ืื™ืŸ ืคืชืจื•ืŸ",
1993
+ "mistake": "ext_partial"
1994
+ }
1995
+ ]
1996
+ },
1997
+ {
1998
+ "question": "ืžื›ืคืœืช $x + 4$ ื‘ึพ$x โˆ’ 2$ ื’ื“ื•ืœื” ื‘ึพ$8$ ืžึพ$xยฒ$. ืžืฆืื• ืืช $x$.",
1999
+ "choices": [
2000
+ {
2001
+ "text": "$x = 8$",
2002
+ "correct": true
2003
+ },
2004
+ {
2005
+ "text": "$x = 16$",
2006
+ "mistake": "forgot_divide"
2007
+ },
2008
+ {
2009
+ "text": "$x = 0$",
2010
+ "mistake": "move_sign"
2011
+ },
2012
+ {
2013
+ "text": "$x = โˆ’8$",
2014
+ "mistake": "sign_mid"
2015
+ }
2016
+ ]
2017
+ },
2018
+ {
2019
+ "question": "ืžื›ืคืœืช $x + 1$ ื‘ึพ$x + 6$ ื’ื“ื•ืœื” ื‘ึพ$48$ ืžึพ$xยฒ$. ืžืฆืื• ืืช $x$.",
2020
+ "choices": [
2021
+ {
2022
+ "text": "$x = 6$",
2023
+ "correct": true
2024
+ },
2025
+ {
2026
+ "text": "$x = โˆ’6$",
2027
+ "mistake": "sign_mid"
2028
+ },
2029
+ {
2030
+ "text": "$x = 54/7$",
2031
+ "mistake": "move_sign"
2032
+ },
2033
+ {
2034
+ "text": "ืื™ืŸ ืคืชืจื•ืŸ",
2035
+ "mistake": "ext_partial"
2036
+ }
2037
+ ]
2038
+ },
2039
+ {
2040
+ "question": "ืคืชืจื•: $(x + 5)(x + 3) = x(x + 4) + 2$",
2041
+ "choices": [
2042
+ {
2043
+ "text": "$x = โˆ’3.25$",
2044
+ "correct": true
2045
+ },
2046
+ {
2047
+ "text": "$x = โˆ’13$",
2048
+ "mistake": "forgot_divide"
2049
+ },
2050
+ {
2051
+ "text": "$x = 4.25$",
2052
+ "mistake": "move_sign"
2053
+ },
2054
+ {
2055
+ "text": "$x = 3.25$",
2056
+ "mistake": "sign_mid"
2057
+ }
2058
+ ]
2059
+ }
2060
+ ]
2061
+ },
2062
+ {
2063
+ "id": "t_area",
2064
+ "unit": "t",
2065
+ "name": "ื”ืฉื•ื•ืืช ืฉื˜ื—ื™ื ื‘ืขื–ืจืช ื”ืคื™ืœื•ื’",
2066
+ "short": "ื”ืฉื•ื•ืืช ืฉื˜ื—ื™ื",
2067
+ "prereqs": [
2068
+ "t_ext"
2069
+ ],
2070
+ "description": "ืžื‘ื˜ืื™ื ืฉื˜ื—ื™ื ื›ืžื›ืคืœื•ืช ืฉืœ ื‘ื™ื˜ื•ื™ื™ื ืืœื’ื‘ืจื™ื™ื ื•ืžืฉื•ื•ื™ื ื‘ื™ื ื™ื”ื.",
2071
+ "month": "ืกืคื˜ืžื‘ืจ",
2072
+ "questions": [
2073
+ {
2074
+ "question": "ืื•ืจืš ืžืœื‘ืŸ $x + 4$ ื•ืจื•ื—ื‘ื• $x + 1$. ืฆืœืข ืจื™ื‘ื•ืข $x + 2$. ื‘ื›ืžื” ืฉื˜ื— ื”ืžืœื‘ืŸ ื’ื“ื•ืœ ืžืฉื˜ื— ื”ืจื™ื‘ื•ืข?",
2075
+ "choices": [
2076
+ {
2077
+ "text": "$x$",
2078
+ "correct": true
2079
+ },
2080
+ {
2081
+ "text": "$5x$",
2082
+ "mistake": "forgot_middle"
2083
+ },
2084
+ {
2085
+ "text": "$2$",
2086
+ "mistake": "area_perimeter"
2087
+ },
2088
+ {
2089
+ "text": "$โˆ’x$",
2090
+ "mistake": "diff_order"
2091
+ }
2092
+ ]
2093
+ },
2094
+ {
2095
+ "question": "ืื•ืจืš ืžืœื‘ืŸ $x + 5$ ื•ืจื•ื—ื‘ื• $x โˆ’ 2$. ืžื” ืฉื˜ื—ื•?",
2096
+ "choices": [
2097
+ {
2098
+ "text": "$xยฒ + 3x โˆ’ 10$",
2099
+ "correct": true
2100
+ },
2101
+ {
2102
+ "text": "$xยฒ โˆ’ 10$",
2103
+ "mistake": "ext_partial"
2104
+ },
2105
+ {
2106
+ "text": "$4x + 6$",
2107
+ "mistake": "area_perimeter"
2108
+ },
2109
+ {
2110
+ "text": "$xยฒ โˆ’ 3x โˆ’ 10$",
2111
+ "mistake": "sign_mid"
2112
+ }
2113
+ ]
2114
+ },
2115
+ {
2116
+ "question": "ืฆืœืข ืจื™ื‘ื•ืข ื”ื™ื $x$. ืžื’ื“ื™ืœื™ื ืฆืœืข ืื—ืช ื‘ึพ$3$ ื•ืžืงื˜ื™ื ื™ื ืืช ื”ืฆืœืข ื”ืฉื ื™ื™ื” ื‘ึพ$3$, ื•ืžืชืงื‘ืœ ืžืœื‘ืŸ. ืžื” ืงืจื” ืœืฉื˜ื—?",
2117
+ "choices": [
2118
+ {
2119
+ "text": "ื”ืฉื˜ื— ืงื˜ืŸ ื‘ึพ$9$",
2120
+ "correct": true
2121
+ },
2122
+ {
2123
+ "text": "ื”ืฉื˜ื— ืœื ื”ืฉืชื ื”",
2124
+ "mistake": "shift_balance"
2125
+ },
2126
+ {
2127
+ "text": "ื”ืฉื˜ื— ื’ื“ืœ ื‘ึพ$9$",
2128
+ "mistake": "diff_order"
2129
+ }
2130
+ ]
2131
+ },
2132
+ {
2133
+ "question": "ืžืœื‘ืŸ ืืณ: $x + 6$ ืขืœ $x$. ืžืœื‘ืŸ ื‘ืณ: $x + 2$ ืขืœ $x + 3$. ื‘ื›ืžื” ืฉื˜ื— ืžืœื‘ืŸ ืืณ ื’ื“ื•ืœ ืžืฉื˜ื— ืžืœื‘ืŸ ื‘ืณ?",
2134
+ "choices": [
2135
+ {
2136
+ "text": "$x โˆ’ 6$",
2137
+ "correct": true
2138
+ },
2139
+ {
2140
+ "text": "$11x + 6$",
2141
+ "mistake": "minus_paren"
2142
+ },
2143
+ {
2144
+ "text": "$6x โˆ’ 6$",
2145
+ "mistake": "ext_partial"
2146
+ },
2147
+ {
2148
+ "text": "$6 โˆ’ x$",
2149
+ "mistake": "diff_order"
2150
+ }
2151
+ ]
2152
+ },
2153
+ {
2154
+ "question": "ื’ื™ื ื” ืžืœื‘ื ื™ืช ืฉืžื™ื“ื•ืชื™ื” $x$ ืขืœ $x + 4$ ืžื•ืงืคืช ื‘ืฉื‘ื™ืœ ื‘ืจื•ื—ื‘ $1$ ืžื›ืœ ืฆื“. ืžื” ื”ืฉื˜ื— ืฉืœ ื”ื’ื™ื ื” ื™ื—ื“ ืขื ื”ืฉื‘ื™ืœ?",
2155
+ "choices": [
2156
+ {
2157
+ "text": "$xยฒ + 8x + 12$",
2158
+ "correct": true
2159
+ },
2160
+ {
2161
+ "text": "$xยฒ + 6x + 5$",
2162
+ "mistake": "frame_one_side"
2163
+ },
2164
+ {
2165
+ "text": "$xยฒ + 12$",
2166
+ "mistake": "ext_partial"
2167
+ }
2168
+ ]
2169
+ },
2170
+ {
2171
+ "question": "ื’ื™ื ื” ืžืœื‘ื ื™ืช ืฉืžื™ื“ื•ืชื™ื” $x$ ืขืœ $x + 4$ ืžื•ืงืคืช ื‘ืฉื‘ื™ืœ ื‘ืจื•ื—ื‘ $1$ ืžื›ืœ ืฆื“. ืžื” ืฉื˜ื— ื”ืฉื‘ื™ืœ ืœื‘ื“ื•?",
2172
+ "choices": [
2173
+ {
2174
+ "text": "$4x + 12$",
2175
+ "correct": true
2176
+ },
2177
+ {
2178
+ "text": "$12x + 12$",
2179
+ "mistake": "minus_paren"
2180
+ },
2181
+ {
2182
+ "text": "$2x + 5$",
2183
+ "mistake": "frame_one_side"
2184
+ }
2185
+ ]
2186
+ },
2187
+ {
2188
+ "question": "ืฉื˜ื— ืžืœื‘ืŸ ืฉืžื™ื“ื•ืชื™ื• $x + 7$ ืขืœ $x โˆ’ 1$ ืฉื•ื•ื” ืœืฉื˜ื— ืจื™ื‘ื•ืข ืฉืฆืœืขื• $x + 2$. ืžืฆืื• ืืช $x$.",
2189
+ "choices": [
2190
+ {
2191
+ "text": "$x = 5.5$",
2192
+ "correct": true
2193
+ },
2194
+ {
2195
+ "text": "$x = 11/6$",
2196
+ "mistake": "forgot_middle"
2197
+ },
2198
+ {
2199
+ "text": "$x = โˆ’2.75$",
2200
+ "mistake": "ext_partial"
2201
+ }
2202
+ ]
2203
+ },
2204
+ {
2205
+ "question": "ืฆืœืข ืจื™ื‘ื•ืข ื”ื™ื $x$. ืื•ืจืš ืžืœื‘ืŸ ื’ื“ื•ืœ ื‘ึพ$5$ ืžืฆืœืข ื”ืจื™ื‘ื•ืข, ื•ืจื•ื—ื‘ื• ืงื˜ืŸ ื‘ึพ$2$ ืžืžื ื”. ื‘ื›ืžื” ืฉื˜ื— ื”ืžืœื‘ืŸ ื’ื“ื•ืœ ืžืฉื˜ื— ื”ืจื™ื‘ื•ืข?",
2206
+ "choices": [
2207
+ {
2208
+ "text": "$3x โˆ’ 10$",
2209
+ "correct": true
2210
+ },
2211
+ {
2212
+ "text": "$โˆ’10$",
2213
+ "mistake": "ext_partial"
2214
+ },
2215
+ {
2216
+ "text": "$โˆ’3x โˆ’ 10$",
2217
+ "mistake": "sign_mid"
2218
+ },
2219
+ {
2220
+ "text": "$6$",
2221
+ "mistake": "area_perimeter"
2222
+ }
2223
+ ]
2224
+ },
2225
+ {
2226
+ "question": "ืžืœื‘ืŸ ืฉืžื™ื“ื•ืชื™ื• $x + 3$ ืขืœ $x + 5$, ื•ืจื™ื‘ื•ืข ืฉืฆืœืขื• $x + 4$. ืื™ื–ื” ืฉื˜ื— ื’ื“ื•ืœ ื™ื•ืชืจ, ื•ื‘ื›ืžื”?",
2227
+ "choices": [
2228
+ {
2229
+ "text": "ืฉื˜ื— ื”ืจื™ื‘ื•ืข, ื‘ึพ$1$",
2230
+ "correct": true
2231
+ },
2232
+ {
2233
+ "text": "ืฉื˜ื— ื”ืžืœื‘ืŸ, ื‘ึพ$1$",
2234
+ "mistake": "diff_order"
2235
+ },
2236
+ {
2237
+ "text": "ื”ืฉื˜ื—ื™ื ืฉื•ื•ื™ื",
2238
+ "mistake": "shift_balance"
2239
+ }
2240
+ ]
2241
+ },
2242
+ {
2243
+ "question": "ื ื™ืฆื‘ื™ ืžืฉื•ืœืฉ ื™ืฉืจ ื–ื•ื•ื™ืช ื”ื $x + 4$ ื•ึพ$x โˆ’ 2$. ืžื” ืฉื˜ื— ื”ืžืฉื•ืœืฉ?",
2244
+ "choices": [
2245
+ {
2246
+ "text": "$(xยฒ + 2x โˆ’ 8) : 2$",
2247
+ "correct": true
2248
+ },
2249
+ {
2250
+ "text": "$xยฒ + 2x โˆ’ 8$",
2251
+ "mistake": "forgot_half_area"
2252
+ },
2253
+ {
2254
+ "text": "$(xยฒ โˆ’ 8) : 2$",
2255
+ "mistake": "ext_partial"
2256
+ }
2257
+ ]
2258
+ },
2259
+ {
2260
+ "question": "ืื•ืจืš ืžืœื‘ืŸ $x + 9$ ื•ืจื•ื—ื‘ื• $x + 2$. ืžื” ืฉื˜ื—ื•?",
2261
+ "choices": [
2262
+ {
2263
+ "text": "$xยฒ + 11x + 18$",
2264
+ "correct": true
2265
+ },
2266
+ {
2267
+ "text": "$xยฒ + 18$",
2268
+ "mistake": "ext_partial"
2269
+ },
2270
+ {
2271
+ "text": "$4x + 22$",
2272
+ "mistake": "area_perimeter"
2273
+ }
2274
+ ]
2275
+ },
2276
+ {
2277
+ "question": "ืื•ืจืš ืžืœื‘ืŸ $x + 7$ ื•ืจื•ื—ื‘ื• $x + 9$. ืฆืœืข ืจื™ื‘ื•ืข $x + 4$. ื‘ื›ืžื” ืฉื˜ื— ื”ืžืœื‘ืŸ ื’ื“ื•ืœ ืžืฉื˜ื— ื”ืจื™ื‘ื•ืข?",
2278
+ "choices": [
2279
+ {
2280
+ "text": "$8x + 47$",
2281
+ "correct": true
2282
+ },
2283
+ {
2284
+ "text": "$16x + 47$",
2285
+ "mistake": "forgot_middle"
2286
+ },
2287
+ {
2288
+ "text": "$โˆ’8x โˆ’ 47$",
2289
+ "mistake": "diff_order"
2290
+ },
2291
+ {
2292
+ "text": "$16$",
2293
+ "mistake": "area_perimeter"
2294
+ }
2295
+ ]
2296
+ },
2297
+ {
2298
+ "question": "ืื•ืจืš ืžืœื‘ืŸ $x + 4$ ื•ืจื•ื—ื‘ื• $x โˆ’ 6$. ืžื” ืฉื˜ื—ื•?",
2299
+ "choices": [
2300
+ {
2301
+ "text": "$xยฒ โˆ’ 2x โˆ’ 24$",
2302
+ "correct": true
2303
+ },
2304
+ {
2305
+ "text": "$xยฒ โˆ’ 24$",
2306
+ "mistake": "ext_partial"
2307
+ },
2308
+ {
2309
+ "text": "$4x โˆ’ 4$",
2310
+ "mistake": "area_perimeter"
2311
+ },
2312
+ {
2313
+ "text": "$xยฒ + 2x โˆ’ 24$",
2314
+ "mistake": "sign_mid"
2315
+ }
2316
+ ]
2317
+ },
2318
+ {
2319
+ "question": "ืžืœื‘ืŸ ืฉืžื™ื“ื•ืชื™ื• $x + 1$ ืขืœ $x + 9$, ื•ืจื™ื‘ื•ืข ืฉืฆืœืขื• $x + 5$. ืื™ื–ื” ืฉื˜ื— ื’ื“ื•ืœ ื™ื•ืชืจ, ื•ื‘ื›ืžื”?",
2320
+ "choices": [
2321
+ {
2322
+ "text": "ืฉื˜ื— ื”ืจื™ื‘ื•ืข, ื‘ึพ$16$",
2323
+ "correct": true
2324
+ },
2325
+ {
2326
+ "text": "ืฉื˜ื— ื”ืžืœื‘ืŸ, ื‘ึพ$16$",
2327
+ "mistake": "diff_order"
2328
+ },
2329
+ {
2330
+ "text": "ื”ืฉื˜ื—ื™ื ืฉื•ื•ื™ื",
2331
+ "mistake": "shift_balance"
2332
+ }
2333
+ ]
2334
+ },
2335
+ {
2336
+ "question": "ื’ื™ื ื” ืžืœื‘ื ื™ืช ืฉืžื™ื“ื•ืชื™ื” $x$ ืขืœ $x + 9$ ืžื•ืงืคืช ื‘ืฉื‘ื™ืœ ื‘ืจื•ื—ื‘ $1$ ืžื›ืœ ืฆื“. ืžื” ืฉื˜ื— ื”ืฉื‘ื™ืœ ืœื‘ื“ื•?",
2337
+ "choices": [
2338
+ {
2339
+ "text": "$4x + 22$",
2340
+ "correct": true
2341
+ },
2342
+ {
2343
+ "text": "$22x + 22$",
2344
+ "mistake": "minus_paren"
2345
+ },
2346
+ {
2347
+ "text": "$2x + 10$",
2348
+ "mistake": "frame_one_side"
2349
+ }
2350
+ ]
2351
+ },
2352
+ {
2353
+ "question": "ืื•ืจืš ืžืœื‘ืŸ $x + 7$ ื•ืจื•ื—ื‘ื• $x โˆ’ 5$. ืžื” ืฉื˜ื—ื•?",
2354
+ "choices": [
2355
+ {
2356
+ "text": "$xยฒ + 2x โˆ’ 35$",
2357
+ "correct": true
2358
+ },
2359
+ {
2360
+ "text": "$xยฒ โˆ’ 35$",
2361
+ "mistake": "ext_partial"
2362
+ },
2363
+ {
2364
+ "text": "$4x + 4$",
2365
+ "mistake": "area_perimeter"
2366
+ },
2367
+ {
2368
+ "text": "$xยฒ โˆ’ 2x โˆ’ 35$",
2369
+ "mistake": "sign_mid"
2370
+ }
2371
+ ]
2372
+ },
2373
+ {
2374
+ "question": "ืฆืœืข ืจื™ื‘ื•ืข ื”ื™ื $x$. ืื•ืจืš ืžืœื‘ืŸ ื’ื“ื•ืœ ื‘ึพ$8$ ืžืฆืœืข ื”ืจื™ื‘ื•ืข, ื•ืจื•ื—ื‘ื• ืงื˜ืŸ ื‘ึพ$6$ ืžืžื ื”. ื‘ื›ืžื” ืฉื˜ื— ื”ืžืœื‘ืŸ ื’ื“ื•ืœ ืžืฉื˜ื— ื”ืจื™ื‘ื•ืข?",
2375
+ "choices": [
2376
+ {
2377
+ "text": "$2x โˆ’ 48$",
2378
+ "correct": true
2379
+ },
2380
+ {
2381
+ "text": "$โˆ’48$",
2382
+ "mistake": "ext_partial"
2383
+ },
2384
+ {
2385
+ "text": "$โˆ’2x โˆ’ 48$",
2386
+ "mistake": "sign_mid"
2387
+ },
2388
+ {
2389
+ "text": "$4$",
2390
+ "mistake": "area_perimeter"
2391
+ }
2392
+ ]
2393
+ },
2394
+ {
2395
+ "question": "ืžืœื‘ืŸ ืืณ: $x + 6$ ืขืœ $x + 9$. ืžืœื‘ืŸ ื‘ืณ: $x + 5$ ืขืœ $x + 7$. ื‘ื›ืžื” ืฉื˜ื— ืžืœื‘ืŸ ืืณ ื’ื“ื•ืœ ืžืฉื˜ื— ืžืœื‘ืŸ ื‘ืณ?",
2396
+ "choices": [
2397
+ {
2398
+ "text": "$3x + 19$",
2399
+ "correct": true
2400
+ },
2401
+ {
2402
+ "text": "$27x + 89$",
2403
+ "mistake": "minus_paren"
2404
+ },
2405
+ {
2406
+ "text": "$19$",
2407
+ "mistake": "ext_partial"
2408
+ },
2409
+ {
2410
+ "text": "$โˆ’3x โˆ’ 19$",
2411
+ "mistake": "diff_order"
2412
+ }
2413
+ ]
2414
+ },
2415
+ {
2416
+ "question": "ืžืœื‘ืŸ ืฉืžื™ื“ื•ืชื™ื• $x + 7$ ืขืœ $x + 11$, ื•ืจื™ื‘ื•ืข ืฉืฆืœืขื• $x + 9$. ืื™ื–ื” ืฉื˜ื— ื’ื“ื•ืœ ื™ื•ืชืจ, ื•ื‘ื›ืžื”?",
2417
+ "choices": [
2418
+ {
2419
+ "text": "ืฉื˜ื— ื”ืจื™ื‘ื•ืข, ื‘ึพ$4$",
2420
+ "correct": true
2421
+ },
2422
+ {
2423
+ "text": "ืฉื˜ื— ื”ืžืœื‘ืŸ, ื‘ึพ$4$",
2424
+ "mistake": "diff_order"
2425
+ },
2426
+ {
2427
+ "text": "ื”ืฉื˜ื—ื™ื ืฉื•ื•ื™ื",
2428
+ "mistake": "shift_balance"
2429
+ }
2430
+ ]
2431
+ },
2432
+ {
2433
+ "question": "ืฆืœืข ืจื™ื‘ื•ืข ื”ื™ื $x$. ืื•ืจืš ืžืœื‘ืŸ ื’ื“ื•ืœ ื‘ึพ$5$ ืžืฆืœืข ื”ืจื™ื‘ื•ืข, ื•ืจื•ื—ื‘ื• ืงื˜ืŸ ื‘ึพ$4$ ืžืžื ื”. ื‘ื›ืžื” ืฉื˜ื— ื”ืžืœื‘ืŸ ื’ื“ื•ืœ ืžืฉื˜ื— ื”ืจื™ื‘ื•ืข?",
2434
+ "choices": [
2435
+ {
2436
+ "text": "$x โˆ’ 20$",
2437
+ "correct": true
2438
+ },
2439
+ {
2440
+ "text": "$โˆ’20$",
2441
+ "mistake": "ext_partial"
2442
+ },
2443
+ {
2444
+ "text": "$โˆ’x โˆ’ 20$",
2445
+ "mistake": "sign_mid"
2446
+ },
2447
+ {
2448
+ "text": "$2$",
2449
+ "mistake": "area_perimeter"
2450
+ }
2451
+ ]
2452
+ },
2453
+ {
2454
+ "question": "ื’ื™ื ื” ืžืœื‘ื ื™ืช ืฉืžื™ื“ื•ืชื™ื” $x$ ืขืœ $x + 7$ ืžื•ืงืคืช ื‘ืฉื‘ื™ืœ ื‘ืจื•ื—ื‘ $2$ ืžื›ืœ ืฆื“. ืžื” ืฉื˜ื— ื”ืฉื‘ื™ืœ ืœื‘ื“ื•?",
2455
+ "choices": [
2456
+ {
2457
+ "text": "$8x + 44$",
2458
+ "correct": true
2459
+ },
2460
+ {
2461
+ "text": "$22x + 44$",
2462
+ "mistake": "minus_paren"
2463
+ },
2464
+ {
2465
+ "text": "$4x + 18$",
2466
+ "mistake": "frame_one_side"
2467
+ }
2468
+ ]
2469
+ },
2470
+ {
2471
+ "question": "ืžืœื‘ืŸ ืฉืžื™ื“ื•ืชื™ื• $x + 6$ ืขืœ $x + 12$, ื•ืจื™ื‘ื•ืข ืฉืฆืœืขื• $x + 9$. ืื™ื–ื” ืฉื˜ื— ื’ื“ื•ืœ ื™ื•ืชืจ, ื•ื‘ื›ืžื”?",
2472
+ "choices": [
2473
+ {
2474
+ "text": "ืฉื˜ื— ื”ืจื™ื‘ื•ืข, ื‘ึพ$9$",
2475
+ "correct": true
2476
+ },
2477
+ {
2478
+ "text": "ืฉื˜ื— ื”ืžืœื‘ืŸ, ื‘ึพ$9$",
2479
+ "mistake": "diff_order"
2480
+ },
2481
+ {
2482
+ "text": "ื”ืฉื˜ื—ื™ื ืฉื•ื•ื™ื",
2483
+ "mistake": "shift_balance"
2484
+ }
2485
+ ]
2486
+ },
2487
+ {
2488
+ "question": "ื’ื™ื ื” ืžืœื‘ื ื™ืช ืฉืžื™ื“ื•ืชื™ื” $x$ ืขืœ $x + 6$ ืžื•ืงืคืช ื‘ืฉื‘ื™ืœ ื‘ืจื•ื—ื‘ $1$ ืžื›ืœ ืฆื“. ืžื” ืฉื˜ื— ื”ืฉื‘ื™ืœ ืœื‘ื“ื•?",
2489
+ "choices": [
2490
+ {
2491
+ "text": "$4x + 16$",
2492
+ "correct": true
2493
+ },
2494
+ {
2495
+ "text": "$16x + 16$",
2496
+ "mistake": "minus_paren"
2497
+ },
2498
+ {
2499
+ "text": "$2x + 7$",
2500
+ "mistake": "frame_one_side"
2501
+ }
2502
+ ]
2503
+ },
2504
+ {
2505
+ "question": "ื ื™ืฆื‘ื™ ืžืฉื•ืœืฉ ื™ืฉืจ ื–ื•ื•ื™ืช ื”ื $x + 3$ ื•ึพ$x + 2$. ืžื” ืฉื˜ื— ื”ืžืฉื•ืœืฉ?",
2506
+ "choices": [
2507
+ {
2508
+ "text": "$(xยฒ + 5x + 6) : 2$",
2509
+ "correct": true
2510
+ },
2511
+ {
2512
+ "text": "$xยฒ + 5x + 6$",
2513
+ "mistake": "forgot_half_area"
2514
+ },
2515
+ {
2516
+ "text": "$(xยฒ + 6) : 2$",
2517
+ "mistake": "ext_partial"
2518
+ }
2519
+ ]
2520
+ },
2521
+ {
2522
+ "question": "ื ื™ืฆื‘ื™ ืžืฉื•ืœืฉ ื™ืฉืจ ื–ื•ื•ื™ืช ื”ื $x + 9$ ื•ึพ$x + 6$. ืžื” ืฉื˜ื— ื”ืžืฉื•ืœืฉ?",
2523
+ "choices": [
2524
+ {
2525
+ "text": "$(xยฒ + 15x + 54) : 2$",
2526
+ "correct": true
2527
+ },
2528
+ {
2529
+ "text": "$xยฒ + 15x + 54$",
2530
+ "mistake": "forgot_half_area"
2531
+ },
2532
+ {
2533
+ "text": "$(xยฒ + 54) : 2$",
2534
+ "mistake": "ext_partial"
2535
+ }
2536
+ ]
2537
+ },
2538
+ {
2539
+ "question": "ื’ื™ื ื” ืžืœื‘ื ื™ืช ืฉืžื™ื“ื•ืชื™ื” $x$ ืขืœ $x + 4$ ืžื•ืงืคืช ื‘ืฉื‘ื™ืœ ื‘ืจื•ื—ื‘ $3$ ืžื›ืœ ืฆื“. ืžื” ื”ืฉื˜ื— ืฉืœ ื”ื’ื™ื ื” ื™ื—ื“ ืขื ื”ืฉื‘ื™ืœ?",
2540
+ "choices": [
2541
+ {
2542
+ "text": "$xยฒ + 16x + 60$",
2543
+ "correct": true
2544
+ },
2545
+ {
2546
+ "text": "$xยฒ + 10x + 21$",
2547
+ "mistake": "frame_one_side"
2548
+ },
2549
+ {
2550
+ "text": "$xยฒ + 60$",
2551
+ "mistake": "ext_partial"
2552
+ }
2553
+ ]
2554
+ },
2555
+ {
2556
+ "question": "ื’ื™ื ื” ืžืœื‘ื ื™ืช ืฉืžื™ื“ื•ืชื™ื” $x$ ืขืœ $x + 9$ ืžื•ืงืคืช ื‘ืฉื‘ื™ืœ ื‘ืจื•ื—ื‘ $1$ ืžื›ืœ ืฆื“. ืžื” ื”ืฉื˜ื— ืฉืœ ื”ื’ื™ื ื” ื™ื—ื“ ืขื ื”ืฉื‘ื™ืœ?",
2557
+ "choices": [
2558
+ {
2559
+ "text": "$xยฒ + 13x + 22$",
2560
+ "correct": true
2561
+ },
2562
+ {
2563
+ "text": "$xยฒ + 11x + 10$",
2564
+ "mistake": "frame_one_side"
2565
+ },
2566
+ {
2567
+ "text": "$xยฒ + 22$",
2568
+ "mistake": "ext_partial"
2569
+ }
2570
+ ]
2571
+ },
2572
+ {
2573
+ "question": "ื ื™ืฆื‘ื™ ืžืฉื•ืœืฉ ื™ืฉืจ ื–ื•ื•ื™ืช ื”ื $x + 6$ ื•ึพ$x โˆ’ 2$. ืžื” ืฉื˜ื— ื”ืžืฉื•ืœืฉ?",
2574
+ "choices": [
2575
+ {
2576
+ "text": "$(xยฒ + 4x โˆ’ 12) : 2$",
2577
+ "correct": true
2578
+ },
2579
+ {
2580
+ "text": "$xยฒ + 4x โˆ’ 12$",
2581
+ "mistake": "forgot_half_area"
2582
+ },
2583
+ {
2584
+ "text": "$(xยฒ โˆ’ 12) : 2$",
2585
+ "mistake": "ext_partial"
2586
+ }
2587
+ ]
2588
+ },
2589
+ {
2590
+ "question": "ื’ื™ื ื” ืžืœื‘ื ื™ืช ืฉืžื™ื“ื•ืชื™ื” $x$ ืขืœ $x + 8$ ืžื•ืงืคืช ื‘ืฉื‘ื™ืœ ื‘ืจื•ื—ื‘ $1$ ืžื›ืœ ืฆื“. ืžื” ื”ืฉื˜ื— ืฉืœ ื”ื’ื™ื ื” ื™ื—ื“ ืขื ื”ืฉื‘ื™ืœ?",
2591
+ "choices": [
2592
+ {
2593
+ "text": "$xยฒ + 12x + 20$",
2594
+ "correct": true
2595
+ },
2596
+ {
2597
+ "text": "$xยฒ + 10x + 9$",
2598
+ "mistake": "frame_one_side"
2599
+ },
2600
+ {
2601
+ "text": "$xยฒ + 20$",
2602
+ "mistake": "ext_partial"
2603
+ }
2604
+ ]
2605
+ },
2606
+ {
2607
+ "question": "ืžืœื‘ืŸ ืืณ: $x + 5$ ืขืœ $x + 8$. ืžืœื‘ืŸ ื‘ืณ: $x + 8$ ืขืœ $x + 1$. ื‘ื›ืžื” ืฉื˜ื— ืžืœื‘ืŸ ืืณ ื’ื“ื•ืœ ืžืฉื˜ื— ืžืœื‘ืŸ ื‘ืณ?",
2608
+ "choices": [
2609
+ {
2610
+ "text": "$4x + 32$",
2611
+ "correct": true
2612
+ },
2613
+ {
2614
+ "text": "$22x + 48$",
2615
+ "mistake": "minus_paren"
2616
+ },
2617
+ {
2618
+ "text": "$32$",
2619
+ "mistake": "ext_partial"
2620
+ },
2621
+ {
2622
+ "text": "$โˆ’4x โˆ’ 32$",
2623
+ "mistake": "diff_order"
2624
+ }
2625
+ ]
2626
+ }
2627
+ ]
2628
+ },
2629
+ {
2630
+ "id": "t_formulas",
2631
+ "unit": "t",
2632
+ "name": "ื ื•ืกื—ืื•ืช ื”ื›ืคืœ ื”ืžืงื•ืฆืจ",
2633
+ "short": "ื›ืคืœ ืžืงื•ืฆืจ",
2634
+ "prereqs": [
2635
+ "t_ext"
2636
+ ],
2637
+ "description": "$(a ยฑ b)ยฒ = aยฒ ยฑ 2ab + bยฒ$ ื•ึพ$(a + b)(a โˆ’ b) = aยฒ โˆ’ bยฒ$. ืืคืฉืจ ืœืจืื•ืช ืื•ืชืŸ ื’ื ื›ืฉื˜ื—ื™ื ืฉืœ ืจื™ื‘ื•ืขื™ื ื•ืžืœื‘ื ื™ื.",
2638
+ "month": "ืกืคื˜ืžื‘ืจ",
2639
+ "questions": [
2640
+ {
2641
+ "question": "$(2x โˆ’ 3)ยฒ = ?$",
2642
+ "choices": [
2643
+ {
2644
+ "text": "$4xยฒ โˆ’ 12x + 9$",
2645
+ "correct": true
2646
+ },
2647
+ {
2648
+ "text": "$4xยฒ + 9$",
2649
+ "mistake": "forgot_middle"
2650
+ },
2651
+ {
2652
+ "text": "$4xยฒ โˆ’ 6x + 9$",
2653
+ "mistake": "middle_no_2"
2654
+ },
2655
+ {
2656
+ "text": "$2xยฒ โˆ’ 12x + 9$",
2657
+ "mistake": "coef_not_raised"
2658
+ }
2659
+ ]
2660
+ },
2661
+ {
2662
+ "question": "$(3x + 5)(3x โˆ’ 5) = ?$",
2663
+ "choices": [
2664
+ {
2665
+ "text": "$9xยฒ โˆ’ 25$",
2666
+ "correct": true
2667
+ },
2668
+ {
2669
+ "text": "$9xยฒ + 25$",
2670
+ "mistake": "diff_sign"
2671
+ },
2672
+ {
2673
+ "text": "$3xยฒ โˆ’ 25$",
2674
+ "mistake": "coef_not_raised"
2675
+ },
2676
+ {
2677
+ "text": "$9xยฒ โˆ’ 30x + 25$",
2678
+ "mistake": "diffsq_as_square"
2679
+ }
2680
+ ]
2681
+ },
2682
+ {
2683
+ "question": "$(x + 6)ยฒ = ?$",
2684
+ "choices": [
2685
+ {
2686
+ "text": "$xยฒ + 12x + 36$",
2687
+ "correct": true
2688
+ },
2689
+ {
2690
+ "text": "$xยฒ + 36$",
2691
+ "mistake": "forgot_middle"
2692
+ },
2693
+ {
2694
+ "text": "$xยฒ + 6x + 36$",
2695
+ "mistake": "middle_no_2"
2696
+ },
2697
+ {
2698
+ "text": "$xยฒ + 12x + 12$",
2699
+ "mistake": "sq_as_double"
2700
+ }
2701
+ ]
2702
+ },
2703
+ {
2704
+ "question": "$(x โˆ’ 4)ยฒ = ?$",
2705
+ "choices": [
2706
+ {
2707
+ "text": "$xยฒ โˆ’ 8x + 16$",
2708
+ "correct": true
2709
+ },
2710
+ {
2711
+ "text": "$xยฒ โˆ’ 16$",
2712
+ "mistake": "diffsq_as_square"
2713
+ },
2714
+ {
2715
+ "text": "$xยฒ + 8x + 16$",
2716
+ "mistake": "sign_mid"
2717
+ },
2718
+ {
2719
+ "text": "$xยฒ โˆ’ 8x โˆ’ 16$",
2720
+ "mistake": "neg_times_neg"
2721
+ }
2722
+ ]
2723
+ },
2724
+ {
2725
+ "question": "$(a + 2b)ยฒ = ?$",
2726
+ "choices": [
2727
+ {
2728
+ "text": "$aยฒ + 4ab + 4bยฒ$",
2729
+ "correct": true
2730
+ },
2731
+ {
2732
+ "text": "$aยฒ + 2ab + 4bยฒ$",
2733
+ "mistake": "middle_no_2"
2734
+ },
2735
+ {
2736
+ "text": "$aยฒ + 4ab + 2bยฒ$",
2737
+ "mistake": "coef_not_raised"
2738
+ },
2739
+ {
2740
+ "text": "$aยฒ + 4bยฒ$",
2741
+ "mistake": "forgot_middle"
2742
+ }
2743
+ ]
2744
+ },
2745
+ {
2746
+ "question": "$(7 โˆ’ x)(7 + x) = ?$",
2747
+ "choices": [
2748
+ {
2749
+ "text": "$49 โˆ’ xยฒ$",
2750
+ "correct": true
2751
+ },
2752
+ {
2753
+ "text": "$xยฒ โˆ’ 49$",
2754
+ "mistake": "diffsq_order"
2755
+ },
2756
+ {
2757
+ "text": "$49 โˆ’ 14x + xยฒ$",
2758
+ "mistake": "diffsq_as_square"
2759
+ },
2760
+ {
2761
+ "text": "$14 โˆ’ xยฒ$",
2762
+ "mistake": "sq_as_double"
2763
+ }
2764
+ ]
2765
+ },
2766
+ {
2767
+ "question": "$(5x + 1)ยฒ = ?$",
2768
+ "choices": [
2769
+ {
2770
+ "text": "$25xยฒ + 10x + 1$",
2771
+ "correct": true
2772
+ },
2773
+ {
2774
+ "text": "$25xยฒ + 5x + 1$",
2775
+ "mistake": "middle_no_2"
2776
+ },
2777
+ {
2778
+ "text": "$5xยฒ + 10x + 1$",
2779
+ "mistake": "coef_not_raised"
2780
+ },
2781
+ {
2782
+ "text": "$25xยฒ + 1$",
2783
+ "mistake": "forgot_middle"
2784
+ }
2785
+ ]
2786
+ },
2787
+ {
2788
+ "question": "ืจื™ื‘ื•ืข ืฉืฆืœืขื• $a + b$ ืžื—ื•ืœืง ืœืจื™ื‘ื•ืข ืฉืฆืœืขื• $a$, ืœืจื™ื‘ื•ืข ืฉืฆืœืขื• $b$ ื•ืœืฉื ื™ ืžืœื‘ื ื™ื. ืžื” ืกื›ื•ื ื”ืฉื˜ื—ื™ื ืฉืœ ืฉื ื™ ื”ืžืœื‘ื ื™ื?",
2789
+ "choices": [
2790
+ {
2791
+ "text": "$2ab$",
2792
+ "correct": true
2793
+ },
2794
+ {
2795
+ "text": "$ab$",
2796
+ "mistake": "middle_no_2"
2797
+ },
2798
+ {
2799
+ "text": "$aยฒ + bยฒ$",
2800
+ "mistake": "other_quantity"
2801
+ }
2802
+ ]
2803
+ },
2804
+ {
2805
+ "question": "ื—ืฉื‘ื• ื‘ืขื–ืจืช ื ื•ืกื—ืช ื”ื›ืคืœ ื”ืžืงื•ืฆืจ: $51ยฒ = ?$",
2806
+ "choices": [
2807
+ {
2808
+ "text": "$2601$",
2809
+ "correct": true
2810
  },
2811
  {
2812
+ "text": "$2501$",
2813
+ "mistake": "forgot_middle"
2814
  },
2815
  {
2816
+ "text": "$2551$",
2817
+ "mistake": "middle_no_2"
2818
  }
2819
  ]
2820
  },
2821
  {
2822
+ "question": "ื—ืฉื‘ื• ื‘ืขื–ืจืช ื ื•ืกื—ืช ื”ื›ืคืœ ื”ืžืงื•ืฆืจ: $98 ยท 102 = ?$",
2823
  "choices": [
2824
  {
2825
+ "text": "$9996$",
2826
  "correct": true
2827
  },
2828
  {
2829
+ "text": "$10004$",
2830
+ "mistake": "diff_sign"
 
 
 
 
2831
  },
2832
  {
2833
+ "text": "$9604$",
2834
+ "mistake": "diffsq_as_square"
2835
  }
2836
  ]
2837
+ },
 
 
 
 
 
 
 
 
 
 
 
 
 
2838
  {
2839
+ "question": "ื—ืฉื‘ื• ื‘ืขื–ืจืช ื ื•ืกื—ืช ื”ื›ืคืœ ื”ืžืงื•ืฆืจ: $52ยฒ = ?$",
2840
  "choices": [
2841
  {
2842
+ "text": "$2704$",
2843
  "correct": true
2844
  },
2845
  {
2846
+ "text": "$2504$",
2847
  "mistake": "forgot_middle"
2848
  },
2849
  {
2850
+ "text": "$2604$",
2851
+ "mistake": "middle_no_2"
 
 
 
 
2852
  }
2853
  ]
2854
  },
2855
  {
2856
+ "question": "$(x + 2)ยฒ = ?$",
2857
  "choices": [
2858
  {
2859
+ "text": "$xยฒ + 4x + 4$",
2860
  "correct": true
2861
  },
2862
  {
2863
+ "text": "$xยฒ + 2x + 4$",
2864
+ "mistake": "middle_no_2"
 
 
 
 
2865
  },
2866
  {
2867
+ "text": "$xยฒ + 4$",
2868
+ "mistake": "forgot_middle"
2869
  }
2870
  ]
2871
  },
2872
  {
2873
+ "question": "$(x + 4)ยฒ = ?$",
2874
  "choices": [
2875
  {
2876
+ "text": "$xยฒ + 8x + 16$",
2877
  "correct": true
2878
  },
2879
  {
2880
+ "text": "$xยฒ + 8x + 8$",
2881
+ "mistake": "sq_as_double"
2882
  },
2883
  {
2884
+ "text": "$xยฒ + 4x + 16$",
2885
+ "mistake": "middle_no_2"
2886
+ },
2887
+ {
2888
+ "text": "$xยฒ + 16$",
2889
+ "mistake": "forgot_middle"
2890
  }
2891
  ]
2892
  },
2893
  {
2894
+ "question": "$(x โˆ’ 1)ยฒ = ?$",
2895
  "choices": [
2896
  {
2897
+ "text": "$xยฒ โˆ’ 2x + 1$",
2898
  "correct": true
2899
  },
2900
  {
2901
+ "text": "$xยฒ โˆ’ 1$",
2902
+ "mistake": "diffsq_as_square"
2903
  },
2904
  {
2905
+ "text": "$xยฒ + 1$",
2906
+ "mistake": "forgot_middle"
2907
  },
2908
  {
2909
+ "text": "$xยฒ โˆ’ 2x + 2$",
2910
+ "mistake": "sq_as_double"
2911
  }
2912
  ]
2913
  },
2914
  {
2915
+ "question": "$(4x + 9)(4x โˆ’ 9) = ?$",
2916
  "choices": [
2917
  {
2918
+ "text": "$16xยฒ โˆ’ 81$",
2919
  "correct": true
2920
  },
2921
  {
2922
+ "text": "$16xยฒ + 81$",
2923
+ "mistake": "diff_sign"
2924
  },
2925
  {
2926
+ "text": "$16xยฒ โˆ’ 72x + 81$",
2927
+ "mistake": "diffsq_as_square"
2928
+ },
2929
+ {
2930
+ "text": "$4xยฒ โˆ’ 81$",
2931
+ "mistake": "coef_not_raised"
2932
  }
2933
  ]
2934
  },
2935
  {
2936
+ "question": "$(2x + 6)ยฒ = ?$",
2937
  "choices": [
2938
  {
2939
+ "text": "$4xยฒ + 24x + 36$",
2940
  "correct": true
2941
  },
2942
  {
2943
+ "text": "$4xยฒ + 12x + 36$",
2944
+ "mistake": "middle_no_2"
2945
  },
2946
  {
2947
+ "text": "$2xยฒ + 24x + 36$",
2948
+ "mistake": "coef_not_raised"
2949
+ },
2950
+ {
2951
+ "text": "$4xยฒ + 36$",
2952
+ "mistake": "forgot_middle"
2953
  }
2954
  ]
2955
  },
2956
  {
2957
+ "question": "$(a โˆ’ 3b)ยฒ = ?$",
2958
  "choices": [
2959
  {
2960
+ "text": "$aยฒ โˆ’ 6ab + 9bยฒ$",
2961
  "correct": true
2962
  },
2963
  {
2964
+ "text": "$aยฒ โˆ’ 3ab + 9bยฒ$",
2965
+ "mistake": "middle_no_2"
2966
  },
2967
  {
2968
+ "text": "$aยฒ โˆ’ 6ab + 3bยฒ$",
2969
+ "mistake": "coef_not_raised"
2970
+ },
2971
+ {
2972
+ "text": "$aยฒ + 9bยฒ$",
2973
+ "mistake": "forgot_middle"
2974
  }
2975
  ]
2976
  },
2977
  {
2978
+ "question": "$(5x โˆ’ 1)(5x + 1) = ?$",
2979
  "choices": [
2980
  {
2981
+ "text": "$25xยฒ โˆ’ 1$",
2982
  "correct": true
2983
  },
2984
  {
2985
+ "text": "$25xยฒ + 1$",
2986
+ "mistake": "diff_sign"
2987
  },
2988
  {
2989
+ "text": "$25xยฒ โˆ’ 10x + 1$",
2990
+ "mistake": "diffsq_as_square"
2991
  },
2992
  {
2993
+ "text": "$5xยฒ โˆ’ 1$",
2994
+ "mistake": "coef_not_raised"
2995
  }
2996
  ]
2997
  },
2998
  {
2999
+ "question": "$(a โˆ’ 4b)ยฒ = ?$",
3000
  "choices": [
3001
  {
3002
+ "text": "$aยฒ โˆ’ 8ab + 16bยฒ$",
3003
  "correct": true
3004
  },
3005
  {
3006
+ "text": "$aยฒ โˆ’ 4ab + 16bยฒ$",
3007
+ "mistake": "middle_no_2"
3008
  },
3009
  {
3010
+ "text": "$aยฒ โˆ’ 8ab + 4bยฒ$",
3011
+ "mistake": "coef_not_raised"
3012
+ },
3013
+ {
3014
+ "text": "$aยฒ + 16bยฒ$",
3015
+ "mistake": "forgot_middle"
3016
  }
3017
  ]
3018
  },
3019
  {
3020
+ "question": "ื—ืฉื‘ื• ื‘ืขื–ืจืช ื ื•ืกื—ืช ื”ื›ืคืœ ื”ืžืงื•ืฆืจ: $26 ยท 34 = ?$",
3021
  "choices": [
3022
  {
3023
+ "text": "$884$",
3024
  "correct": true
3025
  },
3026
  {
3027
+ "text": "$916$",
3028
+ "mistake": "diff_sign"
3029
  },
3030
  {
3031
+ "text": "$676$",
3032
+ "mistake": "diffsq_as_square"
3033
  }
3034
  ]
3035
+ },
 
 
 
 
 
 
 
 
 
 
 
 
 
3036
  {
3037
+ "question": "$(5x โˆ’ 9)(5x + 9) = ?$",
3038
  "choices": [
3039
  {
3040
+ "text": "$25xยฒ โˆ’ 81$",
3041
  "correct": true
3042
  },
3043
  {
3044
+ "text": "$25xยฒ + 81$",
3045
+ "mistake": "diff_sign"
3046
  },
3047
  {
3048
+ "text": "$25xยฒ โˆ’ 90x + 81$",
3049
+ "mistake": "diffsq_as_square"
3050
  },
3051
  {
3052
+ "text": "$5xยฒ โˆ’ 81$",
3053
  "mistake": "coef_not_raised"
3054
  }
3055
  ]
3056
  },
3057
  {
3058
+ "question": "ื—ืฉื‘ื• ื‘ืขื–ืจืช ื ื•ืกื—ืช ื”ื›ืคืœ ื”ืžืงื•ืฆืจ: $57 ยท 63 = ?$",
3059
  "choices": [
3060
  {
3061
+ "text": "$3591$",
3062
  "correct": true
3063
  },
3064
  {
3065
+ "text": "$3609$",
3066
  "mistake": "diff_sign"
3067
  },
3068
  {
3069
+ "text": "$3249$",
 
 
 
 
3070
  "mistake": "diffsq_as_square"
3071
  }
3072
  ]
3073
  },
3074
  {
3075
+ "question": "$(4x โˆ’ 8)ยฒ = ?$",
3076
  "choices": [
3077
  {
3078
+ "text": "$16xยฒ โˆ’ 64x + 64$",
3079
  "correct": true
3080
  },
3081
  {
3082
+ "text": "$4xยฒ โˆ’ 64x + 64$",
3083
+ "mistake": "coef_not_raised"
3084
  },
3085
  {
3086
+ "text": "$16xยฒ + 64$",
3087
+ "mistake": "forgot_middle"
3088
  },
3089
  {
3090
+ "text": "$16xยฒ โˆ’ 32x + 64$",
3091
+ "mistake": "middle_no_2"
3092
  }
3093
  ]
3094
  },
3095
  {
3096
+ "question": "$(8 โˆ’ x)(8 + x) = ?$",
3097
  "choices": [
3098
  {
3099
+ "text": "$64 โˆ’ xยฒ$",
3100
  "correct": true
3101
  },
3102
  {
3103
+ "text": "$xยฒ โˆ’ 64$",
3104
+ "mistake": "diffsq_order"
3105
  },
3106
  {
3107
+ "text": "$64 โˆ’ 16x + xยฒ$",
3108
+ "mistake": "diffsq_as_square"
3109
  },
3110
  {
3111
+ "text": "$16 โˆ’ xยฒ$",
3112
+ "mistake": "sq_as_double"
3113
  }
3114
  ]
3115
  },
3116
  {
3117
+ "question": "$(a โˆ’ 5b)ยฒ = ?$",
3118
  "choices": [
3119
  {
3120
+ "text": "$aยฒ โˆ’ 10ab + 25bยฒ$",
3121
  "correct": true
3122
  },
3123
  {
3124
+ "text": "$aยฒ โˆ’ 5ab + 25bยฒ$",
3125
  "mistake": "middle_no_2"
3126
  },
3127
  {
3128
+ "text": "$aยฒ โˆ’ 10ab + 5bยฒ$",
3129
  "mistake": "coef_not_raised"
3130
  },
3131
  {
3132
+ "text": "$aยฒ + 25bยฒ$",
3133
  "mistake": "forgot_middle"
3134
  }
3135
  ]
3136
  },
3137
  {
3138
+ "question": "$(2x + 6)(2x โˆ’ 6) = ?$",
3139
  "choices": [
3140
  {
3141
+ "text": "$4xยฒ โˆ’ 36$",
3142
  "correct": true
3143
  },
3144
  {
3145
+ "text": "$4xยฒ + 36$",
3146
+ "mistake": "diff_sign"
3147
  },
3148
  {
3149
+ "text": "$4xยฒ โˆ’ 24x + 36$",
3150
  "mistake": "diffsq_as_square"
3151
  },
3152
  {
3153
+ "text": "$2xยฒ โˆ’ 36$",
3154
+ "mistake": "coef_not_raised"
3155
  }
3156
  ]
3157
  },
3158
  {
3159
+ "question": "$(a + 4b)ยฒ = ?$",
3160
  "choices": [
3161
  {
3162
+ "text": "$aยฒ + 8ab + 16bยฒ$",
3163
  "correct": true
3164
  },
3165
  {
3166
+ "text": "$aยฒ + 4ab + 16bยฒ$",
3167
  "mistake": "middle_no_2"
3168
  },
3169
  {
3170
+ "text": "$aยฒ + 8ab + 4bยฒ$",
3171
  "mistake": "coef_not_raised"
3172
  },
3173
  {
3174
+ "text": "$aยฒ + 16bยฒ$",
3175
  "mistake": "forgot_middle"
3176
  }
3177
  ]
3178
  },
3179
  {
3180
+ "question": "$(3x โˆ’ 2)ยฒ = ?$",
3181
  "choices": [
3182
  {
3183
+ "text": "$9xยฒ โˆ’ 12x + 4$",
3184
  "correct": true
3185
  },
3186
  {
3187
+ "text": "$9xยฒ โˆ’ 4$",
3188
+ "mistake": "diffsq_as_square"
3189
  },
3190
  {
3191
+ "text": "$9xยฒ + 4$",
3192
+ "mistake": "forgot_middle"
3193
+ },
3194
+ {
3195
+ "text": "$3xยฒ โˆ’ 12x + 4$",
3196
+ "mistake": "coef_not_raised"
3197
  }
3198
  ]
3199
  },
3200
  {
3201
+ "question": "$(a + 5b)ยฒ = ?$",
3202
  "choices": [
3203
  {
3204
+ "text": "$aยฒ + 10ab + 25bยฒ$",
3205
  "correct": true
3206
  },
3207
  {
3208
+ "text": "$aยฒ + 5ab + 25bยฒ$",
3209
+ "mistake": "middle_no_2"
3210
  },
3211
  {
3212
+ "text": "$aยฒ + 10ab + 5bยฒ$",
3213
+ "mistake": "coef_not_raised"
3214
+ },
3215
+ {
3216
+ "text": "$aยฒ + 25bยฒ$",
3217
+ "mistake": "forgot_middle"
3218
  }
3219
  ]
3220
  },
3221
  {
3222
+ "question": "$(2x + 3)(2x โˆ’ 3) = ?$",
3223
  "choices": [
3224
  {
3225
+ "text": "$4xยฒ โˆ’ 9$",
3226
  "correct": true
3227
  },
3228
  {
3229
+ "text": "$4xยฒ + 9$",
3230
  "mistake": "diff_sign"
3231
  },
3232
  {
3233
+ "text": "$4xยฒ โˆ’ 12x + 9$",
3234
  "mistake": "diffsq_as_square"
3235
+ },
3236
+ {
3237
+ "text": "$2xยฒ โˆ’ 9$",
3238
+ "mistake": "coef_not_raised"
3239
  }
3240
  ]
3241
  }
requirements-dev.txt CHANGED
@@ -2,6 +2,7 @@ fastapi>=0.110
2
  python-multipart>=0.0.9
3
  httpx>=0.27
4
  pytest>=8
 
5
  # Optional local PostgreSQL integration checks (bundled server; no Docker or project credentials).
6
  pgserver==0.1.4; sys_platform == 'linux'
7
  psycopg[binary]==3.3.6
 
2
  python-multipart>=0.0.9
3
  httpx>=0.27
4
  pytest>=8
5
+ sympy>=1.12 # recomputes the algebra answers in tests/test_math_skills.py
6
  # Optional local PostgreSQL integration checks (bundled server; no Docker or project credentials).
7
  pgserver==0.1.4; sys_platform == 'linux'
8
  psycopg[binary]==3.3.6
static/math.js CHANGED
@@ -6,7 +6,8 @@
6
  student moves to the next unsolved question, so a missed question comes back after the others. The choices are
7
  shuffled each time a question is shown, and a wrong answer does not reveal the right one, so a question that comes
8
  back is solved again, not remembered. Finished skills come back in a mixed review (see "spaced review" below). Progress is kept on this device, per account (mathly.progress.v1:<email>): `done` per
9
- skill, and `solved` (indexes answered correctly) and `at` (the question to show) for skills with a list. */
 
10
  (()=>{
11
  const css=document.createElement("link"); css.rel="stylesheet"; css.href=document.currentScript.src.replace("math.js","math.css");
12
  document.head.append(css);
@@ -67,9 +68,24 @@ const shuffled=a=>{ const out=a.slice(); for(let i=out.length-1;i>0;i--){ const
67
  // a multiple-choice question's buttons, in a new order each time it is shown
68
  const choiceButtons=q=>`<div class="mx-choices">${shuffled(q.choices||[]).map((c,i)=>`<button data-choice="${i}" data-m="${c.correct?"":esc(c.mistake)}"${c.correct?" data-right":""}>${fmt(c.text)}</button>`).join("")}</div>`;
69
  const figures=q=>`${q.graph?plot(q.graph):""}${q.diagram?geometryDiagram(q.diagram):""}${q.figure?figure(q.figure):""}`;
70
- // the question after `from` that is not solved yet; once all are solved, simply the next one
71
- const nextQ=(id,from)=>{ const n=QS(BY[id]).length, got=solvedOf(id);
72
- for(let k=1;k<=n;k++){ const j=(from+k)%n; if(!got.has(j)) return j; } return (from+1)%n; };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
 
74
  async function show(){
75
  document.documentElement.classList.add("math-on");
@@ -94,7 +110,7 @@ async function show(){
94
  try{ const r=await fetch("/api/math/skills"); if(!r.ok) throw new Error(`ื”ืฉืจืช ืขื ื” ${r.status}`); index(await r.json()); }
95
  catch(e){ path.innerHTML=`<p class="mx-note">ืœื ื”ืฆืœื—ื ื• ืœื˜ืขื•ืŸ ืืช ื”ืžืกืœื•ืœ: ${esc(e.message)}. ืจืขื ื ื• ืืช ื”ืขืžื•ื“ ื•ื ืกื• ืฉื•ื‘.</p>`; return; }
96
  }
97
- P=window.MathlySky.ensure(Object.assign({done:{},tries:{},solved:{},at:{}},load())); SHOWN=new Set(shownUnits().map(u=>u.id));
98
  subjectOptions().length?drawSubjectPicker():selectSubject("ืžืชืžื˜ื™ืงื”");
99
  window.MathlyAnswers?.configure({api,account:CFG.userId,enabled:CFG.answerScans,root,onGraded:({questionId,grading})=>{
100
  if(grading.result.verdict!=="correct"||P.done[questionId])return;
@@ -147,7 +163,7 @@ const unitOf=id=>G.units.find(u=>u.id===BY[id].unit);
147
  const unitIds=u=>ORDER.filter(id=>BY[id].unit===u.id);
148
  const live=id=>!BY[id].locked;
149
  const seenAt=id=>Date.parse(P.seen?.[id]||P.done[id]||0)||0;
150
- const goldNeed=id=>Sky.goldNeed(QS(BY[id]).length);
151
  const inDays=d=>d===0?"ื”ื™ื•ื":d===1?"ืžื—ืจ":`ื‘ืขื•ื“ ${d} ื™ืžื™ื`;
152
  function unitDone(u){ const ids=unitIds(u).filter(live); return ids.length>0&&ids.every(id=>P.done[id]); }
153
  function skyStats(){
@@ -344,9 +360,11 @@ function chips(ids){
344
  function open(id){
345
  stopPhone();
346
  cancelAdvance();
347
- const s=BY[id], st=status(id), unit=G.units.find(u=>u.id===s.unit), all=QS(s), n=all.length;
348
- curQ=Math.min(P.at[id]||0,n-1);
349
- const q=all[curQ], openEnded=q.type==="open-ended", got=solvedOf(id);
 
 
350
  if(!cur) back=document.activeElement;
351
  cur=id; FIRST=true; REV=null;
352
  sheet.innerHTML=`<div class="mx-scrim" data-act="close"></div>
@@ -355,7 +373,7 @@ function open(id){
355
  <h3 id="mxTitle">${fmt(s.name)}</h3><small class="mx-src">${s.month?`ื‘ืคืจื™ืกื”: ${esc(s.month)}`:esc(unit.source)}${st==="done"?" ยท ื”ื•ืฉืœืžื” โœ“":""}</small></div>
356
  <button class="mx-x" data-act="close" aria-label="ืกื’ื™ืจื”">โœ•</button></div>
357
  <p>${fmt(s.description)}</p>
358
- <div class="mx-q">${n>1?`<div class="mx-qprog"><span>ืฉืืœื” ${curQ+1} ืžืชื•ืš ${n}</span><span class="mx-qdots" aria-label="ื ืคืชืจื• ${got.size} ืžืชื•ืš ${n}">${all.map((_,i)=>`<i class="${got.has(i)?"ok":""}${i===curQ?" now":""}"></i>`).join("")}</span></div>`:""}
359
  <p>${fmt(q.question)}</p>${figures(q)}
360
  ${st==="off"?'<p class="mx-note mx-off">ื”ืฉืืœื” ื”ื–ื• ืกื’ื•ืจื” ื›ืจื’ืข ืœืชืฉื•ื‘ื•ืช. ื”ื™ื ืœื ื ื“ืจืฉืช ื›ื“ื™ ืœื”ืชืงื“ื ื‘ืžืกืœื•ืœ.</p>':openEnded?'<div class="mx-answer"></div>':choiceButtons(q)}
361
  <div class="mx-fb" aria-live="polite"></div></div>
@@ -385,18 +403,19 @@ function autoAdvance(id,target){
385
  function answer(btn){
386
  if(btn.disabled) return;
387
  if(REV) return reviewAnswer(btn);
388
- const id=cur, m=btn.dataset.m, fb=sheet.querySelector(".mx-fb"), n=QS(BY[id]).length, qi=curQ;
389
  const buttons=sheet.querySelectorAll("[data-choice]");
390
  buttons.forEach(b=>b.classList.remove("right","wrong"));
391
  btn.classList.add(m?"wrong":"right");
392
  P.tries[id]=(P.tries[id]||0)+1;
393
  if(n>1) P.at[id]=nextQ(id,qi);
394
  if(!m){
395
- const got=solvedOf(id); got.add(qi); P.solved[id]=[...got].sort((a,b)=>a-b);
 
396
  const missed=new Set(P.missed[id]||[]), recovered=missed.delete(qi); P.missed[id]=[...missed];
397
  // done once every question is solved and the last answers were right at the first try
398
  const run=FIRST?(P.run[id]||0)+1:0, need=Sky.masterNeed(n);
399
- const first=!P.done[id]&&got.size>=n&&run>=need, unitWas=unitDone(unitOf(id));
400
  if(first){ P.done[id]=new Date().toISOString(); Sky.mastered(P,id); }
401
  COMBO=FIRST?COMBO+1:0;
402
  const persisted=!FIRST;
@@ -407,7 +426,7 @@ function answer(btn){
407
  const ok=`<b>${Sky.praise({recovered,persisted,combo:COMBO})}</b>${COMBO>=2?`<span class="mx-combo">${Sky.FLAME}${COMBO} ื‘ืจืฆืฃ</span>`:""}`;
408
  const after=rewards(id,{r,lit:first,unitWas}), then=go=>after.then(()=>{ if(cur===id&&!sheet.hidden&&fb.isConnected) go(); }); // not once another question is shown
409
  if(!P.done[id]){
410
- const left=need-run, say=got.size<n?`ืคืชืจืชื ${got.size} ืžืชื•ืš ${n} ืฉืืœื•ืช ื‘ืžื™ื•ืžื ื•ืช ื”ื–ื•.`
411
  :n===1?"ื›ื“ื™ ืœืกื™ื™ื ืฆืจื™ืš ืœืขื ื•ืช ื ื›ื•ืŸ ื‘ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ. ื ืกื• ืืช ื”ืฉืืœื” ืฉื•ื‘, ื”ืคืขื ื‘ืกื“ืจ ืื—ืจ."
412
  :`ื›ืœ ื”ืฉืืœื•ืช ื ืคืชืจื•. ืขื•ื“ ${left===1?"ืชืฉื•ื‘ื” ื ื›ื•ื ื” ืื—ืช":`${left} ืชืฉื•ื‘ื•ืช ื ื›ื•ื ื•ืช`} ื‘ืจืฆืฃ, ื‘ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ, ื›ื“ื™ ืœืกื™ื™ื.`;
413
  fb.innerHTML=`<div class="mx-ok">${ok}<span>${say}</span>
 
6
  student moves to the next unsolved question, so a missed question comes back after the others. The choices are
7
  shuffled each time a question is shown, and a wrong answer does not reveal the right one, so a question that comes
8
  back is solved again, not remembered. Finished skills come back in a mixed review (see "spaced review" below). Progress is kept on this device, per account (mathly.progress.v1:<email>): `done` per
9
+ skill, and `solved` (indexes answered correctly), `at` (the question to show) and `set` (the round's questions, see round())
10
+ for skills with a list. */
11
  (()=>{
12
  const css=document.createElement("link"); css.rel="stylesheet"; css.href=document.currentScript.src.replace("math.js","math.css");
13
  document.head.append(css);
 
68
  // a multiple-choice question's buttons, in a new order each time it is shown
69
  const choiceButtons=q=>`<div class="mx-choices">${shuffled(q.choices||[]).map((c,i)=>`<button data-choice="${i}" data-m="${c.correct?"":esc(c.mistake)}"${c.correct?" data-right":""}>${fmt(c.text)}</button>`).join("")}</div>`;
70
  const figures=q=>`${q.graph?plot(q.graph):""}${q.diagram?geometryDiagram(q.diagram):""}${q.figure?figure(q.figure):""}`;
71
+ /* A round: a skill with more than ROUND questions asks a random ROUND of them (indexes into its list), the ones not
72
+ solved yet first. A round in progress keeps its questions (P.set); a finished skill gets a new one each time it is
73
+ opened. Progress from before rounds existed was on the first ROUND questions, so it stays there. */
74
+ const ROUND=10;
75
+ function round(id){
76
+ const n=QS(BY[id]).length; if(n<=ROUND) return [...Array(n).keys()];
77
+ let r=P.set[id];
78
+ if(!Array.isArray(r)||r.length!==ROUND||r.some(i=>!(Number.isInteger(i)&&i>=0&&i<n))){
79
+ if(!P.done[id]&&(P.solved[id]?.length||P.at[id]!=null)) r=[...Array(ROUND).keys()];
80
+ else { const got=solvedOf(id), all=shuffled([...Array(n).keys()]); r=[...all.filter(i=>!got.has(i)),...all.filter(i=>got.has(i))].slice(0,ROUND); }
81
+ P.set[id]=r;
82
+ }
83
+ return r;
84
+ }
85
+ const solvedIn=id=>{ const got=solvedOf(id); return round(id).filter(i=>got.has(i)).length; };
86
+ // the round's question after `from` that is not solved yet; once all are solved, simply the next one
87
+ const nextQ=(id,from)=>{ const r=round(id), got=solvedOf(id), at=r.indexOf(from), n=r.length;
88
+ for(let k=1;k<=n;k++){ const j=r[(at+k)%n]; if(!got.has(j)) return j; } return r[(at+1)%n]; };
89
 
90
  async function show(){
91
  document.documentElement.classList.add("math-on");
 
110
  try{ const r=await fetch("/api/math/skills"); if(!r.ok) throw new Error(`ื”ืฉืจืช ืขื ื” ${r.status}`); index(await r.json()); }
111
  catch(e){ path.innerHTML=`<p class="mx-note">ืœื ื”ืฆืœื—ื ื• ืœื˜ืขื•ืŸ ืืช ื”ืžืกืœื•ืœ: ${esc(e.message)}. ืจืขื ื ื• ืืช ื”ืขืžื•ื“ ื•ื ืกื• ืฉื•ื‘.</p>`; return; }
112
  }
113
+ P=window.MathlySky.ensure(Object.assign({done:{},tries:{},solved:{},at:{},set:{}},load())); if(!P.set||typeof P.set!=="object") P.set={}; SHOWN=new Set(shownUnits().map(u=>u.id));
114
  subjectOptions().length?drawSubjectPicker():selectSubject("ืžืชืžื˜ื™ืงื”");
115
  window.MathlyAnswers?.configure({api,account:CFG.userId,enabled:CFG.answerScans,root,onGraded:({questionId,grading})=>{
116
  if(grading.result.verdict!=="correct"||P.done[questionId])return;
 
163
  const unitIds=u=>ORDER.filter(id=>BY[id].unit===u.id);
164
  const live=id=>!BY[id].locked;
165
  const seenAt=id=>Date.parse(P.seen?.[id]||P.done[id]||0)||0;
166
+ const goldNeed=id=>Sky.goldNeed(Math.min(ROUND,QS(BY[id]).length));
167
  const inDays=d=>d===0?"ื”ื™ื•ื":d===1?"ืžื—ืจ":`ื‘ืขื•ื“ ${d} ื™ืžื™ื`;
168
  function unitDone(u){ const ids=unitIds(u).filter(live); return ids.length>0&&ids.every(id=>P.done[id]); }
169
  function skyStats(){
 
360
  function open(id){
361
  stopPhone();
362
  cancelAdvance();
363
+ const s=BY[id], st=status(id), unit=G.units.find(u=>u.id===s.unit), all=QS(s);
364
+ if(P.done[id]&&cur!==id) delete P.set[id]; // a finished skill opened again: a new round
365
+ const r=round(id), n=r.length;
366
+ curQ=r.includes(P.at[id])?P.at[id]:r[0];
367
+ const q=all[curQ], openEnded=q.type==="open-ended", got=solvedOf(id), gotN=r.filter(i=>got.has(i)).length;
368
  if(!cur) back=document.activeElement;
369
  cur=id; FIRST=true; REV=null;
370
  sheet.innerHTML=`<div class="mx-scrim" data-act="close"></div>
 
373
  <h3 id="mxTitle">${fmt(s.name)}</h3><small class="mx-src">${s.month?`ื‘ืคืจื™ืกื”: ${esc(s.month)}`:esc(unit.source)}${st==="done"?" ยท ื”ื•ืฉืœืžื” โœ“":""}</small></div>
374
  <button class="mx-x" data-act="close" aria-label="ืกื’ื™ืจื”">โœ•</button></div>
375
  <p>${fmt(s.description)}</p>
376
+ <div class="mx-q">${n>1?`<div class="mx-qprog"><span>ืฉืืœื” ${r.indexOf(curQ)+1} ืžืชื•ืš ${n}</span><span class="mx-qdots" aria-label="ื ืคืชืจื• ${gotN} ืžืชื•ืš ${n}">${r.map(i=>`<i class="${got.has(i)?"ok":""}${i===curQ?" now":""}"></i>`).join("")}</span></div>`:""}
377
  <p>${fmt(q.question)}</p>${figures(q)}
378
  ${st==="off"?'<p class="mx-note mx-off">ื”ืฉืืœื” ื”ื–ื• ืกื’ื•ืจื” ื›ืจื’ืข ืœืชืฉื•ื‘ื•ืช. ื”ื™ื ืœื ื ื“ืจืฉืช ื›ื“ื™ ืœื”ืชืงื“ื ื‘ืžืกืœื•ืœ.</p>':openEnded?'<div class="mx-answer"></div>':choiceButtons(q)}
379
  <div class="mx-fb" aria-live="polite"></div></div>
 
403
  function answer(btn){
404
  if(btn.disabled) return;
405
  if(REV) return reviewAnswer(btn);
406
+ const id=cur, m=btn.dataset.m, fb=sheet.querySelector(".mx-fb"), n=round(id).length, qi=curQ;
407
  const buttons=sheet.querySelectorAll("[data-choice]");
408
  buttons.forEach(b=>b.classList.remove("right","wrong"));
409
  btn.classList.add(m?"wrong":"right");
410
  P.tries[id]=(P.tries[id]||0)+1;
411
  if(n>1) P.at[id]=nextQ(id,qi);
412
  if(!m){
413
+ const all=solvedOf(id); all.add(qi); P.solved[id]=[...all].sort((a,b)=>a-b);
414
+ const gotN=solvedIn(id); // solved in this round
415
  const missed=new Set(P.missed[id]||[]), recovered=missed.delete(qi); P.missed[id]=[...missed];
416
  // done once every question is solved and the last answers were right at the first try
417
  const run=FIRST?(P.run[id]||0)+1:0, need=Sky.masterNeed(n);
418
+ const first=!P.done[id]&&gotN>=n&&run>=need, unitWas=unitDone(unitOf(id));
419
  if(first){ P.done[id]=new Date().toISOString(); Sky.mastered(P,id); }
420
  COMBO=FIRST?COMBO+1:0;
421
  const persisted=!FIRST;
 
426
  const ok=`<b>${Sky.praise({recovered,persisted,combo:COMBO})}</b>${COMBO>=2?`<span class="mx-combo">${Sky.FLAME}${COMBO} ื‘ืจืฆืฃ</span>`:""}`;
427
  const after=rewards(id,{r,lit:first,unitWas}), then=go=>after.then(()=>{ if(cur===id&&!sheet.hidden&&fb.isConnected) go(); }); // not once another question is shown
428
  if(!P.done[id]){
429
+ const left=need-run, say=gotN<n?`ืคืชืจืชื ${gotN} ืžืชื•ืš ${n} ืฉืืœื•ืช ื‘ืžื™ื•ืžื ื•ืช ื”ื–ื•.`
430
  :n===1?"ื›ื“ื™ ืœืกื™ื™ื ืฆืจื™ืš ืœืขื ื•ืช ื ื›ื•ืŸ ื‘ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ. ื ืกื• ืืช ื”ืฉืืœื” ืฉื•ื‘, ื”ืคืขื ื‘ืกื“ืจ ืื—ืจ."
431
  :`ื›ืœ ื”ืฉืืœื•ืช ื ืคืชืจื•. ืขื•ื“ ${left===1?"ืชืฉื•ื‘ื” ื ื›ื•ื ื” ืื—ืช":`${left} ืชืฉื•ื‘ื•ืช ื ื›ื•ื ื•ืช`} ื‘ืจืฆืฃ, ื‘ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ, ื›ื“ื™ ืœืกื™ื™ื.`;
432
  fb.innerHTML=`<div class="mx-ok">${ok}<span>${say}</span>
tests/test_math_skills.py CHANGED
@@ -1,5 +1,8 @@
1
  import copy
2
  import asyncio
 
 
 
3
 
4
  import httpx
5
 
@@ -59,7 +62,11 @@ def test_question_lists():
59
  skill = lambda sid: next(item for item in graph["skills"] if item["id"] == sid)
60
  listed = [s for s in graph["skills"] if "questions" in s]
61
  assert [s["id"] for s in graph["skills"] if "sample" in s] == ["a_30_side"] # the photographed answer
62
- assert len(listed) == 95 and all(len(s["questions"]) == 10 for s in listed)
 
 
 
 
63
  skill("t_ext")["sample"] = skill("t_ext")["questions"][0]
64
  skill("t_gcf")["questions"] = []
65
  skill("q_props")["questions"][0] = {"type": "open-ended", "version": 1, "question": "Sketch it."}
@@ -163,3 +170,45 @@ def test_no_unit_has_more_than_six_subunits():
163
  graph = algebra9()
164
  count = Counter(skill["unit"] for skill in graph["skills"])
165
  assert all(1 <= count[unit["id"]] <= 6 for unit in graph["units"]), count
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import copy
2
  import asyncio
3
+ import re
4
+
5
+ import pytest
6
 
7
  import httpx
8
 
 
62
  skill = lambda sid: next(item for item in graph["skills"] if item["id"] == sid)
63
  listed = [s for s in graph["skills"] if "questions" in s]
64
  assert [s["id"] for s in graph["skills"] if "sample" in s] == ["a_30_side"] # the photographed answer
65
+ assert len(listed) == 95
66
+ # ื˜ื›ื ื™ืงื” ืืœื’ื‘ืจื™ืช 1 has 30 questions a skill, a round asks a random 10 of them; the others have 10
67
+ assert {s["id"]: len(s["questions"]) for s in listed if s["unit"] == "t"} == dict.fromkeys(
68
+ ["t_ext", "t_simplify", "t_ext_eq", "t_area", "t_formulas"], 30)
69
+ assert all(len(s["questions"]) == 10 for s in listed if s["unit"] != "t")
70
  skill("t_ext")["sample"] = skill("t_ext")["questions"][0]
71
  skill("t_gcf")["questions"] = []
72
  skill("q_props")["questions"][0] = {"type": "open-ended", "version": 1, "question": "Sketch it."}
 
170
  graph = algebra9()
171
  count = Counter(skill["unit"] for skill in graph["skills"])
172
  assert all(1 <= count[unit["id"]] <= 6 for unit in graph["units"]), count
173
+
174
+
175
+ def test_unit_t_answers_are_right_and_no_wrong_choice_is_equivalent():
176
+ """Recomputes, independently of how they were written, every unit-t question that is a bare expression,
177
+ an expression to simplify, or an equation: the marked answer is right and every other choice is not."""
178
+ sp = pytest.importorskip("sympy")
179
+ from sympy.parsing.sympy_parser import parse_expr, standard_transformations, implicit_multiplication_application
180
+ tf = standard_transformations + (implicit_multiplication_application,)
181
+ x = sp.Symbol("x")
182
+ names = {v: sp.Symbol(v) for v in "xab"}
183
+
184
+ def expr(t):
185
+ t = t.strip().strip("$").replace("โˆ’", "-").replace("ยฒ", "**2").replace("ยท", "*").replace(" : 2", "/2")
186
+ return sp.nsimplify(parse_expr(t, local_dict=names, transformations=tf), rational=True)
187
+
188
+ def solution(text):
189
+ if "$" not in text:
190
+ return None # "ืื™ืŸ ืคืชืจื•ืŸ"
191
+ return expr(text.split("=")[1])
192
+
193
+ checked = 0
194
+ for skill in algebra9()["skills"]:
195
+ if skill["unit"] != "t":
196
+ continue
197
+ for q in skill["questions"]:
198
+ body = re.fullmatch(r"(?:ืคืฉื˜ื•: |ืื™ื–ื” ื‘ื™ื˜ื•ื™ ืฉื•ื•ื” ืœึพ)?\$([^$]+)\$\??", q["question"])
199
+ eq = re.fullmatch(r"ืคืชืจื•: \$([^$=]+)=([^$=]+)\$", q["question"])
200
+ if body and body[1].endswith("= ?") and not re.search(r"\d{2,}[ยฒยท]|^\d+ ยท", body[1]):
201
+ value = sp.expand(expr(body[1][:-3]))
202
+ same = lambda c: sp.expand(expr(c["text"]) - value) == 0
203
+ elif body and "=" not in body[1]:
204
+ value = sp.expand(expr(body[1]))
205
+ same = lambda c: sp.expand(expr(c["text"]) - value) == 0
206
+ elif eq:
207
+ roots = sp.solve(sp.Eq(expr(eq[1]), expr(eq[2])), x)
208
+ same = lambda c: (solution(c["text"]) is None and not roots) or (solution(c["text"]) is not None and roots == [solution(c["text"])])
209
+ else:
210
+ continue
211
+ for c in q["choices"]:
212
+ assert same(c) == bool(c.get("correct")), (skill["id"], q["question"], c["text"])
213
+ checked += 1
214
+ assert checked >= 90
tests/test_sky_browser.py CHANGED
@@ -211,3 +211,36 @@ def test_a_due_skill_comes_back_in_a_mixed_review(browser, server):
211
  page.locator(".mx-x").click()
212
  playwright.expect(page.locator(".mx-review")).to_have_count(0) # nothing is due any more today
213
  assert not errors
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
  page.locator(".mx-x").click()
212
  playwright.expect(page.locator(".mx-review")).to_have_count(0) # nothing is due any more today
213
  assert not errors
214
+
215
+
216
+ def test_a_round_asks_ten_of_thirty_and_a_finished_skill_gets_a_new_round(browser, server):
217
+ page, errors = page_with(browser, server, no_chance=True)
218
+ page.locator('.mx-star[data-id="t_ext"]').click()
219
+ playwright.expect(page.locator(".mx-qprog span").first).to_have_text("ืฉืืœื” 1 ืžืชื•ืš 10")
220
+ page.locator(".mx-choices button[data-right]").first.click()
221
+ rnd = progress_of(page)["set"]["t_ext"]
222
+ assert len(rnd) == len(set(rnd)) == 10 and all(0 <= i < 30 for i in rnd)
223
+ page.locator(".mx-ok button[data-id]").first.click()
224
+ for _ in range(9):
225
+ page.locator(".mx-choices button[data-right]").first.click()
226
+ if page.locator(".sky-cele").count():
227
+ break
228
+ page.locator(".mx-ok button[data-id]").first.click()
229
+ while page.locator(".sky-cele [data-sky=go]").count():
230
+ page.locator(".sky-cele [data-sky=go]").first.click()
231
+ p = progress_of(page)
232
+ assert p["done"]["t_ext"] and sorted(p["solved"]["t_ext"]) == sorted(rnd)
233
+ page.locator(".mx-x").click()
234
+ page.locator('.mx-star[data-id="t_ext"]').click() # practising it again: the questions not met yet come first
235
+ page.locator(".mx-choices button[data-right]").first.click()
236
+ again = progress_of(page)["set"]["t_ext"]
237
+ assert not set(again) & set(rnd)
238
+ assert not errors
239
+
240
+
241
+ def test_progress_from_before_rounds_stays_on_the_first_ten(browser, server):
242
+ page, errors = page_with(browser, server, {"solved": {"t_ext": [0, 1, 2]}, "at": {"t_ext": 3}})
243
+ page.locator('.mx-star[data-id="t_ext"]').click()
244
+ playwright.expect(page.locator(".mx-qprog span").first).to_have_text("ืฉืืœื” 4 ืžืชื•ืš 10")
245
+ playwright.expect(page.locator(".mx-qdots i.ok")).to_have_count(3)
246
+ assert not errors