Codegolf - Решите Sin(Θ) = X В Диапазоне A ≤ Θ ≤ B

  • Автор темы Sors
  • Обновлено
  • 23, Oct 2024
  • #1

Испытание

Учитывая число,

 x, a, b => outputs
0.500, 0, 360 => 30.000, 150.000
-0.200, 56, 243 => 191.537
0.000, -1080, 1080 => 0.000, 180.000, 360.000, 540.000, 720.000, 900.000, 1080.000, -1080.000 -900.000, -720.000, -540.000, -360.000, -180.000
 
where b , а целые числа a and θ , где x , solve the equation a° ≤ θ ≤ b° для θ , giving все решения в ассортименте sin(θ) = x .

Правила

b > a will have a maximum of three decimal places of precision. The output, b , также должно быть до трех десятичных знаков, не больше и не меньше.

Ваш вывод может быть списком или отдельным выводом.

Вы можете использовать встроенные триггерные функции.

Вы не можете использовать радианы для a and -1 ≤ x ≤ 1 .

Вам никогда не будет предоставлен неверный ввод.

Вывод может быть в любом порядке.

Примеры

x

Победа

Выигрывает самый короткий код в байтах.

#код-гольф #математика #число #тригонометрия

Sors


Рег
15 Nov, 2006

Тем
76

Постов
187

Баллов
617
  • 26, Oct 2024
  • #2

Фортран 95 (gfortran), 180 байт

 
 
 
 
 
 
 
 
 
 1e-6 

Структура без гольфа:

function(x,a,b,u=seq(a,b,.001))sprintf("%.3f",u[abs(sinpi(u/180)-x)<1e-6]) ||answer||

Математика, 60 байт

-- g/180=r/pi => r=pi*g/180 --y+k*360=a -- a-y -- k=------ -- 360 -- find all angles of the same class of angles [y+k*360] in interval [a,b] gg(y,a,b)== r:List Float:=[] t:=y+truncate((a-y)/360)*360 --truncate(1.9)=1, truncate(-3.1)=-4 is ok repeat t>b=>break if t>=a then r:=append(r,[t]) t:=t+360 r -- ff returns the list of solution y of sin(y)=x with y in the interval [a,b] ff(x,a,b)== abs(x)>1 or a>b =>[] y:=asin(x)*180/%pi -- z and y are the only 2 solutions in one 360 Len interval z:=180-y sort(append(gg(y,a,b),gg(z,a,b))) (6) -> f(0.5, 0, 360) (6) [30.0,150.0] Type: List Float (7) -> f(-0.2, 56, 243) (7) [191.5369590328 1548769] Type: List Float (8) -> f(0.0, -1080, 1080) (8) [- 1080.0, - 900.0, - 720.0, - 540.0, - 360.0, - 180.0, 0.0, 180.0, 360.0, 540.0, 720.0, 900.0, 1080.0] (14) -> m:=f(-0.1, -2035, -243) (14) [- 1974.2608295227 33214, - 1805.7391704772 66786, - 1614.2608295227 33214, - 1445.7391704772 66786, - 1254.2608295227 33214, - 1085.7391704772 66786, - 894.2608295227 332137, - 725.7391704772 667863, - 534.2608295227 332137, - 365.7391704772 667863] Type: List Float (15) -> map(x+->sin(%pi*x/180), m) (15) [- 0.0999999999 9999999987, - 0.1000000000 0000000016, - 0.0999999999 9999999986 2, - 0.1000000000 0000000028, - 0.0999999999 9999999985 4, - 0.1000000000 0000000018, - 0.0999999999 999999999, - 0.1000000000 0000000019, - 0.0999999999 9999999989 2, - 0.1000000000 0000000014] Type: List Float

вход

[0, -1080, 1080]

выход

{-1080.000,-900.000,-720.000,-540.000,-360.000,-180.000,0.000,180.000,360.000,540.000,720.000,900.000,1080.000}

 

Chuzhdaya


Рег
29 Nov, 2019

Тем
88

Постов
197

Баллов
677
  • 26, Oct 2024
  • #3

APL, 51 46 40 39 байт

Сэкономлено 3 байта благодаря @KritixiLithos

6 7 байт сохранено благодаря @Adám

g(y,a,b)==(r:List Float:=[];t:=y+truncate((a-y)/360)*360;repeat(t>b=>break;if t>=a then r:=append(r,[t]);t:=t+360);r) f(x,a,b)==(abs(x)>1 or a>b=>[];y:=asin(x)*180/%pi;z:=180-y;sort(append(g(y,a,b),g(z,a,b))))

Вызывается диадой с from math import* x,a,b=input() while a<=b: if round(sin(pi*a/180),5)==x:print a a=round(a+.001,3) as left argument and for([,$s,$f,$t]=$argv;$f<=$t;$f+=.001)round(sin(deg2rad($f)),5)!=$s?:printf("%.3f_",$f); как правильный аргумент, подсказывает ⊢+1E3÷⍨(⍳1001×-) ⍝ build the range a to b with step of 0.001 1001×- ⍝ 1001 * (b - a) ⍳ ⍝ range 1E3÷⍨ ⍝ divide every element by 1000 ⊢+ ⍝ add a back {3⍕⍵/⍨1E¯6>|⎕-1○○⍵÷180} ⍝ filter the solutions ○⍵÷180 ⍝ convert to radian - π * ⍵ / 180 1○ ⍝ compute sine |⎕- ⍝ distance from x 1E¯6> ⍝ small enough ⍵/⍨ ⍝ compress with the original list 3⍕ ⍝ format to 3 decimal places .

Требует ⎕IO←0 .

Как?

x ||answer||

PHP>=7.1, 88 байт

b

Онлайн-версия

 

Rrraketa


Рег
01 May, 2006

Тем
59

Постов
177

Баллов
502
  • 26, Oct 2024
  • #5

Аксиома, 266 215 210 байт

{3⍕⍵/⍨1E¯6>|⎕-1○○⍵÷180}⊢+1E3÷⍨(⍳1001×-)

унгольф и тест

NumberForm[t/.NSolve[Sin[t/180Pi]==#&&#2<=t<=#3,{t}],{9,3}]& ||answer||

Р, 74 байта

program a implicit none real :: x integer :: i integer :: j real :: o real :: r real :: q real :: p read(*,*) x read(*,*) i read(*,*) j o=ASIN(x)*57.2957 p=o-180+o q=o-360*999 do r=q-p if(r<=j.and.r >=i) then write(*,'(f9.3)') r endif if(q>=j) then exit endif if(q >=i) then write(*,'(f9.3)') q endif q = q + 360 end do end program a

Попробуйте онлайн!

Толерантность #define G >=i)write(*,'(f9.3)') #define H read(*,*) program a H x H i H j o=ASIN(x)*57.2957 p=o-180+o q=o-360*999 do r=q-p if(r<=j.and.r G r if(q>=j)exit if(q G q q=q+360 enddo end was chosen to fit the second test case, so is somewhat arbitrary. This answer takes advantage of R's vectorized functions.

 

Sustro


Рег
25 Mar, 2020

Тем
79

Постов
213

Баллов
628
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно