Võng mạc hay Thùng rác?


47

Chúng ta đang sống trong một thời đại công nghệ tuyệt vời nơi chúng ta có thể có màn hình 8K chi tiết đẹp mắt trên TV và thậm chí màn hình 2K trên điện thoại để thỏa mãn trình duyệt di động. Chúng ta đã đi một chặng đường dài trong những năm gần đây về công nghệ màn hình.

Một trong những sản phẩm của điều này là một thuật ngữ được phổ biến bởi Apple, Retina . Điều này đề cập đến mật độ pixel của màn hình được đề cập là rất cao, ở khoảng cách xem từ 10-12 inch, các pixel riêng lẻ có thể dễ dàng được chọn ra.

Steve Jobs nói rằng mật độ pixel nơi điều này xảy ra là khoảng 300 pixel mỗi inch và họ bắt đầu sử dụng mật độ pixel trong phạm vi này trên thiết bị của họ với từ thông dụng Retina được sử dụng để quảng cáo.

Mật độ pixel có thể được tính theo công thức sau:

D = sqrt (w ^ 2 + h ^ 2) / d

Đâu dlà đường chéo của màn hình tính bằng inch, wlà số pixel trên trục hoành và hlà số pixel trên trục tung.

Nhiệm vụ của bạn

Đối với nhiệm vụ này, bạn sẽ sử dụng tiêu chuẩn Retina để quyết định sản phẩm nào đáng mua. Là người tiêu dùng hiện đại mà bạn đang có, khi bạn mua sắm các thiết bị bạn muốn đảm bảo rằng bạn đang nhận được một sản phẩm tốt chứ không phải một số thiết bị từ những năm 90! Do đó, bạn muốn xây dựng một chương trình hoặc chức năng lấy chiều rộng màn hình, chiều cao và chiều dài đường chéo làm tham số đầu vào hoặc chức năng và cho bạn biết màn hình cụ thể có đủ điều kiện là màn hình võng mạc ( D > 300) bằng cách in ra màn hình hoặc quay lại không .

Do sự khinh miệt của bạn đối với các thiết bị không phải Retina, chương trình hoặc chức năng của bạn sẽ xuất ra Retina!khi thiết bị đủ điều kiện và Trash!khi nào thì không.

Bạn có thể giả định rằng tất cả các số sẽ lớn hơn 0. Giá trị pixel cho chiều rộng và chiều cao sẽ luôn là số nguyên. Kích thước màn hình có thể được diễn giải theo bất kỳ cách nào, miễn là nó hỗ trợ số thập phân. Đầu vào có thể theo bất kỳ thứ tự nào bạn chọn và cũng có thể nằm trên tối đa 3 dòng riêng biệt.

Ví dụ I / O

1920 1080 4.95   -> Retina!
2560 1440 5.96   -> Retina!
1920 1080 10.5   -> Trash!
10 10 0.04       -> Retina!
4096 2160 19(.0) -> Trash!
8192 4320 100.00 -> Trash!
3000 1500 11.18  -> Retina!
180 240 1(.0)    -> Trash!

Đây là , vì vậy số byte ít nhất sẽ thắng.


Đây là một giải pháp Stuck, ngôn ngữ lập trình dựa trên ngăn xếp mà tôi đang thực hiện:

