รหัส - กอล์ฟ: ไฟดับ!


15

รหัสที่สั้นที่สุดในการส่งผ่านความเป็นไปได้ทั้งหมดชนะ

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

"X" หมายถึงไฟที่เปิดอยู่ "O" หมายถึงไฟที่ปิดอยู่ "P" หมายถึงสี่เหลี่ยมที่กด

XOO          XOO      XOX      XOX      XXX
XOX          XOP  ->  XXO  ->  OPO  ->  XOX
OOX          OOX      POO      XXO      XOO

Intial Grid  Press 1  Press 2  Press 3  Ending Grid

อินพุตสามารถนำโดยตรงจากไฟล์ที่ส่งผ่านเป็นอาร์กิวเมนต์หรือเป็นอินพุตมาตรฐาน บรรทัดแรกของการป้อนข้อมูลจะมีx (1 <= x <= 20) ขนาดของตารางของไฟที่มีความหมายxโดยx บรรทัดที่สองจะมีy (0 <= y <= ( x * 3) 2 ) จำนวนไฟเริ่มสว่างขึ้น บรรทัดyถัดไปมีพิกัดของแสงไฟที่สว่างขึ้นบนกริดในรูปแบบของ "คอลัมน์แถว" ไฟที่เปิดอยู่แล้ว (ถูกสลับไปก่อนหน้านี้) ควรจะปิดอีกครั้ง บรรทัดถัดไปจะมีzจำนวนแสงที่กด zสุดท้าย บรรทัดประกอบด้วยพิกัดของไฟที่กดตามลำดับที่กดในรูปแบบของ "คอลัมน์แถว"

ไม่มีการป้อนข้อมูลจะไม่ถูกต้อง ตัวเลขทั้งหมดจะอยู่ภายในขอบเขตที่กำหนดของตาราง

เอาต์พุตจะเป็นกริดสุดท้ายหลังจากไฟทั้งหมดถูกเปิดใช้งาน มันควรเป็นnโดย nตาราง สำหรับแต่ละพื้นที่ที่มีไฟซึ่งเปิดอยู่ควรใช้อักขระตัวพิมพ์ใหญ่ "X" สำหรับแต่ละพื้นที่ที่มีแสงซึ่งปิดอยู่ควรใช้อักขระตัวพิมพ์ใหญ่ "O"

ไฟที่ได้รับผลกระทบซึ่งอยู่นอกกริดควรถูกละเว้น การสลับแสงบนขอบของกริดควรส่งผลต่อแสงที่อยู่ในกริดเท่านั้น

กรณีทดสอบ


อินพุต

4
5
2 3
2 4
3 1
3 4
4 3
7
3 3
4 4
3 4
4 2
4 1
2 2
3 2

เอาท์พุต

OXOO
XOXO
XOXO
OXOO

อินพุต

1
3
1 1
1 1
1 1
2
1 1
1 1

เอาท์พุต

X

คำตอบ:


4

J, 132

