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
เราเปลี่ยนตัวเลขแต่ละตัวให้เป็นสอง1
s ดังนั้น a) ทำให้มั่นใจว่าตัวเลขทั้งหมดนั้นเหมือนกัน (ซึ่งจำเป็นในภายหลัง) และ b) เพิ่มตัวเลขแต่ละตัวเป็นสองเท่า
(?=(1*)\1)[^.]
$1
นี่คือสองสิ่ง: มันกำลังสองจำนวนทั้งหมด (หรือมากกว่าครึ่งหนึ่งของแต่ละจำนวนโดยการคำนวณผลรวม2n
) และเพิ่มผลสี่เหลี่ยมที่ได้จากความกว้างและความสูง ขอให้สังเกตว่า[^.]
ตรงกับ1
s, #
เครื่องหมายและช่องว่าง หาก#
เป็นช่องว่าง lookahead จะไม่บันทึกสิ่งใดเลยซึ่งหมายความว่าสิ่งเหล่านั้นจะถูกลบออกอย่างง่ายๆนั่นคือผลลัพธ์สำหรับความกว้างและความสูงจะถูกตัดแบ่ง / เพิ่ม จุดทศนิยม.
จะยังคงแยกผลลัพธ์สำหรับd
จากนั้น หาก[^.]
การแข่งขัน1
แทนแล้วเพื่อให้แน่ใจว่าเรา lookahead จับครึ่งหนึ่งของ1
s หลังจากที่มัน (ลดลงโค้งมน) 1
ในกลุ่ม นี่คำนวณผลรวมที่ฉันพูดถึงข้างต้นซึ่งจะให้ผลบวกของจำนวนเดิม
^(1+)\.\1{90000}1+
Retina!
ตอนนี้สตริง(เป็น unary) จากนั้นจึง(เป็น unary) เราต้องการที่จะรู้ว่าจำนวนครั้ง unary ครั้งแรกสั้นกว่าวินาทีหรือไม่ เราสามารถทำการคูณได้อย่างง่ายดายโดยใช้กลุ่มการจับภาพและไวยากรณ์การทำซ้ำ เราใช้(แทน) หลังจากนั้นเพื่อให้มั่นใจว่าตัวเลขที่สองเป็นจริงมากขึ้นกว่านั้นและไม่เพียงเท่ากัน ถ้าเป็นเช่นนั้นเราแทนที่ทุกที่โดยd2
.
w2 + h2
90000
{n}
1+
1*
Retina!
1.+
Trash!
1
หากหมายเลขที่สองคือไม่ใหญ่พอที่แล้วขั้นตอนก่อนหน้านี้จะไม่ได้มีการเปลี่ยนแปลงอะไรและสตริงจะยังคงเริ่มต้นด้วย หากเป็นเช่นนั้นเราเพียงแค่แทนที่สตริงทั้งหมดด้วยTrash!
และเสร็จสิ้น