Hexagon-In hay Hexagon-Out?


8

một câu chuyện tuyệt vời để kể về các hình lục giác thông thường được tìm thấy, ví dụ như trong tổ ong. Nhưng con ong bận rộn này cần sự giúp đỡ của bạn trong việc nói cho anh ta biết điểm nào ở bên trong hay bên ngoài honeypot của anh ta. Vì vậy, được đưa ra một hình lục giác đều như hình dưới đây, tập trung ở điểm gốc và với kích thước cạnh l, xác định xem một tập hợp tọa độ (x, y) có ở bên trong, chính xác ở cạnh hoặc bên ngoài hình lục giác thông thường của tôi không.

Hình lục giác có chiều dài cạnh l, chính giữa

Đầu vào, đầu ra và quy tắc

Các quy tắc là:

  • Phương thức nhập và xuất theo quy tắc mặc định .
  • Đầu vào bao gồm ba số nguyên : x,y,l.
  • xylà của bất kỳ định dạng số nguyên ký thuận tiện. llà tích cực (không bao giờ 0).
  • Chương trình của bạn phải xuất / trả về a 1nếu điểm (x,y)nằm trong hình lục giác thông thường, -1nếu nó ở bên ngoài hoặc 0nếu nó chính xác ở cạnh.
  • Đây là một môn đánh gôn, vì vậy mã ngắn nhất sẽ thắng. Trong trường hợp hòa, bài sớm nhất sẽ thắng.
  • Đối với đầu ra cho thiết bị xuất chuẩn: không gian hàng đầu / dấu hoặc dòng mới trong đầu ra được cho phép.
  • Tiêu chuẩn áp dụng.

Các trường hợp thử nghiệm

Dưới đây là một số trường hợp thử nghiệm:

0,0,1        --> 1
0,1,1        --> -1
0,-1,1       --> -1
1,0,1        --> 0
-1,0,1       --> 0
-1,-1,1      --> -1
1,1,1        --> -1
-2,-3,4      --> 1
32,45,58     --> 1
99,97,155    --> -1
123,135,201  --> 1

Tôi cho rằng đây là một hình lục giác thông thường, nhưng bạn nên làm rõ điều đó.
Cấp sông St

@LevelRiverSt có. Một thường xuyên. Tôi sẽ thêm nó trong giây lát.
bất cứ lúc nào

1
Chúng ta có thể lấy x, y làm số phức x + yi không?
lirtosiast


@lirtosiast câu hỏi là về một hình lục giác trong mặt phẳng euclidian, không phải trong mặt phẳng phức. Bởi vì đầu vào phức tạp không được phép.
agtoever

Câu trả lời:


2

JavaScript (ES6) 77 83

(a,b,l,h=Math.sqrt(3)*l,x=a<0?-a:a,y=b<0?-b:b)=>y|x!=l?2*y<h&x/l+y/h<1?1:-1:0

Kiểm tra

f=(a,b,l,h=Math.sqrt(3)*l,x=a<0?-a:a,y=b<0?-b:b)=>y|x!=l?2*y<h&x/l+y/h<1?1:-1:0

// TEST

function go() {
  C.width=400;C.height=300;
  var l=+I.value, x,y, cols={0:'#ff0',1:'#0f0','-1':'#888'},
  ctx = C.getContext("2d")
  ctx.translate(200,150)
  ctx.strokeStyle='#000'
  ctx.lineWidth=1;
  ctx.beginPath();
  ctx.moveTo(0,-150);ctx.lineTo(0,150);ctx.moveTo(-200,0);ctx.lineTo(200,0);
  ctx.stroke();
  ctx.strokeStyle='#f00'
  ctx.beginPath();
  ctx.moveTo(l*10,0);ctx.lineTo(l*5,l*Math.sqrt(3)*5);ctx.lineTo(-l*5,l*Math.sqrt(3)*5)
  ctx.lineTo(-l*10,0);ctx.lineTo(-l*5,-l*Math.sqrt(3)*5);ctx.lineTo(l*5,-l*Math.sqrt(3)*5)
  ctx.closePath();
  ctx.stroke();

  for(y=-14;y<15;y++)
    for(x=-19;x<20;x++) {
      ctx.beginPath();
      ctx.moveTo(x*10,y*10-3);ctx.lineTo(x*10,y*10+3);
      ctx.moveTo(x*10-3,y*10);ctx.lineTo(x*10+3,y*10);
      ctx.strokeStyle=cols[f(x,y,l)]
      ctx.stroke()
    }
}

