จอประสาทตาหรือถังขยะ?


47

เราอาศัยอยู่ในยุคของเทคโนโลยีที่ยอดเยี่ยมที่เราสามารถมีหน้าจอ 8K ที่มีรายละเอียดที่สวยงามบนทีวีของเราและแม้กระทั่งหน้าจอขนาด 2K บนโทรศัพท์ของเรา เรามาไกลในปีที่ผ่านมาในแง่ของเทคโนโลยีหน้าจอ

หนึ่งในผลิตภัณฑ์ของเรื่องนี้เป็นคำที่นิยมทำโดยแอปเปิ้ลเป็นผล Retina นี่หมายถึงความหนาแน่นของพิกเซลของหน้าจอที่มีปัญหาซึ่งสูงมากเมื่อมองจากระยะไกลประมาณ 10-12 นิ้วพิกเซลแต่ละพิกเซลจะไม่สามารถหยิบออกมาได้ง่าย

Steve Jobs กล่าวว่าความหนาแน่นของพิกเซลที่เกิดขึ้นนั้นอยู่ที่ประมาณ300 พิกเซลต่อนิ้วและพวกเขาเริ่มใช้ความหนาแน่นของพิกเซลในช่วงนี้บนอุปกรณ์ของพวกเขาด้วยbuzzword Retina ที่ใช้สำหรับการโฆษณา

ความหนาแน่นของพิกเซลสามารถคำนวณได้จากสูตรต่อไปนี้:

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

ในกรณีที่dเป็นเส้นทแยงมุมของหน้าจอในนิ้ว, wคือจำนวนพิกเซลบนแกนนอนและhเป็นจำนวนพิกเซลบนแกนตั้ง

งานของคุณ

สำหรับภารกิจนี้คุณจะใช้มาตรฐานRetinaเพื่อตัดสินใจเลือกผลิตภัณฑ์ที่ควรซื้อ เป็นผู้บริโภคสมัยใหม่ที่คุณเป็นเมื่อคุณซื้ออุปกรณ์ที่คุณต้องการให้แน่ใจว่าคุณได้รับผลิตภัณฑ์ที่ดีไม่ใช่อุปกรณ์จากยุค 90! ดังนั้นคุณต้องการที่จะสร้างโปรแกรมหรือฟังก์ชั่นที่ต้องใช้ความกว้างหน้าจอสูงและความยาวเส้นทแยงมุมเป็นอินพุทหรือฟังก์ชั่นพารามิเตอร์และบอกให้ทราบว่ามีคุณสมบัติหน้าจอโดยเฉพาะอย่างยิ่งเป็นหน้าจอเรตินา ( D > 300) โดยการพิมพ์หน้าจอหรือกลับ

เนื่องจากการดูถูกเหยียดหยามสำหรับอุปกรณ์ที่ไม่ใช่ Retina โปรแกรมหรือฟังก์ชั่นของคุณจะแสดงผลRetina!เมื่ออุปกรณ์มีคุณสมบัติและTrash!เมื่อไม่มี

คุณอาจคิดว่าตัวเลขทั้งหมดจะมากกว่า 0 ค่าพิกเซลสำหรับความกว้างและความสูงจะเป็นจำนวนเต็มเสมอ ขนาดหน้าจออาจถูกตีความในทางใดทางหนึ่งตราบเท่าที่มันรองรับทศนิยม อินพุตอาจอยู่ในลำดับใดก็ได้ที่คุณเลือกและอาจอยู่บนบรรทัดแยกกันสูงสุด 3 บรรทัด

ตัวอย่าง 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!

นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ


ต่อไปนี้เป็นโซลูชัน Stuck ภาษาการเขียนโปรแกรมแบบกองซ้อนที่ฉันทำ:

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

34
ใครบางคนโปรดทำคำตอบที่จอประสาทตา
Digital Trauma

2
@ DigitalTrauma แต่ลอย
Sp3000

7
@ Sp3000 pfft แก้ตัว! สร้าง regex การแจงของคุณเองในเรตินา
เครื่องมือเพิ่มประสิทธิภาพ

46
@ Sp3000 โอเคช่วยเพิ่มเงินเดิมพัน ฉันสัญญาว่าจะตบรางวัลใหญ่ 500 pt ที่ถูกกฎหมาย (ฉันทามติของชุมชน) Retina ตอบคำถามนี้หนึ่งสัปดาห์จากการโพสต์ความคิดเห็นนี้
Digital Trauma

2
อืมเกณฑ์ที่เลือกนั้นไม่ค่อยตรงกับการตลาดของ Apple เช่นสำหรับ Retina iMac: 5120 2880 27
Ed Avis

คำตอบ:


5

Pyth - 27 ไบต์

ใช้ผู้ประกอบการที่ประกอบabsไปด้วยและในการคำนวณพีทาโกรัส

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

จะเข้าในสองบรรทัดบรรทัดแรกwidth, height, diagบรรทัดที่สอง

กฎผ่อนคลายมาก ๆ

ลองมันออนไลน์ได้ที่นี่


115

Retina , 530 220 210 202 201 193 191 187 185 (184) ไบต์

เครดิตให้กับ randomra สำหรับการบันทึก 3 ไบต์! (และปูทางไปอีกสองสามคน)

+`\.(\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!

เพื่อการนับจำนวนไบต์แต่ละบรรทัดจะแยกเป็นไฟล์ แต่คุณสามารถเรียกใช้โค้ดข้างต้นได้จากไฟล์เดียวโดยเรียกใช้ Retina ด้วยการ-sตั้งค่าสถานะ

นี้คาดว่าจะมีความหนาแน่นเป็นครั้งแรก (ซึ่งจะต้องมีจุดทศนิยมแม้ว่ามันเป็นหนึ่งในท้าย) d w hตามด้วยความกว้างและความสูงคือ

นี้เป็นบิตช้า ฉันจะไม่ลองใช้กรณีทดสอบส่วนใหญ่เพราะมันจะใช้งานได้นาน อย่างไรก็ตามคุณสามารถตรวจสอบว่ามันทำงานอย่างถูกต้องกับกรณีทดสอบ

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

โดยพื้นฐานแล้วหลังจากคูณตัวเลขทั้งหมดเพื่อให้ความหนาแน่นเป็นจำนวนเต็มคุณไม่ต้องการให้ความกว้างและความสูงมีตัวเลขมากกว่า 4 หลัก

ในขณะนี้ช้ามันเป็นที่แน่นอนอย่างสมบูรณ์ ... ไม่มีประเด็นจุดลอยตัวหรืออะไรอย่างนั้น เลขคณิตทั้งหมดใช้จำนวนเต็ม (unary)

โดยหลักการแล้วฉันสามารถโกนได้อีกหนึ่งไบต์: ^สามารถละเว้นได้ แต่มันจะทำให้Trash!กรณีทดสอบช้าลงอย่างน่ากลัวเนื่องจากมีการย้อนรอยในปริมาณที่มากเกินไป

คำอธิบาย

ก่อนอื่นเรามาจัดความไม่เท่าเทียมกันใหม่เพื่อหลีกเลี่ยงการทำงานของ floating point:

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

นอกจากนี้เรายังสามารถสังเกตเห็นว่านี่เป็นคงที่อยู่ใต้คูณw, hและdจากจำนวนเดียวกัน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

มีหลายวิธีในการจัดทำเลขจำนวนเต็ม แต่เราจะใช้ข้อมูลประจำตัว

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

สิ่งนี้ทำให้เรามีวิธีในการแก้ปัญหาโดยใช้เลขคณิตเลขจำนวนเต็มเท่านั้น

มาดูรหัสกันดีกว่า แต่ละคู่ของเส้นคือการทดแทน regex

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

สิ่งนี้จะย้ายจุดทศนิยมในความหนาแน่นไปทางขวาซ้ำ ๆ ในขณะที่คูณความกว้างและความสูงเป็น 10 ( xด้านบน) นี่คือเพื่อให้แน่ใจว่าตัวเลขทั้งหมดเป็นจำนวนเต็ม แทนที่จะต่อท้ายเลขศูนย์ฉันกำลังต่อท้าย_ซึ่งฉันจะให้เลขศูนย์ต่อไป (นี่คือเคล็ดลับการเล่นกอล์ฟเพราะมิฉะนั้นฉันต้องเขียน...${3}0เพื่อหลีกเลี่ยงความกำกวมด้วย$30) +ด้านหน้าของ regex บอกให้ Retina ทำซ้ำการแทนที่นี้จนกว่าผลลัพธ์จะหยุดการเปลี่ยนแปลง (ซึ่งเป็นกรณีที่รูปแบบไม่ตรงกันอีกต่อไป) .

\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#

นี่คือการแปลงเอกโดยใช้เคล็ดลับที่ได้รับการพัฒนาโดย dan1111 โดยพื้นฐานแล้วฉันกำลังแปลตัวเลขแต่ละตัวให้เป็นตัวแทนหลักของตัวเองในขณะที่คูณตัวเลขที่มีอยู่ด้วย 10 (เลื่อน#เครื่องหมายไปทางขวาในกระบวนการ) การเป็นตัวแทนไบนารีนี้จะค่อนข้างสับสนของตัวเลขที่แตกต่างกัน แต่จำนวนรวมจะเท่ากับมูลค่าของจำนวนเต็มดั้งเดิม สังเกต\wที่สิ้นสุด - ปกติแล้วนี่เป็นเพียงแค่0แต่เราต้องการที่จะปฏิบัติต่อ_ศูนย์เช่นกัน (ซึ่งถือเป็นตัวอักษรคำใน regex)

\d
11

เราเปลี่ยนตัวเลขแต่ละตัวให้เป็นสอง1s ดังนั้น a) ทำให้มั่นใจว่าตัวเลขทั้งหมดนั้นเหมือนกัน (ซึ่งจำเป็นในภายหลัง) และ b) เพิ่มตัวเลขแต่ละตัวเป็นสองเท่า

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

นี่คือสองสิ่ง: มันกำลังสองจำนวนทั้งหมด (หรือมากกว่าครึ่งหนึ่งของแต่ละจำนวนโดยการคำนวณผลรวม2n) และเพิ่มผลสี่เหลี่ยมที่ได้จากความกว้างและความสูง ขอให้สังเกตว่า[^.]ตรงกับ1s, #เครื่องหมายและช่องว่าง หาก#เป็นช่องว่าง lookahead จะไม่บันทึกสิ่งใดเลยซึ่งหมายความว่าสิ่งเหล่านั้นจะถูกลบออกอย่างง่ายๆนั่นคือผลลัพธ์สำหรับความกว้างและความสูงจะถูกตัดแบ่ง / เพิ่ม จุดทศนิยม.จะยังคงแยกผลลัพธ์สำหรับdจากนั้น หาก[^.]การแข่งขัน1แทนแล้วเพื่อให้แน่ใจว่าเรา lookahead จับครึ่งหนึ่งของ1s หลังจากที่มัน (ลดลงโค้งมน) 1ในกลุ่ม นี่คำนวณผลรวมที่ฉันพูดถึงข้างต้นซึ่งจะให้ผลบวกของจำนวนเดิม

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

ตอนนี้สตริง(เป็น unary) จากนั้นจึง(เป็น unary) เราต้องการที่จะรู้ว่าจำนวนครั้ง unary ครั้งแรกสั้นกว่าวินาทีหรือไม่ เราสามารถทำการคูณได้อย่างง่ายดายโดยใช้กลุ่มการจับภาพและไวยากรณ์การทำซ้ำ เราใช้(แทน) หลังจากนั้นเพื่อให้มั่นใจว่าตัวเลขที่สองเป็นจริงมากขึ้นกว่านั้นและไม่เพียงเท่ากัน ถ้าเป็นเช่นนั้นเราแทนที่ทุกที่โดยd2.w2 + h290000{n}1+1*Retina!

1.+
Trash!

1หากหมายเลขที่สองคือไม่ใหญ่พอที่แล้วขั้นตอนก่อนหน้านี้จะไม่ได้มีการเปลี่ยนแปลงอะไรและสตริงจะยังคงเริ่มต้นด้วย หากเป็นเช่นนั้นเราเพียงแค่แทนที่สตริงทั้งหมดด้วยTrash!และเสร็จสิ้น


24
มันเกิดขึ้น ตอนนี้เราทุกคนสามารถตายมีความสุข
Alex A.

94
ในฐานะที่เป็นโน้ตด้านข้างเนื่องจากนี่คือเรตินาทำให้คำตอบอื่น ๆ ทั้งหมดทิ้งไปไหม
Alex A.

5
พระเจ้าของเรามาถึงแล้ว!
Kade

7
ตกลงดังนั้นสัญญาที่โปรดปรานของฉันยังคงมีอยู่ แต่ฉันอยากจะเห็นคำอธิบายอย่างละเอียด (โดยความคิดฉันคิดว่าฉันรู้ว่ามันทำได้อย่างไร แต่อยากจะดูรายละเอียด) นอกจากนี้ฉันจะมอบรางวัลให้กับคำตอบทางจอประสาทตาที่สั้นที่สุดตามกฎหมายดังนั้นผู้คนจำนวนมากยังเปิดรับคำตอบจาก Retina สั้นกว่า!
Digital Trauma

2
@AlexA ไม่เพราะมีคำตอบที่จอประสาทตาอีก
Ismael Miguel

38

Python 49

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

ใช้การสอดแทรกสตริง

มันกลับกลายเป็นจัตุรัสทั้งสองด้านสั้นกว่าการใช้บรรทัดฐานที่ซับซ้อน

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

18
เราควรจะพิมพ์อย่างใดอย่างหนึ่งRetina!หรือTrash!! ไม่รีทวีต @ertaisnha !!
เครื่องมือเพิ่มประสิทธิภาพ

20
ที่เกี่ยวข้อง
Kaz Wolfe

2
@Mew แต่นั่นคือสิ่งตรงกันข้าม;)
เครื่องมือเพิ่มประสิทธิภาพ

ดีฉันยังไม่เห็นว่า (ab) ใช้ในการพิมพ์หนึ่งหรือสตริงอื่น
นิค T

15

เรติน่า 312 ไบต์

(\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!

การดำเนินการนี้ใช้เวลาสักครู่ แต่ดูเหมือนว่าจะใช้งานได้

อาจจะเป็นสนามกอล์ฟมากขึ้น ...

คำอธิบาย:

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

เพิ่มแท็กเพื่อให้สตริงแยกวิเคราะห์ได้สะดวกยิ่งขึ้นและเพิ่มขยะเพื่อทำให้ง่ายต่อการแปลงเป็นฐาน 1 และเพิ่ม 300 เพื่อคูณในภายหลัง

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

ผนวก0s เข้ากับความกว้างและความสูงในขณะที่ผนวกส่วนทศนิยมของเส้นทแยงมุมต่อท้ายส่วนจำนวนเต็ม เมื่อทำสิ่งนี้เสร็จแล้วเส้นทแยงมุมจะเป็นจำนวนเต็มและความกว้างและความสูงจะถูกคูณด้วยอย่างไรก็ตาม10จำเป็นต้องใช้หลายตัว

+`(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

แปลงตัวเลขทั้งหมดเป็นฐาน 1 โดยใช้ตารางการค้นหาที่ฉันต่อท้ายในขั้นตอนแรก

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

เตรียมที่จะยกกำลังสองของตัวเลขทั้งหมด

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

สแควร์แต่ละหมายเลข

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

ทวีคูณกำลังสองของเส้นทแยงมุมด้วยกำลังสองของ 300 ที่เราใส่ในขั้นตอนแรก

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

หากความกว้างต่อท้ายความสูงนั้นพอดีกับผลิตภัณฑ์ที่เราเพิ่งคำนวณความหนาแน่นของพิกเซลต่ำเกินไปและมันก็เป็นถังขยะ!

.*0
Retina!

มิฉะนั้นจะเป็น Retina!



9

APL, 40 36 ไบต์

บันทึก 4 ไบต์ขอบคุณเดนนิส!

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

สิ่งนี้จะสร้างฟังก์ชัน dyadic ที่ไม่มีชื่อซึ่งใช้อาร์กิวเมนต์สองตัวแรกทางด้านซ้ายและด้านที่สามทางด้านขวา มันตรวจสอบว่าผลรวมของกำลังสองของค่าด้านซ้ายมากกว่า 300 ^ 2 คูณสี่เหลี่ยมจัตุรัสของค่าที่ถูกต้อง มีการพิมพ์ออกตามความเหมาะสม

คุณสามารถลองออนไลน์ได้ !


ควรมีการรีเฟรชก่อนโพสต์ ... คุณสามารถบันทึกได้สองสามไบต์โดยรับอาร์กิวเมนต์สองตัวแรกทางซ้าย
Dennis

@Dennis ขอขอบคุณสำหรับความช่วยเหลือของคุณ! ฉันถือว่าการลบคำตอบของฉันเมื่อฉันเห็นคุณเพราะคุณดีกว่า : P
Alex A.

9

TI-BASIC, 43

ใช้ความกว้างและความสูงผ่านหน้าจอโฮมเป็นรายการสององค์ประกอบและทแยงมุมผ่านอินพุต

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

ตัวอักษรตัวพิมพ์เล็กสองไบต์ของ TI-BASIC เพิ่ม 7 ไบต์ ( iซึ่งเป็นหน่วยจินตภาพเป็นหนึ่งไบต์) ทำให้ไม่สามารถแข่งขันได้ โชคดีที่!มันเป็นหนึ่งไบต์เพราะมันหมายถึงฟังก์ชันแฟคทอเรียล


9

JavaScript ES6, 49 ไบต์

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

ฉันเกลียด JavaScript ที่มีตัวดำเนินการทางคณิตศาสตร์ที่ยาวมาก ๆ แต่ถึงแม้ว่าจะมีสิ่งMath.pythagoreanนี้ก็จะสั้นลง


มีคนอธิบายการออกเสียงลงคะแนนบ้างไหม?
Downgoat

อาจเป็นเพราะนานเกินไป
lirtosiast

1
@ThomasKwa Python สั้นลงเพียง 1 ไบต์
เครื่องมือเพิ่มประสิทธิภาพ

5
แทนที่จะคำนวณสแควร์รูทมันอาจสั้นลงถ้าคุณเปรียบเทียบกำลังสองของค่า
Reto Koradi

4
@RetoKoradi ใช่มันสั้นกว่า:(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
pepkin88

8

Excel, 44 ไบต์

พิมพ์อินพุตของคุณในเซลล์เหล่านี้

  • A1 = ความกว้างเป็นพิกเซล
  • B1 = ความสูงเป็นพิกเซล
  • C1 = เส้นทแยงมุมเป็นนิ้ว

และสูตรนี้ให้ผลลัพธ์ของคุณ:

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

4
ฉันพยายามตี 2 ไบต์โดยพิมพ์9E4*C1^2แทน(300*C1)^2... นี่ให้ความยาว 42 อย่างไรก็ตามการพิมพ์9E4สูตรใน Excel จะเปลี่ยน90000เป็นทันทีที่คุณกด :(
Ross Presser

7

Prolog, 51 ไบต์

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

วิ่งa(8192,4320,100.0,R).ออก:R = "Trash!" .

แก้ไข: ขอบคุณ @PaulButcher สำหรับการแก้ไขขอบเคสและการเล่นกอล์ฟหนึ่งไบต์


ส่งคืน "Retina!" เมื่อความหนาแน่นเท่ากับ 300 (เช่น180 240 1 -> Trash!) จากตัวอย่าง โชคดีเนื่องจากคุณสามารถกำจัดตัวละครสองตัวด้วยสัญกรณ์ e, เปลี่ยน>เป็น>=ทิ้งไว้ที่ 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
Paul Butcher

@PaulButcher ใช้ 9e4 แทน 90000 จริง ๆ แล้วโกนอักขระ 2 ตัวไม่ใช่หนึ่งตัว ดังนั้นคุณสั้นคำตอบของฉันอย่างมีประสิทธิภาพโดยหนึ่งไบต์เช่นเดียวกับการแก้ไขกรณีขอบนี้ขอบคุณ
เสียชีวิต

1
ทำได้ดี! มันเป็นการดีที่จะเห็นตัวอย่างของอารัมภบทสั้น ๆ ที่สมเหตุสมผล
Paul Butcher

@ PaulButcher โกนอีกหนึ่งไบต์โดยใช้<แทน>=และแลกเปลี่ยนผลลัพธ์ของสตริงสองรายการ ...
Fatalize

5

JavaScript (ES6), 45 ไบต์

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

CoffeeScript, 47 ไบต์

ไม่มีผู้ประกอบการที่สาม แต่มีการยกกำลัง (ซึ่งไม่ได้ช่วยในความพยายามครั้งล่าสุด)

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
สำหรับข้อมูลจำเพาะไม่จำเป็นต้องมีชื่อฟังก์ชั่น ( f=) คุณสามารถตัด 2 ไบต์ในทุกรุ่น
Kroltan


5

Pure Bash (ไม่มีคำสั่ง bc / ภายนอกอื่น ๆ ), 138 136 135 82 83 ไบต์

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

ฉันตัดสินใจลองทำด้วยวิธีทุบตีบริสุทธิ์ ฉันอาจทำสิ่งที่ไร้ประสิทธิภาพเล็กน้อยอย่างชัดเจนเนื่องจากนี่เป็นครั้งแรกที่ฉันตีกอล์ฟ แต่ฉันคุ้นเคยกับการทุบตีและสนุกในอดีตที่พยายามเขียนสิ่งที่ไม่ได้ใช้คำสั่งภายนอก (เช่นการทุบตีบริสุทธิ์)

คำสั่ง printf นั้นน่ารำคาญที่สุด ใครมีแนวคิดที่ดีกว่าสำหรับการเติมตัวเลขด้วยเลขศูนย์?

แก้ไข: บันทึกสองไบต์ปรากฎว่า printf จะใช้อาร์กิวเมนต์ที่ว่างเปล่าเป็นศูนย์ บันทึกไบต์อื่นแล้วกลับกลายเป็นว่าฉันผิดไปก่อนหน้านี้และเพิ่งกำหนดเอาต์พุตของ printf ให้กับตัวแปรนั้นเล็กกว่าการใช้ -v

EDIT2: ขอบคุณ Digital Trauma ในความคิดเห็นตอนนี้ลดลงอย่างมีนัยสำคัญมากขึ้น เคล็ดลับ: ใช้การสนับสนุน regex ของ bash เพื่อแทนที่สตริงของตัวเลขด้วยเลขศูนย์แทนที่จะนับจากนั้นพิมพ์จำนวนศูนย์ (ดูเหมือนชัดเจนเมื่อฉันใส่แบบนั้น ... ) เก็บสตริงในอาร์เรย์ทุบตีเพื่อบันทึกเสียงก้อง และคำนึงถึงการเปลี่ยนแปลงเล็กน้อยในกฎซึ่งหมายความว่าคุณสามารถวางหมายเลขอินพุตทั้งหมดเป็น. 0

EDIT3: เพิ่มไบต์เพื่อแก้ไขข้อผิดพลาดที่แนะนำโดยการดัดแปลงที่แนะนำของ Digital Trauma


อย่างนี้สำหรับคะแนน 102: a=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}! (คุณสามารถแทนที่;ด้วย newlines - ฉันแค่พยายามที่จะได้รับมันในความคิดเห็น)
บาดเจ็บทางดิจิตอล

และถ้าคุณถือว่าความหนาแน่นของตัวเลขทั้งหมดจะสิ้นสุด.0(ตกลงฉันคิดว่า) จากนั้นคุณสามารถทำคะแนน 82:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
Digital Trauma

ตัวอย่างดั้งเดิมมีบางอย่างที่ไม่ได้ลงท้ายด้วย. 0 แต่ฉันสังเกตเห็นว่าตอนนี้คำถามได้รับการแก้ไขดังนั้นมันจะประหยัดได้ไม่มาก ขอบคุณสำหรับความคิด! ฉันชอบความคิดของคุณโดยเฉพาะในการลดคำสั่ง echo ทั้งสอง ฉันพยายามหาวิธีที่จะทำเช่นนั้นด้วยเหตุผลบางอย่างที่ฉันไม่ได้ใช้อาร์เรย์! ด้วยเหตุผลบางอย่างมันไม่เคยเกิดขึ้นกับฉันที่คุณสามารถใช้ ** ... ฉันจะลองและตรวจสอบคำตอบของคุณฉันสับสนเล็กน้อยเกี่ยวกับวิธีการใช้งาน $ d ที่นี่ แต่ฉันจะคิดออก
Muzer

$dไม่ยุ่งยากเกินไป aมีตัวเลขของความหนาแน่นหลังจุดทศนิยม d=${a/./0}เพียงแค่แทนที่ตัวเลขเหล่านั้นทั้งหมดด้วยศูนย์ ดังนั้นเราสามารถ concat ศูนย์เหล่านั้นไปยังจุดสิ้นสุดของwและคูณด้วยพลังเดียวกันของสิบที่จะทำได้โดยการเอาจุดทศนิยมจากh d
Digital Trauma

1
ไชโยฉันคิดว่าฉันจะโมโหสักนาที!
Muzer

4

dc, 41 ไบต์

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

ต้องใช้ args เพื่อป้อนข้อมูลd, w, hตามลำดับ - ฉันหวังว่านี่จะใช้ได้

ผลการทดสอบ:

$ 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 ไบต์

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

สิ่งนี้จะสร้างฟังก์ชั่นที่ยอมรับค่าตัวเลขสามค่าและส่งคืนสตริง

มันเป็นการใช้งานสูตรโดยตรงเพียงแค่จัดเรียงใหม่ ความเหลื่อมล้ำทั้งสองข้างนั้นคูณด้วยdกำลังสองแล้ว


3

R, 59 55 ไบต์

เป็นฟังก์ชั่นที่ไม่มีชื่อตอนนี้

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

ใช้งานง่ายมากซึ่งไม่จำเป็นต้องอ้างอิงดัชนี

ก่อน

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

ค่อนข้างง่ายรับอินพุตจากการสแกนเป็นเวกเตอร์ (เส้นเดี่ยวเว้นวรรคหรือหลายบรรทัด) สี่เหลี่ยมเวกเตอร์ ทำการคำนวณและ cat ผลลัพธ์


3

MATLAB - 49 45 ไบต์

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

ฉันต้องประกาศอาร์เรย์ของเซลล์ที่มีTrash!และRetina!ที่เก็บไว้ในสถานที่ 1 และ 2 ในอาร์เรย์เซลล์ ต่อไปฉันใช้การสังเกตที่หลายคนสังเกตเพื่อจัดเรียงสมการใหม่เพื่อให้คุณตรวจสอบสภาพโดยใช้เลขคณิตจำนวนเต็มเท่านั้น ฉันแทน 90000 เป็น9e4บันทึกไบต์ หากเงื่อนไขนี้เป็นจริงเราจะออก 1, มิฉะนั้นเราจะเอาท์พุท 0 ฉันใช้ผลลัพธ์นี้เพื่อจัดทำดัชนีลงในอาร์เรย์เซลล์โดยตรง เนื่องจาก MATLAB เริ่มสร้างดัชนีที่ 1 ฉันจึงต้องเพิ่ม 1 เพื่อทำดัชนีให้สมบูรณ์ สิ่งที่ดีคือการเพิ่มtrueด้วย 1 ให้ 2 ในขณะที่เพิ่มfalseด้วย 1 ให้ 1 นี้จะส่งออกอย่างใดอย่างหนึ่งTrash!หรือRetina!ในพรอมต์คำสั่ง MATLAB

ตัวอย่าง

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

ans =

Retina!

คุณไม่ต้องการint8+ 1 จริงเป็นสองเท่า (2)
Jonas

@ โจนัสฉันลองทำดู มันจะไม่เปลี่ยนเป็น 2 ใน MATLAB R2013a ... แปลก
rayryeng - Reinstate Monica

@ Jonas - ฉันต้องสรุปการlogicalแสดงออกในวงเล็บเพื่อให้ทำงานได้ ลำดับการปฏิบัติงาน ... ขอบคุณสำหรับทิป!
rayryeng - Reinstate Monica

วิธีการที่ดี! (ฉันลองด้วยhypotแต่คุณw*w+h*h>9e4*d*dจะสั้นกว่า) อย่างไรก็ตามสิ่งนี้ตรงตามข้อกำหนดของคำถามหรือไม่ มันเป็นโปรแกรมไม่ใช่ฟังก์ชั่น ดังนั้นจึงควรใช้w, hและdเป็นปัจจัยการผลิต ฉันถือว่านั่นหมายความว่า stdin ตามปกติในการท้าทายรหัส
Luis Mendo

@ LuisMendo อ่าฉันจะต้องเปลี่ยนมัน! ขอบคุณ
rayryeng - Reinstate Monica

3

XSLT, 400 ไบต์

นี่คือการเปิดตัวของภาษาที่ไม่เคยเห็นมาก่อนใน PPCG และฉันหวังว่าจะใช้มันได้มากขึ้นในอนาคตเมื่อฉันได้รับรู้มากขึ้น

รหัส:

<?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>

พริตตี้พริตตี้

<?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>

หมายเหตุ:

เนื่องจาก XSLT ไม่มีวิธีรับอินพุตผ่าน STDIN เราจึงต้องใช้ไฟล์ XML ด้วยอินพุตระหว่างสอง<input>แท็ก แน่นอนว่าวิธีนี้มีข้อ จำกัด แต่มันก็จะทำงานได้อย่างสมบูรณ์แบบสำหรับความท้าทายส่วนใหญ่

ตัวอย่าง I / O

ไฟล์อินพุต:

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

ไฟล์ที่ส่งออก:

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

ไฟล์อินพุต:

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

ไฟล์ที่ส่งออก:

<?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";}

Ungolfed:

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

คุณสามารถลดระยะนี้ถึง 73 ห้องพร้อมด้วยเคล็ดลับอื่น ๆ อีกหลายได้ใช้อีกครั้งเขียนสูตรและลบการดำเนินงาน sqrt string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}นี้: แต่คุณต้องเพิ่มใน!แต่ละสตริงเพื่อที่จะกลับไปที่ 75 ฉันคิดว่า
goric

2

สวิฟท์, 77 ไบต์

การลดลงของพารามิเตอร์ฟังก์ชันหมายความว่าต้องใช้อักขระมากกว่าที่ควร:

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


2

Swift, 56 ไบต์

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

โดยพื้นฐานแล้วเหมือนกับGoatInTheMachineแต่มีพารามิเตอร์การปิดโดยปริยาย

เมื่อ Code Golfing with Swift ประกาศวิธีการเช่นนี้เสมอมันสั้นกว่ามาก


2

Haskell, 46

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

ระบบ Haskell ควรใช้ระบบอะไร? มันไม่ได้ทำงานกับรุ่นของ ghci <interactive>:2:8: parse error on input '|'ฉันพยายามให้
Ed Avis

@EdAvis: GHCi ไม่ได้เรียกใช้โปรแกรม let f w h d|…จะลองมีคุณจำเป็นต้อง
Ry-

2

C ++ 72 70 ไบต์

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

คล้ายกับวิธีแก้ปัญหาอื่น ๆ คิดออกเองเพื่ออุ่นเครื่องด้วยรหัสกอล์ฟ


1
คุณสามารถโกนหนวดโดยเขียน90000เป็น9e4
Toby Speight

2

นี่คือผลงานของฉันสำหรับปัญหานี้

Ruby, 67 ไบต์อ่านจาก stdin

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

Ruby, 56 ไบต์ในฟังก์ชัน

สั้นกว่าเล็กน้อย

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

ขอบคุณผู้มีส่วนร่วมก่อนหน้านี้สำหรับ 9e4!


2

Bash, 85 ไบต์

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

1
สิ่งนี้ใช้ไม่ได้กับ "3000 1500 11.18" โดยค่าเริ่มต้นbcความแม่นยำของ 0 ทศนิยม คุณจะต้องตั้งค่าscaleหรือคุณอาจหนีไปbc -lโดยปริยายซึ่งตั้งค่าสเกลเป็น 20
Digital Trauma

โอ้ตกลงฉันอัพเดตคำตอบแล้ว ขอบคุณ!
addison

1
โอ้และตรวจสอบcodegolf.stackexchange.com/questions/15279/... ตัวอย่างเช่น((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
บาดเจ็บทางดิจิตอล

2

PHP, 47,43,40 38 ไบต์

<?=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?>!

ต้องการregister_globals==true(ซึ่งไม่ควรจะเป็น!) ด้วยค่า GET w, h, d
- บันทึก 4 ไบต์โดยลบเครื่องหมายคำพูดรอบสตริง การเข้ารหัสไม่ดี แต่ใช้งานได้
- ย้ายdและสแควร์รูทไปยังอีกฝั่งของสมการบันทึกsqrt()ฟังก์ชัน
- บันทึก 2 ไบต์โดยสลับไปที่hypot()(ขอบคุณLucas Costa)


คุณควรบอกว่านี่เป็นคำตอบ PHP4.1 และคุณไม่ต้องการregister_globalsคำสั่งที่จะตั้งค่า
Ismael Miguel

2
ตัวเลือกอย่างใดอย่างหนึ่งก็ไม่ดีเหมือนกันฮ่า ๆ
Martijn

2

C # 6, 67 ไบต์

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

คำตอบนี้ขึ้นอยู่กับคำตอบของ Wolfsheads ฉันทำให้มันสั้นลง 8 ไบต์โดยใช้คุณสมบัติใหม่ของ C # 6


2

JavaScript (ES6) 58 54 43 ไบต์

43 ไบต์

ลบการกำหนดฟังก์ชั่น (ตามกฎ PPCG) (-2) รวมถึงลบสแควร์รูทและเปรียบเทียบกับ 900 (300 ^ 2) (-12)

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

54 ไบต์

กำจัดวงเล็บที่ไม่ได้ใช้งาน (-4 ไบต์)

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

58 ไบต์

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

คำอธิบายที่นี่:

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!"

สิ่งนี้ใช้ตัวดำเนินการที่ประกอบไปด้วยเพื่อทดสอบความหนาแน่นและฆ่าสองสามไบต์โดยใช้ฟังก์ชันลูกศร


1
คุณสามารถทำให้สิ่งนี้สั้นลงได้โดยหลีกเลี่ยงสแควร์รูทและการเปรียบเทียบกำลังสองของค่าแทน
Reto Koradi

1

Java, 82 74 ไบต์

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

โทรมาด้วย g(width,height,diagonal)


1
คุณสามารถตัดลงนี้โดยการกำจัดของเสียค่าใช้จ่ายdoubleอาร์เรย์ที่ชอบ: String g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}บางครั้งที่ง่ายที่สุดคือดีที่สุด :)
Geobits

@Geobits ขอบคุณฉันไม่ได้ใช้เวลาในการจัดสรรจำนวนไบต์ทั้งสองวิธีฉันดีใจที่คุณได้รับมัน!
DeadChex

1

Clojure, 58 ไบต์

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

ใช้คณิตศาสตร์แฟนซีของ @ Kroltan เพื่อย่อให้สั้นลง ใช้อาร์กิวเมนต์โดยปริยายที่ส่งผ่านตามลำดับ (w, h, d)

สนามกอล์ฟ Clojure แรก ... ฉันรู้สึกประหลาดใจที่ได้รับอนุญาตให้ออกไปจากพื้นที่ว่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.