r;`;/300>"Retina!""Trash!"?

34
Ai đó, làm ơn, làm một câu trả lời Retina
Chấn thương kỹ thuật số

2
@DigitalTrauma Nhưng nổi.
Sp3000

7
@ Sp3000 pfft, xin lỗi!. Xây dựng regex phân tích cú pháp float của riêng bạn trong Retina!
Trình tối ưu hóa

46
@ Sp3000 Được rồi, hãy nâng cao cổ phần. Tôi xin cam kết sẽ trả một khoản tiền thưởng lớn 500 pt ngon ngọt cho câu trả lời ngắn nhất về mặt pháp lý (sự đồng thuận của cộng đồng) cho câu hỏi này một tuần từ dấu thời gian đăng bình luận này.
Chấn thương kỹ thuật số

2
Hmm, ngưỡng được chọn không hoàn toàn khớp với tiếp thị của Apple, ví dụ: cho Retina iMac: 5120 2880 27
Ed Avis

Câu trả lời:


5

Pyth - 27 byte

Sử dụng toán tử ternary và absđể tính toán pythagore.

?>c.avzQ300"Retina!""Trash!

Đưa đầu vào thành hai dòng, dòng đầu tiên width, height, dòng thứ hai diag.

Các quy tắc đã được thư giãn để quay trở lại.

Hãy thử trực tuyến tại đây .


115

Võng mạc , 530 220 210 202 201 193 191 187 185 (184) byte

Tín dụng cho Randomra để tiết kiệm 3 byte! (Và mở đường cho một cặp vợ chồng nữa.)

+`\.(\d)(.+)( .+)
$1.$2_$3_
\b
#
+`(\d*)#((((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|\w)
$1$1$1$1$1$1$1$1$1$1$3$4$5$6$7$8$9$10$11#
\d
11
(?=(1*)\1)[^.]
$1
^(1+)\.\1{90000}1+
Retina!
1.+
Trash!

Đối với mục đích đếm byte, mỗi dòng đi trong một tệp riêng biệt, nhưng bạn có thể chạy mã ở trên như từ một tệp bằng cách gọi Retina bằng -scờ.

Điều này mong đợi mật độ trước tiên ( phải chứa một dấu thập phân, ngay cả khi đó là mật độ dấu), tiếp theo là chiều rộng và chiều cao, nghĩa là d w h.

Đây là một chút chậm. Tôi sẽ không thử hầu hết các trường hợp thử nghiệm nhất định, bởi vì nó sẽ chạy trong nhiều năm. Tuy nhiên, bạn có thể kiểm tra xem nó có hoạt động chính xác với các trường hợp thử nghiệm không

19. 4096 2160     -> Trash!
1. 180 240        -> Trash!
1. 181 240        -> Retina!
1. 180 241        -> Retina!
0.04 10 10        -> Retina!

Về cơ bản, sau khi nhân tất cả các số qua để biến mật độ thành một số nguyên, bạn không muốn chiều rộng và chiều cao có nhiều hơn 4 chữ số.

Mặc dù điều này là chậm, nhưng nó hoàn toàn chính xác ... không có vấn đề dấu phẩy động hay bất cứ điều gì tương tự. Tất cả số học đang sử dụng số nguyên (đơn nguyên).

Về nguyên tắc, tôi có thể cạo thêm một byte: ^có thể bỏ qua, nhưng nó sẽ làm cho Trash!các trường hợp thử nghiệm bị chậm khủng khiếp do số lượng quay lại quá nhiều.

Giải trình

Trước tiên, hãy sắp xếp lại bất đẳng thức để tránh các phép toán dấu phẩy động:

√(w2 + h2) / d > 300
√(w2 + h2) > 300 d
w2 + h2 > 90000 d2

Chúng tôi cũng có thể nhận thấy rằng đây là bất biến theo cách nhân w, hddo cùng một số x:

w2 + h2 > 90000 d2
(x w)2 + (x h)2 > 90000 (x d)2
x2 (w2 + h2) > 90000 x2 d2
w2 + h2 > 90000 d2

Có một số cách để bình phương một số đơn nguyên, nhưng chúng ta sẽ sử dụng danh tính

n2 = Σi=1..2n ⌊i/2⌋

Điều này cho chúng ta một cách để giải quyết vấn đề chỉ sử dụng số học số nguyên (đại diện cho số nguyên trong đơn nguyên).

Chúng ta hãy đi qua mã. Mỗi cặp dòng là một sự thay thế regex.

+`\.(\d)(.+)( .+)
$1.$2_$3_

Điều này liên tục di chuyển dấu thập phân trong mật độ sang phải trong khi nhân chiều rộng và chiều cao với 10 ( xở trên). Điều này là để đảm bảo rằng tất cả các số là số nguyên. Thay vì nối các số 0, tôi đang nối thêm _, mà sau này tôi sẽ coi là số không. (Đây là một mẹo chơi gôn, vì nếu không tôi cần phải viết ...${3}0để tránh sự mơ hồ $30.) Phía +trước biểu thức chính thức nói với Retina lặp lại sự thay thế này cho đến khi kết quả ngừng thay đổi (đó là trường hợp khi mô hình không còn phù hợp) .

\b
#