go()
#C {
  border: 1px solid #000
}
<b>L</b> <input id=I value=15><button onclick="go()">GO</button><br>
<canvas id=C width=400 height=300></canvas>


2

Ruby, 150 145 137 127 125 106 88 76 byte

76 byte

->(x,y,l){x,y,t=x.abs,y.abs,3**0.5;d=t*l;z=d-t*x-y;2*y>d ?-1:2*x<l ?1:z<=>0}

Thay đổi ba so với một tên lửa.

88 byte

->(x,y,l){x,y,t=x.abs,y.abs,3**0.5;d=t*l;z=d-t*x-y;2*y>d ?-1:2*x<l ?1:z==0 ?0:0<z ?1:-1}

Loại bỏ y bằng với phép thử apothem cho các điểm trên hình lục giác, bởi vì đối với số nguyên, điều đó không bao giờ có thể đúng.

106 byte:

->(x,y,l){x,y,t=x.abs,y.abs,3**0.5;d=t*l;z=d-t*x-y;2*y==d&&2*x<=l ?0:2*y>d ?-1:2*x<l ?1:z==0 ?0:0<z ?1:-1}

Poster đề nghị không sử dụng epsilon, vì vậy thay thế epsilon bằng 0 và sắp xếp lại, loại bỏ một abs, v.v.

125 byte:

->(x,y,l){x,y,t,e=x.abs,y.abs,3**0.5,1e-9;d=t*l;z=d-t*x-y;(2*y-d).abs<=e&&2*x<=l ?0:2*y>d ?-1:2*x<l ?1:z.abs<=e ?0:0<z ?1:-1}

Kết hợp y vào định nghĩa của z và loại bỏ một số dấu ngoặc đơn.

127 byte:

->(x,y,l){x,y,t,e=x.abs,y.abs,3**0.5,1e-9;d=t*l;z=d-t*x;(2*y-d).abs<=e&&2*x<=l ?0:2*y>d ?-1:2*x<l ?1:(z-y).abs<=e ?0:y<z ?1:-1}

Sắp xếp lại các điều khoản để tránh sự cần thiết của diễn viên to_f. Sử dụng d (gấp đôi apothem) thay vì a (apothem). Kết hợp nhiều bài tập.

137 byte:

->(x,y,l){x=x.abs.to_f;y=y.abs.to_f;a=3**0.5*l/2;e=1e-9;z=2*a*(1-x/l);(y-a).abs<=e&&2*x<=l ?0:y>a ?-1:2*x<l ?1:(z-y).abs<=e ?0:y<z ?1:-1}

Nội tuyến 'c'.

150 byte:

->(x,y,l){c=l/2.0;x=x.abs.to_f;y=y.abs.to_f;a=3**0.5*l/2;e=1e-10;z=2*a*(1-x/l);(y-a).abs<=e&&x<=c ?0:(y>a ?-1:(x<c ?1:((z-y).abs<=e ?0:(y<z ?1:-1))))}

Điều này làm việc cho số nguyên hoặc nổi! Thử nghiệm epsilon sao cho các điểm trong vòng tắt lỗi nằm ở cạnh được xác định chính xác.

Các giá trị tuyệt đối di chuyển mọi thứ thành góc phần tư.

Giá trị 'a' là khoảng cách apothem (chặn y của hình lục giác).

Giá trị 'c' là giá trị x của góc trên bên phải của hình lục giác.

Giá trị 'z' là để xem điểm nằm trên hay dưới đường xiên từ góc tới góc chặn x.

Ung dung:

hex = ->(x,y,l){ 
    c = l/2.0;
    x = x.abs.to_f;
    y = y.abs.to_f;
    a = 3**0.5 * l / 2;
    e = 1e-10;
    z = 2*a*(1 - x/l);
    if (y-a).abs <= e && x <= c then 0
    elsif (y>a) then -1
    elsif (x<c) then 1
    elsif (z-y).abs <= e then 0
    elsif y < z then 1
    else -1
    end
}

