R, 83 76 67 ไบต์
เพิ่งรู้ว่าฉันสามารถบันทึกหลายไบต์โดยไม่รบกวนเพื่อตรวจสอบว่าโถฉี่ผู้สมัครว่างเปล่า โถฉี่ที่ไม่ว่างเปล่าจะคืนInfค่าความรู้สึกไม่สบายให้กับพวกเขาดังนั้นพวกเขาจึงถูกยกเว้นในการคำนวณ นอกจากนี้เพียงแค่ใช้การจัดทำดัชนีโดยตรงแทนreplaceดังนั้นจึงสั้นกว่า แต่สง่างามน้อยลง
x=scan()
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
x
คำอธิบาย
x=scan()
เราอ่านสถานะปัจจุบันจาก stdin xและเรียกมันว่า เราสมมติว่าอินพุตเป็นลำดับของ1s และ0s คั่นด้วยช่องว่างหรือบรรทัดใหม่ 1 0 0 0 0 0 1สำหรับวัตถุประสงค์ของคำอธิบายที่สมมติว่าเราป้อนข้อมูล
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
เราแทนที่ค่าของxดัชนีหนึ่ง ๆ ด้วย 1 ทุกสิ่งระหว่างนั้น[ ]คือการหาว่าดัชนีที่ดีที่สุดคืออะไร
เนื่องจากโถฉี่ที่มีอยู่นั้นไม่เปลี่ยนรูปเราจึงไม่จำเป็นต้องพิจารณาระยะห่างระหว่างพวกมัน เราต้องพิจารณาระยะห่างระหว่างโถฉี่ที่ถูกยึดครองกับระยะทางใหม่ที่เป็นไปได้ ดังนั้นเราจึงกำหนดดัชนีของโถฉี่ที่ถูกครอบครอง เราใช้ฟังก์ชั่นที่จะกลับดัชนีของเวกเตอร์ตรรกะซึ่งเป็นwhich TRUEตัวเลขทั้งหมดใน R เมื่อถูกบังคับให้พิมพ์logicalจะเป็นจำนวนที่TRUEไม่ใช่ศูนย์และFALSEถ้าเป็นศูนย์ การทำเช่นwhich(x)นั้นจะส่งผลให้เกิดข้อผิดพลาดประเภทargument to 'which' is not logicalเช่นเดียวxกับเวกเตอร์ที่เป็นตัวเลข เราจึงต้องบีบบังคับให้เป็นตรรกะ !คือฟังก์ชันการปฏิเสธแบบลอจิคัลของ R ซึ่งจะรวมเข้ากับลอจิคัลโดยอัตโนมัติ นำไปใช้สองครั้ง, !!xให้ผลเป็นเวกเตอร์ของTRUEและFALSEระบุว่าโถฉี่ใดถูกครอบครอง (ทางเลือก coercions ไบต์เทียบเท่ากับตรรกะเกี่ยวข้องกับการดำเนินการทางตรรกะ&และ|และ builtins TและFเช่นF|xหรือT&xและอื่น ๆ . !!xลักษณะอุทานขึ้นดังนั้นเราจะใช้ที่.)
which(!!x)
นี่คือการจับคู่กับseq(x)ซึ่งจะส่งกลับลำดับจำนวนเต็มจาก1ถึงความยาวของxคือสถานที่ปัสสาวะทั้งหมด (และสถานที่ที่เป็นไปได้ทั้งหมดที่จะต้องพิจารณา)
seq(x)
ตอนนี้เรามีดัชนีโถฉี่ครอบครองของเรา: และโถฉี่ที่ว่างเปล่าของเรา1 7 1 2 3 4 5 6 7เราผ่าน`-`ฟังก์ชั่นการลบไปยังouterฟังก์ชั่นเพื่อรับ "การลบด้านนอก" ซึ่งเป็นเมทริกซ์ระยะทางต่อไปนี้ระหว่าง urinals ทั้งหมดและ urinals ที่ถูกครอบครอง:
[, 1] [, 2]
[1,] 0 -6
[2,] 1 -5
[3,] 2 -4
[4,] 3 -3
[5,] 4 -2
[6,] 5 -1
[7,] 6 0
outer(seq(x),which(!!x),`-`)
เรายกระดับสิ่งนี้ให้เป็น-2พลังที่ (สำหรับผู้ที่สูญเสียไปเล็กน้อยใน OP หมายถึง "ความรู้สึกไม่สบาย" หมายถึง1 / (distance(x, y) * distance(x, y))ซึ่งทำให้ง่าย1/d(x,y)^2ขึ้นคือd(x,y)^-2)
outer(seq(x),which(!!x),`-`)^-2
หาผลรวมของแต่ละแถวในเมทริกซ์
rowSums(outer(seq(x),which(!!x),`-`)^-2)
รับดัชนีค่าที่น้อยที่สุดเช่นปัสสาวะที่เหมาะสม ในกรณีที่มีค่าน้อยที่สุดหลายค่าหนึ่ง (เช่นซ้ายสุด) จะถูกส่งคืน
which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))
และ, เรามีดัชนีของปัสสาวะที่ดีที่สุด. เราแทนค่าที่ดัชนีนี้ในด้วยx 1ในกรณีที่1111เป็นอินพุตไม่สำคัญว่าเราจะแทนที่สิ่งใดเราจะยังคงมีเอาต์พุตที่ถูกต้อง
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
ส่งคืนอินพุตที่แก้ไข
x