Divide into 2 isosceles triangles
Python 3.8 (pre-release), 123 129 bytes
g=lambda*p:[[180-2*x,x]for x in p]
f=lambda a,b:((c:=180-a-b)==90or c>45>2in{a/b,b/a})*g(a,b)or(c/3in{a,b})*g(c/3,c/3*2)or f(b,c)
Try it online!
A function that takes in 2 angles, and returns the 2 isosceles triangles. If the given triangle cannot be divided, the function loops forever.
05AB1E, 39 38 bytes
OƵΔ᪩90KD®Qiʒ45‹®y23S*åà*}ßx‚}ε90α·y‚
Input as a pair of integers; output as a pair of pairs of integers.
Try it online or verify all test cases.
Explanation:
O # Take the sum of the (implicit) input-pair of angles
ƵΔα # Get the absolute difference with (compressed) 180
ª # Append that third angle to the (implicit) input-pair
© # Store it in variable `®` (without popping)
90K # Remove 90 from the triplet of angles
D # Duplicate it
®Qi # If it's still equal to `®` (thus none were 90):
ʒ # Filter the triplet by:
45‹ # Check that the angle is smaller than 45
* # AND
y2 S* # Check if the angle multiplied by 2
3S* à # or multiplied by 3
® å # is in the triplet of angles `®`
}ß # After the filter: pop and push the minimum of the remaining angles
x # Double it (without popping)
‚ # Pair the non-doubled and doubled values together
}ε # After the if statement: map the angles in the pair to:
90α # Get the absolute difference with 90
· # Double it
y‚ # And pair it with the non-mapped angle
# (after which the resulting pair of pairs is output implicitly)
See this 05AB1E tip of mine (section How to compress large integers?) to understand why ƵΔ
is 180
.
APL (Dyalog Unicode), 47 bytes
(⊢,⍨¨2×90-⊢)∘{90∊⍵:⍵~90⋄1 2×⌊/⍵∩∊⍵÷⊂2 3},,180-+
Try it online!
A tacit function that takes two angles as left and right arguments.
Uses the information found by Neil, modified to take care of xnor's test case:
A triangle can be divided into 2 isosceles triangles either if one of the angles is < 45° and is exactly one half or one third of one of the other angles, or if one of the angles is 90°.
Now, the base angles of the result can be found as follows:
- If one of the angles is 90°, the bases are the other two angles.
- Otherwise,
one of the angles is < 45° and is exactly one half or one third of one of the other angles
should hold, because the input is guaranteed to have a solution. In this case, the angle satisfying the condition becomes the base for one triangle, and the other triangle's base angle is twice the angle.
How it works: the code
(⊢,⍨¨2×90-⊢)∘{90∊⍵:⍵~90⋄1 2×⌊/⍵∩∊⍵÷⊂2 3},,180-+ ⍝ Left, Right: two angles
,,180-+ ⍝ Length-3 vector of three angles
{ } ⍝ Find two base angles:
90∊⍵:⍵~90⋄ ⍝ If an angle is 90, the bases are the other two
⍵∩∊⍵÷⊂2 3 ⍝ Otherwise, find the angles that are 1÷2 or 1÷3 of another
1 2×⌊/ ⍝ Take the minimum angle of that and attach its double
( )∘ ⍝ Attach apex angles to two base angles
2×90-⊢ ⍝ apex=180-2×base
⊢,⍨¨ ⍝ Attach each apex to the left of the base