Kode-Golf: Lampu Mati!

15

Kode terpendek untuk lulus semua kemungkinan menang

Banyak game berbasis kisi telah dibuat yang dimulai dengan kisi-kisi lampu yang dinyalakan. Menekan salah satu lampu menyebabkan cahaya itu dan keempat lampu yang bersebelahan dengannya menyala. Ketika lampu dimatikan, lampu dimatikan atau dinyalakan, tergantung pada apakah dimatikan atau dinyalakan. Tujuannya adalah untuk mengenai lampu secara berurutan yang menghasilkan semua lampu dimatikan pada akhirnya.

"X" mewakili lampu yang dinyalakan. "O" mewakili lampu yang dimatikan. "P" mewakili kotak yang ditekan.

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

Input dapat diambil langsung dari file yang dikirimkan sebagai argumen, atau sebagai input standar. Baris pertama masukan akan berisi x (1 <= x <= 20), ukuran grid lampu, berarti x oleh x . Baris kedua akan berisi y (0 <= y <= ( x * 3) 2 ), jumlah lampu awalnya menyala. Baris y berikutnya berisi koordinat lampu yang menyala di grid, dalam format "kolom baris". Lampu yang sudah dinyalakan (telah dinyalakan sebelumnya) harus dinyalakan kembali. Baris selanjutnya akan berisi z , jumlah lampu ditekan. Final z garis berisi koordinat dari lampu yang ditekan, dalam urutan yang ditekan, dalam format "kolom baris".

Tidak ada input yang salah. Semua angka akan berada dalam batas-batas grid yang diberikan.

Output akan menjadi grid terakhir setelah semua lampu telah diaktifkan. Ini harus menjadi n oleh n jaringan. Untuk setiap area yang memiliki cahaya yang menyala, karakter huruf besar "X" harus digunakan. Untuk setiap area yang memiliki cahaya yang mati, karakter huruf besar "O" harus digunakan.

Lampu yang terpengaruh yang berada di luar jaringan harus diabaikan. Mengalihkan cahaya di tepi kisi hanya akan memengaruhi lampu yang ada di kisi itu sendiri.

Uji Kasus


Memasukkan

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

Keluaran

OXOO
XOXO
XOXO
OXOO

Memasukkan

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

Keluaran

X
Kevin Brown
sumber

Jawaban:

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

Mungkin bisa bermain golf lebih jauh.

  • Hanya konsol, stdin-> stdout. Diuji pada j602 di Linux.
  • Lewati kedua tes yang diberikan.
  • Menganggap batas atas waras pada X (tidak ada presisi yang diperluas)

Versi ungolfed asli:

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
Jesse Millikan
sumber
6

Python, 209 203 199 karakter

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)

Status lampu disimpan dalam variabel integer tunggal (besar) s,. XOR dengan bitmasks digunakan untuk menghidupkan lampu. Saya menyimpan bit ekstra per baris untuk mencegah sampulnya.

Keith Randall
sumber
Mahakarya! Banyak yang bisa dipelajari dari sini.
Oleh Prypin
execadalah kata kunci, bukan fungsi bawaan (dengan Python 2.x), jadi tidak perlu untuk kurung tambahan itu.
hallvabo
5

Ruby 1.9, 167 karakter

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]}

Suntingan:

  • (198 -> 191) Menghapus beberapa hal yang tidak perlu
  • (191 -> 180) Sederhana cara input diuraikan
  • (180 -> 172) Tanda kurung dihapus, gunakan z[u]*=-1alih-alih z[u]=-z[u], hapus variabel yang tidak digunakan
  • (172 -> 169) Beberapa penyederhanaan
  • (169 -> 167) Sederhana bersyarat
Ventero
sumber
3

Perl, 139 karakter

@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}

Penjelasan:

# 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;
}
Timwi
sumber
2

APL (71)

'OX'[1+⊃{⍵≠(⍳⍴⍵)∊(⊂⍺)+K,⌽¨K←(0 1)(0 0)(0 ¯1)}/({⎕}¨⍳⎕),⊂({⎕}¨⍳⎕)∊⍨⍳2/⎕]
marinus
sumber
Bisakah Anda memberikan hex dump untuk ini?
Kevin Brown
@KevinBrown: Ini hanya Unicode. Format apa yang Anda inginkan? 5 blok sebenarnya disebut 'paha depan' dan seharusnya terlihat seperti itu.
marinus