Kiểm tra

hex = ->(x,y,l){x,y,t=x.abs,y.abs,3**0.5;d=t*l;z=d-t*x-y;2*y>d ?-1:2*x<l ?1:z<=>0}

cases = [
    [0,0,1,1],
    [0,1,1,-1],
    [0,-1,1,-1],
    [1,0,1,0],
    [-1,0,1,0],
    [-1,-1,1,-1],
    [1,1,1,-1],
    [-2,-3,4,1],
    [32,45,58,1],
    [99,97,155,-1],
    [123,135,201,1]
]

cases.each { |test| 
  expected = test[3]
  actual = hex.call(test[0],test[1],test[2])
  status = expected == actual ? "PASS" : "FAIL";
  p "#{status}. #(x,y) L = (#{test[0]},#{test[1]}) #{test[2]} Expects #{expected}. Actual #{actual}"
}
"Done!"

Điều này có thể ngắn hơn, bạn không cần epsilon cho số nguyên
edc65

Bằng cách giới thiệu căn bậc ba của ba, tôi buộc phải sử dụng dấu phẩy động. Tôi có thể làm tròn số trước khi so sánh, hoặc sử dụng tính toán epsilon. Vì epsilon cho phép mã tổng quát hơn và hoạt động cho float, tôi đã để lại trong epsilon. Tôi mới chỉ lập trình Ruby được một thời gian ngắn, vì vậy tôi không chắc nó xử lý các lỗi làm tròn như thế nào.
Paul Chernoch

Độ dốc của bên trái và bên phải là không hợp lý. Các apotheme không hợp lý. Chỉ có 2 điểm với tọa độ nguyên nằm trên chu vi: [l, 0] và [-l, 0]
edc65

Bạn có thể đúng rằng đối với các đầu vào số nguyên, không có điểm nguyên nào khác có thể "bật" hình lục giác. Chứng tỏ rằng với bản thân tôi khó hơn làm cho mã không quan tâm, sử dụng epsilon.
Paul Chernoch

Vâng! Chỉ cần thông qua giải pháp Python!
Paul Chernoch


0

Julia, 65 58 byte

f(x,l)=(t=maxabs(x/l*[[0 1 1];[2 1 -1]/3^.5]);(t<1)-(t>1))

xlà một vectơ hàng [x y]. Gọi như thế này : f([0 0],1).


0

Python 2, 89 byte

gần như cùng một giải pháp như câu trả lời của Julia nhưng chúng ta có thể sử dụng thao tác trên vector mà không cần numpy

lambda x,y,L,K=3**0.5/2.:cmp(K*L,max([abs(x*i+y*j)for i,j in[[K,1/2.],[0,1],[-K,1/2.]]]))

Các kết quả

>>> f(0,0,1)
1
>>> f(32,45,58)
1
>>> f(99,97,155)
-1
>>> f(-1,0,1)
0
>>> [f(0,0,1)== 1,f(0,1,1)== -1,f(0,-1,1)== -1,f(1,0,1)== 0,f(-1,0,1)== 0,f(-1,-1,1)== -1,f(1,1,1)== -1,f(-2,-3,4)== 1,f(32,45,58)== 1,f(99,97,155)== -1,f(123,135,201)== 1,f(0,0,1)== 1,f(0,1,1)== -1,f(0,-1,1)== -1,f(1,0,1)== 0,f(-1,0,1)== 0,f(-1,-1,1)== -1,f(1,1,1)== -1,f(-2,-3,4)== 1,f(32,45,58)== 1,f(99,97,155)== -1,f(123,135,201)== 1]
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]


0

JavaScript (ES6), 67 byte

with(Math)(a,b,l)=>sign(min(l*l*3-b*b*4,(l-abs(a))*sqrt(3)-abs(b)))

Lưu ý: Để gán giá trị này cho một biến để bạn có thể gọi nó, hãy đặt f=sau with(Math).

Tôi đã sử dụng l*lb*btrong tham số đầu tiên minđể tránh các cuộc gọi đến abssqrtnhưng tôi không thể làm việc hiểu xem tôi có thể làm một thủ thuật tương tự với tham số thứ hai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.