ปัญหากล่องวิเศษ


15

คุณมีอาร์เรย์อินพุตขนาด m * n แต่ละเซลล์ในอาเรย์นั้นบรรจุด้วย P หรือ T การดำเนินการเดียวที่คุณสามารถทำได้ในอาเรย์คือคอลัมน์แบบพลิก เมื่อคุณพลิกคอลัมน์ตัวอักษรในเซลล์ทั้งหมดของสวิตช์คอลัมน์นั้น (P กลายเป็น T และ viceversa) หากคุณมีจำนวนแถว 'x' ที่มีตัวอักษรเดียวกัน (เช่น PPPP) คุณจะได้รับคะแนน ออกแบบอัลกอริทึมที่ใช้ในอาเรย์และส่งกลับโซลูชัน (คอลัมน์ที่จะพลิก) เพื่อให้อาเรย์ที่เกิดขึ้นนั้นมีจำนวนคะแนนสูงสุด

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

อินพุตอาร์เรย์:

PPTPP
PPTPP
PPTTP
PPPTT
PPPTT

เอาท์พุท:

3

คำอธิบาย:
โซลูชันที่ให้คะแนนสูงสุด: พลิกคอลัมน์หมายเลข 3
จากนั้นอาร์เรย์ดั้งเดิมจะเป็น:

PPPPP // 1 point
PPPPP // 1 point
PPPTP
PPTTT
PPTTT

//Total: 2 points

โปรดทราบว่าเราสามารถพลิกคอลัมน์ 4 และ 5 เพื่อให้ได้คะแนนสอง แต่ต้องมีการพลิกเพิ่ม

คุณอาจจะใช้รูปแบบการป้อนข้อมูลใด ๆ ที่สะดวกในการเป็นตัวแทนของอาร์เรย์สองมิติและคุณอาจยังสองที่แตกต่างกัน แต่คงค่าที่จะเป็นตัวแทนและPT

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ


6
ยินดีต้อนรับสู่ PPCG นี่เป็นความท้าทายที่ยิ่งใหญ่ แต่ต้องมีเกณฑ์การชนะเพื่อให้อยู่ในหัวข้อ
Ypnypn

ฉันสามารถควบคุมรูปแบบอินพุตได้หรือไม่ ฉันพูดได้ไหมว่า P เป็นเท็จและ T เป็นจริงหรือไม่ ถ้าไม่รูปแบบอินพุตคืออะไร
ภูมิใจ haskeller

แน่นอนว่ารูปแบบอินพุตไม่สำคัญ สมมติว่าคุณมีตัวอักษรหรือ ints หรือ booleans สองทิศทางหรือประเภทใดก็ได้ที่คุณเลือก
bruhhhhh

3
คุณต้องมีเกณฑ์การชนะเพื่อตัดสินใจว่าคำตอบที่ถูกต้องนั้นดีที่สุด สมมติว่าคำตอบที่ถูกต้องจะต้องให้คะแนนสูงสุดสำหรับอินพุตกริด (BTW คุณควรระบุสิ่งนี้) มันควรจะเป็นไปได้ที่จะสร้างตาราง 32 คอลัมน์ในเวลาที่เหมาะสม ดังนั้นฉันขอแนะนำให้คุณทำ ia codegolf (รหัสที่สั้นที่สุดชนะ)
ระดับแม่น้ำ St

1
ฉันทำงานตามคำแนะนำแรกของปีเตอร์ อย่าลังเลที่จะเปลี่ยนถ้อยคำหากคุณไม่ชอบ
Martin Ender

คำตอบ:



1

Pyth , 28

f@eo+/QN/Qm!dN_osZ^U2lhQTUhQ

รับอินพุตในรูปแบบของรายการซ้อนกันเช่น

[[0,0,1,0,0],[0,0,1,0,0],[0,0,1,1,0],[0,0,0,1,1],[0,0,0,1,1]]

ให้ผลลัพธ์เป็นดัชนี 0 เช่น

[2]

^U2lhQ: สร้างรายการที่เป็นไปได้ทั้งหมดของ 0s และ 1s ของความยาวที่เหมาะสม

_osZ: สั่งซื้อรายการเหล่านี้จากมากที่สุดไปน้อย 1 รายการ

+/QN/Qm!dN: นับจำนวนแต่ละรายการ ( N) และค่าผกผัน 0 และ 1 สลับกัน ( m!dN) ที่เกิดขึ้นในอินพุต อดีตสอดคล้องกับชุดของการพลิกออกจากศูนย์ทั้งหมดหลังจะทิ้งทุกคน

