Code-Golf: Tắt đèn!


15

Mã ngắn nhất để vượt qua tất cả các khả năng chiến thắng

Nhiều trò chơi dựa trên lưới đã được thực hiện bắt đầu với một lưới đèn được bật. Nhấn bất kỳ đèn nào sẽ khiến ánh sáng đó và bốn đèn liền kề bị tắt. Khi đèn được bật, nó sẽ tắt hoặc bật, tùy thuộc vào việc nó được bật hay tắt. Mục tiêu là đánh các đèn theo trình tự dẫn đến việc tất cả các đèn bị tắt ở cuối.

"X" đại diện cho đèn được bật. "O" đại diện cho đèn bị tắt. "P" đại diện cho hình vuông được nhấn.

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

Đầu vào có thể được lấy trực tiếp từ một tệp được truyền dưới dạng đối số hoặc là đầu vào tiêu chuẩn. Dòng đầu tiên sẽ chứa x (1 <= x <= 20), kích thước của lưới đèn, nghĩa là x theo x . Dòng thứ hai sẽ chứa y (0 <= y <= ( x * 3) 2 ), số lượng đèn ban đầu sáng lên. Các dòng y tiếp theo chứa tọa độ của đèn sáng trên lưới, ở định dạng "cột hàng". Đèn đã được bật (đã được bật trước đó) nên được tắt lại. Dòng tiếp theo sẽ chứa z , số lượng đèn được nhấn. Z cuối cùng các dòng chứa tọa độ của đèn được nhấn, theo thứ tự mà chúng được nhấn, theo định dạng của "cột hàng".

Không có đầu vào sẽ không chính xác. Tất cả các số sẽ nằm trong ranh giới nhất định của lưới.

Đầu ra sẽ là lưới cuối cùng sau khi tất cả các đèn đã được bật. Nó phải là một n bởi n lưới. Đối với mỗi khu vực có đèn sáng, nên sử dụng ký tự chữ hoa "X". Đối với mỗi khu vực có đèn tắt, nên sử dụng ký tự chữ hoa "O".

Đèn bị ảnh hưởng ra khỏi lưới nên được bỏ qua. Việc bật đèn ở rìa lưới chỉ nên ảnh hưởng đến đèn trên lưới.

Các trường hợp thử nghiệm


Đầu và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

Đầu ra

OXOO
XOXO
XOXO
OXOO

Đầu vào

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

Đầu ra

X

Câu trả lời:


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

Có lẽ có thể được chơi golf hơn rất nhiều.

  • Chỉ giao diện điều khiển, stdin-> stdout. Đã thử nghiệm trên j602 trên Linux.
  • Vượt qua cả hai bài kiểm tra được đưa ra.
  • Giả sử giới hạn trên lành mạnh trên X (không có độ chính xác mở rộng)

Phiên bản không có bản gốc:

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

Con trăn 209 203 199 ký tự

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)

Trạng thái của đèn được giữ trong một biến số nguyên (lớn) , s. XOR với bitmasks được sử dụng để chuyển đổi ánh sáng. Tôi giữ thêm một chút cho mỗi hàng để ngăn chặn sự đóng gói.


Một kiệt tác! Rất nhiều điều có thể học được từ đây.
Oleh Prypin

execlà một từ khóa, không phải là hàm dựng sẵn (trong Python 2.x), vì vậy không cần thêm các dấu ngoặc đơn.
hallvabo

5

Ruby 1.9, 167 ký tự

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

Chỉnh sửa:

  • (198 -> 191) Đã xóa một số nội dung không cần thiết
  • (191 -> 180) Đơn giản hóa cách phân tích cú pháp đầu vào
  • (180 -> 172) Xóa dấu ngoặc đơn, sử dụng z[u]*=-1thay vì z[u]=-z[u], xóa biến không sử dụng
  • (172 -> 169) Một số đơn giản hóa
  • (169 -> 167) Đơn giản hóa một điều kiện

3

Perl, 139 ký tự

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

Giải trình:

# 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/⎕]

Bạn có thể cung cấp một bãi chứa hex cho điều này?
Kevin Brown

@KevinBrown: Đó chỉ là Unicode. Bạn muốn định dạng nào? 5 khối thực sự được gọi là "tứ giác" và được cho là trông như thế.
bến tàu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.