Chúng tôi đang chuẩn bị ba số để chuyển đổi thành unary ngay bây giờ. Về nguyên tắc, chúng ta cần một điểm đánh dấu (trước #) trước mỗi số, nhưng nó sẽ ngắn hơn để thêm một điểm vào cuối mỗi số, điều này sẽ không ảnh hưởng đến bước chuyển đổi.

+`(\d*)#((((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|\w)
$1$1$1$1$1$1$1$1$1$1$3$4$5$6$7$8$9$10$11#

Đây là chuyển đổi sang unary, sử dụng một thủ thuật đã được dan1111 phát triển . Về cơ bản, tôi đang dịch mỗi chữ số thành một chữ số lặp lại của chính nó, trong khi nhân các chữ số hiện có với 10 (di chuyển #điểm đánh dấu sang phải trong quy trình). Biểu diễn nhị phân này sẽ khá lộn xộn với các chữ số khác nhau, nhưng tổng số sẽ bằng với giá trị của số nguyên ban đầu. Lưu ý \wở cuối - thông thường đây chỉ là 0, nhưng chúng tôi cũng muốn coi _là số không (được coi là một ký tự từ trong regex).

\d
11

Chúng tôi biến mỗi chữ số thành hai 1s, do đó a) đảm bảo tất cả các chữ số đều giống nhau (sẽ cần thiết sau này) và b) nhân đôi mỗi số.

(?=(1*)\1)[^.]
$1

Điều này thực hiện hai điều: nó bình phương tất cả các số (hoặc đúng hơn một nửa của mỗi số, bằng cách tính tổng 2n), và thêm các bình phương kết quả của chiều rộng và chiều cao. Lưu ý rằng [^.]phù hợp với 1s, #đánh dấu và không gian. Nếu đó là một #hoặc một không gian, giao diện sẽ không thu được bất cứ thứ gì, có nghĩa là tất cả những thứ đó chỉ bị xóa, tức là kết quả cho chiều rộng và chiều cao được nối / thêm vào. Dấu thập phân .vẫn còn để phân tách kết quả cho dnhững người. Nếu [^.]khớp với một 1thay vào đó, thì cái nhìn đảm bảo rằng chúng ta chụp được một nửa số 1sau nó (làm tròn xuống) trong nhóm 1. Điều này sẽ tính tổng tôi đã đề cập ở trên, sau đó sẽ mang lại bình phương của số ban đầu.

^(1+)\.\1{90000}1+
Retina!

Chuỗi bây giờ (trong unary), sau đó , (unary). Chúng tôi muốn biết nếu số lần unary đầu tiên ngắn hơn lần thứ hai. Chúng ta có thể dễ dàng thực hiện phép nhân này bằng cách sử dụng cú pháp bắt nhóm và lặp lại. Chúng tôi sử dụng (thay vì ) sau đó để đảm bảo rằng số thứ hai thực sự lớn hơn số đó và không chỉ bằng nhau. Nếu vậy, chúng tôi thay thế tất cả bằng cách .d2.w2 + h290000{n}1+1*Retina!

1.+
Trash!

Nếu số thứ hai không đủ lớn, thì bước trước đó sẽ không thay đổi gì và chuỗi vẫn sẽ bắt đầu bằng a 1. Nếu đó là trường hợp, chúng tôi chỉ cần thay thế toàn bộ chuỗi bằng Trash!và được thực hiện.


24
Vâng, nó đã xảy ra. Bây giờ tất cả chúng ta có thể chết hạnh phúc.
Alex A.

94
Như một lưu ý phụ, vì đây là Retina, điều đó có làm cho tất cả các câu trả lời khác trở thành rác không?
Alex A.

5
Thần của chúng tôi đã đến!
Kade

7
OK, vì vậy lời hứa tiền thưởng của tôi vẫn đứng vững, nhưng tôi muốn xem một lời giải thích kỹ lưỡng (về mặt khái niệm tôi nghĩ tôi biết nó được thực hiện như thế nào, nhưng muốn xem chi tiết). Ngoài ra, tôi sẽ trao tiền thưởng cho câu trả lời Retina hợp pháp ngắn nhất, vì vậy, các bạn, tiền thưởng vẫn còn mở cho các câu trả lời Retina ngắn hơn!
Chấn thương kỹ thuật số

2
@AlexA. Không, bởi vì có một câu trả lời Retina khác.
Ismael Miguel

38

Con trăn, 49

lambda w,h,d:"RTertaisnha!!"[w*w+h*h<=9e4*d*d::2]

Sử dụng chuỗi xen kẽ.

Hóa ra ngắn hơn để vuông cả hai bên hơn là sử dụng định mức phức tạp.

w*w+h*h<=9e4*d*d
abs(w+1j*h)<=300*d

18
Chúng tôi đã dự định in một trong hai Retina!hoặc Trash!! Không rạn nứt @ertaisnha !!
Trình tối ưu hóa


2
@Mew nhưng điều đó ngược lại;)
Trình tối ưu hóa

Thật tuyệt, tôi chưa thấy (ab) sử dụng để in một hoặc một chuỗi khác
Nick T

15

Võng mạc , 312 byte

(\d+) (\d+) (\d+)(?:\.(\d+))?
a$1bc$2dj300ke$3fg$4h9iiiiiiiii8iiiiiiii7iiiiiii6iiiiii5iiiii4iiii3iii2ii1i0
+`(b.*)(d.*)fg(\d)
0$10$2$4fg
+`(a|c|e|j)(\d)(\d*)(i*)((?:b|d|f|k).*h.*\2(i*))
$1$3$4$4$4$4$4$4$4$4$4$4$6$5
g`(i+)
Q$1R$1
+`Q(i+)Ri
$1Q$1R
+`(j(i*).*e)i(.*f)
$1$3$2
a(i*).*c(i*).*f\1\2.*
Trash!
.*0
Retina!

Điều này không mất nhiều thời gian để chạy, nhưng nó có vẻ hoạt động.

Có lẽ có thể chơi golf nhiều hơn nữa ...

Giải trình:

(\d+) (\d+) (\d+)(?:\.(\d+))?
a$1bc$2dj300ke$3fg$4h9iiiiiiiii8iiiiiiii7iiiiiii6iiiiii5iiiii4iiii3iii2ii1i0

Thêm thẻ để làm cho chuỗi phân tích thuận tiện hơn và thêm một số rác để dễ dàng chuyển đổi sang cơ sở 1 và thêm 300 để nhân lên sau

+`(b.*)(d.*)fg(\d)
0$10$2$4fg

Nối 0s vào chiều rộng và chiều cao, đồng thời nối phần thập phân của đường chéo vào phần nguyên. Khi điều này được thực hiện, đường chéo sẽ là một số nguyên và chiều rộng và chiều cao sẽ được nhân với tuy nhiên nhiều 10s là cần thiết.

+`(a|c|e|j)(\d)(\d*)(i*)((?:b|d|f|k).*h.*\2(i*))
$1$3$4$4$4$4$4$4$4$4$4$4$6$5

Chuyển đổi tất cả các số thành cơ sở 1, sử dụng bảng tra cứu tôi đã thêm vào bước đầu tiên

g`(i+)
Q$1R$1

Chuẩn bị để vuông tất cả các số

+`Q(i+)Ri
$1Q$1R

Bình phương mỗi số

+`(j(i*).*e)i(.*f)
$1$3$2

Nhân bình phương của đường chéo với bình phương 300 chúng ta đã chèn vào bước đầu tiên

a(i*).*c(i*).*f\1\2.*
Trash!

Nếu chiều rộng được thêm vào chiều cao phù hợp với sản phẩm chúng tôi vừa tính toán, mật độ pixel quá thấp và đó là Thùng rác!

.*0
Retina!

Nếu không, đó là Retina!



9

APL, 40 36 byte

Đã lưu 4 byte nhờ Dennis!

{(9E4×⍵*2)<+/⍺*2:'Retina!''Trash!'}

Điều này tạo ra một hàm dyadic không tên, lấy hai đối số đầu tiên ở bên trái và thứ ba ở bên phải. Nó kiểm tra xem tổng bình phương của các giá trị bên trái có lớn hơn 300 ^ 2 lần bình phương của giá trị bên phải hay không. Đầu ra được in tương ứng.

Bạn có thể thử trực tuyến !


Nên làm mới trước khi đăng ... Bạn có thể lưu một vài byte byte lấy hai đối số đầu tiên bên trái.
Dennis

@Dennis Cảm ơn sự giúp đỡ của bạn! Tôi đã cân nhắc xóa câu trả lời của mình khi tôi thấy câu trả lời của bạn vì câu trả lời của bạn tốt hơn. : P
Alex A.

9

TI-BASIC, 43

Đưa chiều rộng và chiều cao qua màn hình chính dưới dạng danh sách hai yếu tố và đường chéo qua Đầu vào.

Input D
If 300D>√(sum(Ans²
Then
Disp "Retina!
Else
"Trash!

Các chữ cái viết thường hai byte của TI-BASIC thêm 7 byte ( i, là đơn vị tưởng tượng, là một byte) khiến nó khá không cạnh tranh. Rất may, !cũng là một byte vì nó đại diện cho chức năng giai thừa.


9

JavaScript ES6, 49 byte

(w,h,d)=>Math.hypot(w,h)/d>300?'Retina!':'Trash!'

Tôi ghét rằng JavaScript có các toán tử dài như vậy. Nhưng ngay cả khi có một Math.pythagoreancái này sẽ ngắn hơn.


Ai đó giải thích downvote?
Hạ cấp

Có lẽ vì quá dài.
lirtosiast

1
@ThomasKwa Python chỉ ngắn hơn 1 byte
Trình tối ưu hóa

5
Thay vì tính căn bậc hai, nó có thể ngắn hơn nếu bạn so sánh bình phương của các giá trị.
Reto Koradi

4
@RetoKoradi Vâng, nó ngắn hơn:(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
pepkin88

8

Excel, 44 byte

Nhập đầu vào của bạn trong các ô này.

  • A1 = Chiều rộng tính bằng pixel
  • B1 = Chiều cao tính bằng pixel
  • C1 = Đường chéo tính bằng inch

Và công thức này cho kết quả của bạn:

=IF((300*C1)^2<A1^2+B1^2,"Retina!","Trash!")

4
Tôi đã cố gắng đánh golf 2 byte trong số này bằng cách gõ 9E4*C1^2thay vì (300*C1)^2... điều này mang lại độ dài 42. Tuy nhiên, nhập 9E4công thức trong Excel, sẽ được thay đổi 90000ngay khi bạn nhấn enter. :(
Ross Presser

7

Prolog, 51 byte

a(W,H,D,R):-9e4*D*D<W*W+H*H,R="Retina!";R="Trash!".

Chạy a(8192,4320,100.0,R).đầu ra:R = "Trash!" .

Chỉnh sửa: Cảm ơn @PaulButcher vì đã sửa trường hợp cạnh và đánh gôn một byte.


Điều này trả về "Retina!", Khi mật độ là 300 (ví dụ 180 240 1 -> Trash!) từ ví dụ. May mắn thay, vì bạn có thể cạo sạch hai ký tự bằng ký hiệu điện tử, thay đổi >để >=lại nó ở 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
Paul Butcher

@PaulButcher Sử dụng 9e4 thay vì 90000 thực sự loại bỏ 2 ký tự, không phải một ký tự. Vì vậy, bạn đã rút ngắn câu trả lời của tôi một cách hiệu quả bằng một byte cũng như sửa trường hợp cạnh này, cảm ơn.
Gây tử vong

1
Làm tốt! Thật tốt khi thấy một ví dụ Prolog ngắn hợp lý.
Paul Butcher

@PaulButcher Cạo thêm một byte bằng cách thực sự sử dụng <thay vì >=và hoán đổi kết quả hai chuỗi ...
Fatalize

5

JavaScript (ES6), 45 byte

f=(w,h,d)=>w*w+h*h>d*d*9e4?'Retina!':'Trash!'

CoffeeScript, 47 byte

Không có toán tử ternary, nhưng có lũy thừa (không giúp ích gì trong lần thử mới nhất).

f=(w,h,d)->w*w+h*h>d*d*9e4&&'Retina!'||'Trash!'

# Previous attempt
f=(w,h,d)->(w*w+h*h)**.5/d>300&&'Retina!'||'Trash!'

1
Theo thông số kỹ thuật, không cần thiết phải có hàm có tên ( f=). Bạn có thể cắt 2 byte trong tất cả các phiên bản.
Kroltan


5

Pure Bash (không có bc / các lệnh bên ngoài khác), 138 136 135 82 83 byte

a=${3#*.}
d=${a//?/0}
r=(Trash Retina)
echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!

Tôi quyết định thử làm nó trong bash tinh khiết. Có lẽ tôi đã có một vài sự thiếu hiệu quả rõ ràng vì đây là lần đầu tiên tôi chơi golf, nhưng tôi rất quen với bash và đã từng rất vui khi cố gắng viết những thứ không sử dụng bất kỳ lệnh bên ngoài nào (ví dụ như bash thuần túy).

Các tuyên bố printf là khó chịu nhất. Bất cứ ai có bất kỳ ý tưởng tốt hơn cho số đệm với số không?

EDIT: Đã lưu hai byte, hóa ra printf sẽ lấy một đối số trống cho 0. Đã lưu một byte khác, hóa ra trước đây tôi đã bị nhầm lẫn và chỉ gán đầu ra của printf cho một biến nhỏ hơn so với sử dụng -v.

EDIT2: Nhờ có Chấn thương kỹ thuật số trong các bình luận, giờ đây điều này đã giảm đáng kể hơn nhiều. Thủ thuật: sử dụng hỗ trợ regex của bash để thay thế chuỗi chữ số bằng số 0 thay vì đếm nó sau đó in số không đó (có vẻ hiển nhiên khi tôi đặt nó như thế ...), lưu trữ chuỗi trong một mảng bash để lưu lại tiếng vang, và có tính đến một thay đổi nhỏ trong quy tắc có nghĩa là bạn có thể kết thúc tất cả các số đầu vào trong .0.

EDIT3: Đã thêm một byte để sửa lỗi được giới thiệu bởi sửa đổi được đề xuất của Digital Trauma.


Một cái gì đó như thế này cho số điểm 102: a=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}! (bạn có thể thay thế ;bằng dòng mới - tôi chỉ cố gắng để có được nó trong một nhận xét).
Chấn thương kỹ thuật số

Và nếu bạn cho rằng các số nguyên mật độ sẽ kết thúc bằng .0(ok, tôi nghĩ vậy) thì bạn có thể ghi được 82:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
Chấn thương kỹ thuật số

Ví dụ ban đầu có một số không kết thúc bằng 0, nhưng tôi nhận thấy câu hỏi hiện đã được sửa đổi, vì vậy sẽ tiết kiệm được một chút. Cảm ơn các ý tưởng! Tôi đặc biệt thích ý tưởng của bạn để cắt giảm hai câu tiếng vang; Tôi đã cố gắng tìm ra cách để làm điều đó, vì một số lý do tôi đã không sử dụng một mảng! Vì một số lý do, C ALNG chưa bao giờ xảy ra với tôi rằng bạn có thể sử dụng ** ... Tôi sẽ thử và xác minh câu trả lời của bạn, tôi hơi bối rối về cách $ d hoạt động ở đây nhưng tôi sẽ tìm ra nó.
Muzer

Điều $dnày không quá khó khăn. achứa các chữ số của mật độ sau dấu thập phân. d=${a/./0}chỉ cần thay thế tất cả các chữ số bằng số không. Do đó, chúng ta có thể nối các số 0 đó đến hết whnhân với cùng một công suất mười có thể đạt được bằng cách loại bỏ dấu thập phân khỏi d.
Chấn thương kỹ thuật số

1
Chúc mừng, tôi nghĩ rằng tôi sẽ phát điên trong một phút!
Muzer

4

dc, 41 byte

[[Retina!]pq]sr?d*rd*+vr/300<r[Trash!]p

Yêu cầu args được nhập theo d, w, hthứ tự - Tôi hy vọng điều này là OK.

Đầu ra thử nghiệm:

$ for t in \
> "4.95 1920 1080" \
> "5.96 2560 1440" \
> "10.5 1920 1080" \
> "0.04 10 10" \
> "19 4096 2160" \
> "100.00 8192 4320" \
> "11.18 3000 1500" ; do \
> echo $t | dc -e'9k[[Retina!]pq]sr?d*rd*+vr/300<r[Trash!]p'
> done
Retina!
Retina!
Trash!
Retina!
Trash!
Trash!
Retina!
$ 

3

Julia, 46 45 42 byte

f(w,h,d)=w^2+h^2>9e4d^2?"Retina!":"Trash!"

Điều này tạo ra một hàm chấp nhận ba giá trị số và trả về một chuỗi.

Đó là một cách thực hiện trực tiếp của công thức, chỉ cần sắp xếp lại một chút. Cả hai mặt của bất đẳng thức được nhân với dbình phương.


3

R, 59 55 byte

Là một chức năng chưa được đặt tên bây giờ

function(h,w,d)if(h^2+w^2>9e4*d^2)'Retina!'else'Trash!'

Việc thực hiện rất đơn giản, giúp loại bỏ sự cần thiết của các tham chiếu chỉ mục.

Trước

cat(if((n=scan()^2)[1]+n[2]>9e4*n[3])'Retina!'else'Trash!')

Khá đơn giản, có được đầu vào từ quét vào một vectơ (một dòng, tách biệt hoặc nhiều dòng). Bình phương vectơ. Làm tính toán và mèo kết quả.


3

MATLAB - 49 45 byte

c={'Trash!','Retina!'};c{(w*w+h*h>9e4*d*d)+1}

Trước tiên tôi phải khai báo một mảng ô chứa Trash!Retina!được lưu trữ ở vị trí 1 và 2 trong mảng ô. Tiếp theo, tôi sử dụng quan sát được nhiều người quan sát để sắp xếp lại phương trình để bạn chỉ kiểm tra điều kiện bằng số học số nguyên. Tôi đại diện 90000 như 9e4để lưu một số byte. Nếu điều kiện này là đúng, chúng ta xuất 1, khác với đầu ra 0. Tôi sử dụng đầu ra này để lập chỉ mục trực tiếp vào mảng ô. Vì MATLAB bắt đầu lập chỉ mục ở mức 1, tôi cũng phải thêm 1 để hoàn thành việc lập chỉ mục. Điều tuyệt vời là thêm truebằng 1 cho 2, trong khi thêm falsebằng 1 cho 1. Điều này sẽ xuất ra Trash!hoặc Retina!trong dấu nhắc lệnh MATLAB.

Thí dụ

>> w=1920;h=1080;d=4.95;
>> c={'Trash!','Retina!'};c{(w*w+h*h>9e4*d*d)+1}

ans =

Retina!

bạn không cần int8, true + 1 là gấp đôi (2).
Jonas

@Jonas Tôi đã thử nó. Nó sẽ không thay đổi thành 2 trên MATLAB R2013a ... Lạ.
rayryeng - Phục hồi lại

@Jonas - Tôi đã phải gói gọn logicalbiểu thức trong ngoặc đơn để nó hoạt động. Trình tự hoạt động ... Cảm ơn vì tiền hỗ trợ!
rayryeng - Phục hồi lại

Cách tiếp cận tốt đẹp! (Tôi đã thử với hypotnhưng của bạn w*w+h*h>9e4*d*dngắn hơn). Tuy nhiên, điều này có đáp ứng các yêu cầu câu hỏi? Đây là một chương trình, không phải là một chức năng. Vì vậy, nó nên mất w, hdnhư là đầu vào. Tôi cho rằng điều đó có nghĩa là stdin, như thường lệ trong thử thách mã
Luis Mendo

@LuisMendo ah Tôi sẽ phải thay đổi điều đó! Cảm ơn
rayryeng - Phục hồi Monica

3

XSLT, 400 byte

Đây là sự ra mắt của một ngôn ngữ chưa từng thấy trên PPCG và tôi hy vọng sẽ sử dụng nó nhiều hơn trong tương lai khi tôi biết nhiều hơn về nó.

Mã số:

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="input"><xsl:variable name="n" select="for $i in tokenize(.,'[^\d\.]+')return number($i)" /><xsl:choose><xsl:when test="$n[1]*$n[1]+$n[2]*$n[2]>90000*$n[3]*$n[3]">Retina!</xsl:when><xsl:otherwise>Trash!</xsl:otherwise></xsl:choose></xsl:template></xsl:stylesheet>

Khá in

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="input">
        <xsl:variable name="n" select="for $i in tokenize(.,'[^\d\.]+')return number($i)" />
        <xsl:choose>
            <xsl:when test="$n[1]*$n[1]+$n[2]*$n[2]>90000*$n[3]*$n[3]">
                Retina!
            </xsl:when>
            <xsl:otherwise>
                Trash!
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Ghi chú:

Vì XSLT không có cách lấy đầu vào qua STDIN, chúng tôi phải sử dụng tệp XML, với đầu vào giữa hai <input>thẻ. Tất nhiên, phương pháp này có những hạn chế nhưng nó sẽ hoạt động hoàn hảo cho hầu hết các thử thách.

Ví dụ I / O

Tập tin đầu vào:

<?xml version="1.0" encoding="ISO-8859-1"?>
<input>3000 1500 11.18</input> 

Tập tin đầu ra:

<?xml version="1.0" encoding="UTF-8"?>Retina!

Tập tin đầu vào:

<?xml version="1.0" encoding="ISO-8859-1"?>
<input>1920 1080 10.5</input>

Tập tin đầu ra:

<?xml version="1.0" encoding="UTF-8"?>Trash!

2

C # (81)

string D(int w,int h,double d){return Math.Sqrt(w*w+h*h)/d>300?"Retina":"Trash";}

Ung dung:

string Density(int width, int height, double diagonal)
{
    return Math.Sqrt(width * width + height * height) / diagonal > 300 ? "Retina" : "Trash";
}

Bạn có thể rút ngắn điều này xuống còn 73 với thủ thuật mà một số người khác đã sử dụng để viết lại công thức và xóa thao tác sqrt : string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}. Nhưng bạn cũng cần thêm vào !từng chuỗi để nó trở lại 75 tôi nghĩ.
goric

2

Swift, 77 byte

Giải mã tham số chức năng có nghĩa là điều này chiếm nhiều ký tự hơn mức cần thiết:

func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}


2

Swift, 56 byte

let r={print($0*$0+$1*$1>9e4*$2*$2 ?"Retina!":"Trash!")}

Về cơ bản giống như của GoatInTheMachine nhưng với các tham số đóng ẩn

Khi Code Golfing với Swift, luôn khai báo các phương thức như thế này, nó ngắn hơn nhiều


2

Haskell, 46

f w h d|w^2+h^2>d^2*9e4="Retina!"|0<1="Trash!"

Nên sử dụng hệ thống Haskell nào? Nó không hoạt động với phiên bản ghci tôi đã thử, đưa ra <interactive>:2:8: parse error on input '|'.
Ed Avis

@EdAvis: GHCi không chạy chương trình; để thử nó ở đó, bạn cần let f w h d|….
Ry- 29/07/2015

2

C ++ 72 70 Byte

void F(int w,int h,float d){cout<<w*w+h*h>9e4*d*d?"Retina!":"Trash!";}

Tương tự với các giải pháp khác, tôi đã tìm ra cách để làm nóng với môn đánh gôn.


1
Bạn có thể cạo một cặp vợ chồng bằng cách viết 90000như9e4
Toby Speight

2

Đây là đóng góp của tôi cho vấn đề này

Ruby, 67 byte đọc từ stdin

w,h,d=ARGV.map{|v|Float(v)}
puts w*w+h*h>d*d*9e4?"Retina!":"Trash!"

Ruby, 56 byte trong một hàm

Ngắn hơn một chút

def r(w,h,d)
puts w*w+h*h>d*d*9e4?"Retina!":"Trash!"
end

Cảm ơn những người đóng góp trước đây cho 9e4!


2

Bash, 85 byte

if [ $(echo "sqrt($1^2+$2^2)/$3"|bc) -gt 300 ];then
echo Retina!
else
echo Trash!
fi

1
Điều này không hoạt động cho "3000 1500 11,18". Theo mặc định, bcđộ chính xác của 0 là số thập phân. Bạn sẽ cần phải thiết lập scale, hoặc có thể bạn có thể thoát khỏi bc -lđó mà ngầm định đặt tỷ lệ thành 20
Chấn thương kỹ thuật số

Oh ok, tôi đã cập nhật câu trả lời của tôi. Cảm ơn!
addison

1
Ồ, và kiểm tra codegolf.stackexchange.com/questions/15279/ . Ví dụ((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
Digital Chấn thương

2

PHP, 47,43,40 38 byte

<?=sqrt($w*$w+$h*$h)/$d>300?'Retina':'Trash'?>!
<?=sqrt($w*$w+$h*$h)/$d>300?Retina:Trash?>!
<?=$w*$w+$h*$h>9e4*$d*$d?Retina:Trash?>!

<?=hypot($w,$h)/$d>300?Retina:Trash?>!

Yêu cầu register_globals==true(không bao giờ nên như vậy!), Với các giá trị GET w, h, d
- Đã lưu 4 byte bằng cách xóa dấu ngoặc kép quanh chuỗi. Mã hóa xấu, nhưng nó hoạt động.
- Đã di chuyển dvà căn bậc hai sang phía bên kia của phương trình, lưu sqrt()hàm
- Đã lưu 2 byte bằng cách chuyển sang hypot()(cảm ơn Lucas Costa)


Bạn chỉ nên nói rằng đây là câu trả lời PHP4.1 và bạn không cần register_globalsđặt lệnh.
Ismael Miguel

2
Hoặc là tùy chọn cũng tệ như vậy haha
Martijn

2

C # 6, 67 byte

string D(int w,int h,double d)=>w*w+h*h>9e4*d*d?"Retina!":"Trash!";

Câu trả lời này dựa trên câu trả lời của Wolfshead. Tôi đã làm cho nó ngắn hơn 8 byte bằng tính năng mới của C # 6.


2

JavaScript (ES6) 58 54 43 byte

43 byte

Đã xóa chức năng gán (theo quy tắc PPCG) (-2), cũng như xóa căn bậc hai và so sánh với 900 (300 ^ 2) (-12)

(w,h,d)=>w*w+h*h/d*d>300?"Retina!":"Trash!"

54 byte

Loại bỏ các dấu ngoặc đơn (-4 byte)

a=(w,h,d)=>Math.sqrt(w*w+h*h)/d>300?"Retina!":"Trash!"

58 byte

a=(w,h,d)=>Math.sqrt((w*w)+(h*h))/d>300?"Retina!":"Trash!"

Giải thích tại đây:

a =                           // The function is a
 (w,h,d) =>                   // Accepts the three arguments
   Math.sqrt((w*w)+(h*h))/d   // Calculate pixel density
   > 300                      // Above the threshold
   ? "Retina!"                // If so, return "Retina!"
   : "Trash!"                 // Otherwise return "Trash!"

Điều này sử dụng các toán tử ternary để kiểm tra mật độ và giết chết một vài byte bằng cách sử dụng các hàm mũi tên


1
Bạn có thể làm điều này ngắn hơn bằng cách tránh căn bậc hai và thay vào đó so sánh bình phương của các giá trị.
Reto Koradi

1

Java, 82 74 byte

String g(int w,int h,double d){return 9e4*d*d>w*w+h*h?"Trash!":"Retina!";}

Gọi nó với g(width,height,diagonal)


1
Bạn có thể cắt giảm điều này bằng cách loại bỏ doublemảng tốn kém như: String g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}Đôi khi đơn giản nhất là tốt nhất :)
Geobits

@Geobits Cảm ơn, tôi đã không dành thời gian để ngân sách cho các byte trên hai phương pháp, tôi rất vui vì bạn đã bắt được nó!
DeadChex

1

Clojure, 58 byte

#(if(>(+(* %1%1)(* %2%2))(* %3%3 90000))"Retina!""Trash!")

Sử dụng toán ưa thích của @ Kroltan để rút ngắn điều này. Sử dụng các đối số ngầm được truyền theo thứ tự (w, h, d).

Golf Clojure đầu tiên ... Tôi đã ngạc nhiên về việc tôi được phép bỏ bao nhiêu khoảng trắng

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.