eo: สั่งซื้อรายการตามปุ่มด้านบนและใช้องค์ประกอบสุดท้ายซึ่งจะเป็นผลลัพธ์ที่มีคอลัมน์ที่ตรงกันมากที่สุดและหนึ่งในนั้นคือรายการที่มีค่าน้อยที่สุด

f@ ... TUhQ: แปลงรายการ 1s และ 0s นี้เป็นรายการดัชนีที่จะพลิก

สำหรับการจัดทำดัชนี 1 รายการให้เปลี่ยนda เป็นkจากนั้นใส่mhdที่จุดเริ่มต้น


0

CJam, 53 51 ไบต์

l~z:X,,La\{1$f++}/{,}${X\{_X=:!t}/z{_&,(},,}$0=:)S*

สิ่งนี้อ่านอาร์เรย์สองมิติเป็น 0 วินาทีและ 1 วินาทีจาก STDIN เช่นตัวอย่างในคำถามจะเป็น

[[0 0 1 0 0] [0 0 1 0 0] [0 0 1 1 0] [0 0 0 1 1] [0 0 0 1 1]]

ทดสอบที่นี่

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


0

Haskell, 98

g s=snd$maximum[((sum[1|o<-s,o==r||o==map(1-)r],-sum r),[i|(i,1)<-zip[1..]r])|r<-s++map(map(1-))s]

รูปแบบอินพุตเป็นรายการของ ints คุณสามารถใช้เวอร์ชันสตริงสำหรับการทดสอบ:

gg = g . map (map (\c -> case c of 'T' -> 0 ; _ -> 1) ) . lines

โอ้ไม่มีที่ว่าง! มันเจ็บ!

มันทำงานได้โดยการวนซ้ำแถวและคำนวณจำนวนคะแนนที่เราจะได้รับหากเราพลิกคอลัมน์ในลักษณะที่แถวนี้ได้รับคะแนน

สิ่งแรกที่ควรสังเกตคือการพลิกแถวไปที่ทั้งหมดTrueหรือทั้งหมดFalseไม่สำคัญเพราะกริดจะตรงกันข้ามทั้งหมดและจะมีคะแนนเท่ากัน

วิธีที่เราคำนวณการนับเมื่อแถวที่กำหนดได้รับจุดนั้น: เราวนซ้ำแถวอีกครั้งและรวมคะแนนแต่ละแถวให้กับเราโดยใช้ความจริงที่ว่าพวกเขาทำอย่างแน่นอนเมื่อแถวนั้นเหมือนกันหรือผกผันที่แน่นอน

ตัวอย่างเช่นหากแถวที่เรากำลังพลิกคือTPPTPและแถวปัจจุบันที่เรากำลังทำซ้ำอยู่นั้นPTTPTหรือTPPTPแถวนั้นได้รับเราจุด แต่เมื่อมันเป็นแถวอื่น ๆ ก็ไม่ได้รับคะแนนใด ๆ เรา


@ MartinBüttnerใช่ฉันจะแก้ไขในไม่ช้า (หวังว่า)
ภูมิใจ haskeller


0

Mathematica - 76

{
{P, P, T, P, P},
{P, P, T, P, P},
{P, P, T, T, P},
{P, P, P, T, T},
{P, P, P, T, T}
}/.{P -> 1, T -> 0};
First@MaximalBy[
  Subsets@Range@Length[%],
  MapAt[1-#&,%,{All,#}]~Count~{1..}&
]

เว้นแต่จะมีการระบุตัวอย่างเป็นอย่างอื่นไม่ใช่การส่งที่ถูกต้อง คุณจะต้องเขียนฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบการป้อนข้อมูล
Martin Ender

0

Python 2, 234

from itertools import *
A=input()
n=len(A[0])
R=range(n)
S=(0,)
for p in[q for i in R[:-1] for q in combinations(R,i)]:
    s=[sum([(l[q]+(q in p))%2 for q in R])for l in A]
    m=s.count(n)+s.count(0)
    if m>S[0]:S=(m,p)
print S[1]

อินพุตเป็นรายการของรายการ:

[[0,0,1,0,0],[0,0,1,0,0],[0,0,1,1,0],[0,0,0,1,1],[0,0,0,1,1]]

เอาท์พุทเป็น tuple ของการพลิกโดยใช้การจัดทำดัชนีหลามจาก 0:

(2,)

หากเอาต์พุตต้องถูกทำดัชนีจาก 1 ดังนั้นโค้ดคือ 272 อักขระที่มี 0 หมายถึงไม่มีการโยน:

print 0 if len(S[1])==0 else [p+1 for p in S[1]]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.