'x f'=:0 2{,i=:".;._2(1!:1)3
echo u:79+9*}:"1}."1}.}:2|+/(1:`[`]}&(0$~,~x+2))"0<"1(f{.2}.i),;([:<[,[:|:(2 4$0 0,,~1 _1)+])"1(3+f)}.i

อาจจะสามารถเล่นกอล์ฟต่อไปได้อีกมาก

  • คอนโซลเท่านั้น stdin-> stdout ทดสอบบน j602 บน Linux
  • ผ่านการทดสอบทั้งที่กำหนด
  • สมมติว่ามีขีด จำกัด สูงสุดบน X (ไม่มีความแม่นยำเพิ่มเติม)

เวอร์ชั่นดั้งเดิมที่ไม่ได้เล่น:

NB. Whole input as two column grid
i=:".;._2(1!:1)3 

NB. x is x, f is number of initial toggles
'x f'=:0 2{,i 

NB. z is 1..x
z =: >:i.x 

NB. Take a boxed pair of indices, generate 'cross' indices (boxed)
f2=:3 :'y,,<"1(>y)+"1>0 1;1 0;0 _1;_1 0' 

NB. List of initial toggles, individually boxed
init=: <"1 f {. 2 }. i

NB. List of Ps, individually boxed
toggle=: <"1 (3 + f) }. i

NB. Grid of 0s padded on all sides
g =:0$~(x+2),(x+2)

NB. For each initial toggle, make a grid with a 1 in that position. Sum each 'position'.
grid =: +/ (1:`[`]}&g)"0 init

NB. For each position in the cross (f2) of each press, make a grid with a 1 in that position.
NB. Sum each 'position', add to 'grid', take mod 2, and select inner rows/columns.
gfinal =: z {"1 z { 2|grid + +/ (1:`([:f2[)`]}&g)"0 toggle

NB. Translate 0/1 to O/X through ascii and print
echo u:79+9*gfinal

6

Python 209 203 199 ตัวอักษร

I=input
x=I()+1
s=0
C=lambda:eval(raw_input().replace(' ','*%d+'%x))
exec's^=1<<C();'*I()
exec's^=1+(7<<x)/2+(1<<x<<x)<<(C()-x);'*I()
R=range(1,x)
for r in R:print''.join('OX'[s>>r*x+c&1]for c in R)

สถานะของไฟจะถูกเก็บไว้ในตัวเดียว (ใหญ่) sตัวแปรจำนวนเต็ม XORs ที่มี bitmasks ใช้ในการสลับไฟ ฉันเก็บเพิ่มอีกเล็กน้อยต่อแถวเพื่อป้องกันการพันกัน


ผลงานชิ้นเอก! สามารถเรียนรู้ได้มากมายจากที่นี่
Oleh Prypin

execเป็นคีย์เวิร์ดไม่ใช่ฟังก์ชัน builtin (ใน Python 2.x) ดังนั้นไม่จำเป็นต้องใช้วงเล็บเพิ่มเติม
hallvabo

5

Ruby 1.9, 167 ตัวอักษร

n=gets.to_i
y=z=[*[1]*n,0]*n
$<.map{|i|a,b=i.split.map &:to_i;b ?[*y&&[b>1&&-1,b<n&&1,a>1&&~n,a<n&&n+1],0].map{|f|f&&z[n*a+a-n-2+b+f]*=-1}:y=!y}
z.map{|a|putc"
OX"[a]}

การแก้ไข:

  • (198 -> 191) ลบสิ่งที่ไม่จำเป็นออก
  • (191 -> 180) ประยุกต์วิธีแยกวิเคราะห์ข้อมูลแบบง่าย
  • (180 -> 172) ลบวงเล็บใช้z[u]*=-1แทนz[u]=-z[u]ลบตัวแปรที่ไม่ได้ใช้
  • (172 -> 169) ความเรียบง่ายบางอย่าง
  • (169 -> 167) ปรับเงื่อนไขให้ง่ายขึ้น

3

Perl, 139 ตัวอักษร

@s=1..<>;<>=~/ /,$f{$`,$'+0}=1for 1..<>;<>=~/ /,map$f{$`+$_*($_&1),$'+int$_/2}^=1,-2..2for 1..<>;$\=$/;for$x(@s){print map$f{$x,$_}?X:O,@s}

คำอธิบาย:

# Read size and generate an array of integers from 1 to the size.
# We’ll need to iterate over this array often, but otherwise we don’t need the size
@s = 1..<>;

# Read number of prelit lights
for (1..<>) {
    # Find the space; sets $` and $' to row and column, respectively
    <> =~ / /;
    # Set the relevant light; need +0 because $' includes the newline
    $f{$`, $'+0} = 1;
}

# Read number of light switchings
for (1..<>) {
    # As above
    <> =~ / /;
    # Some nice formulas that flip the 5 relevant lights,
    # including the ones “off the board”, but we don’t care about those
    map {
        $f{ $`+$_*($_&1), $'+int$_/2 } ^= 1
    }, (-2..2);
}

# Cause each subsequent print statement to print a newline after it
$\ = $/;

# For each row...
for $x (@s) {
    # Print X’s and O’s as required
    print map { $f{$x,$_} ? X : O }, @s;
}

2

APL (71)

'OX'[1+⊃{⍵≠(⍳⍴⍵)∊(⊂⍺)+K,⌽¨K←(0 1)(0 0)(0 ¯1)}/({⎕}¨⍳⎕),⊂({⎕}¨⍳⎕)∊⍨⍳2/⎕]

คุณสามารถให้ hex dump สำหรับสิ่งนี้ได้หรือไม่?
Kevin Brown

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