Код-Гольф: свет выключен!

15

Самый короткий код для прохождения всех возможностей выигрывает

Было создано много игр на основе сетки, которые начинаются с включенной сетки огней. Нажатие любого из источников света приводит к переключению этого источника света и четырех расположенных рядом с ним источников света. Когда источник света переключается, он выключается или включается, в зависимости от того, был ли он включен или выключен изначально. Цель состоит в том, чтобы поразить огни в последовательности, которая приводит к выключению всех огней в конце.

«Х» обозначает включенные огни. «О» обозначает выключенные огни. «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 , количество нажатых лампочек. Финальная г Строки содержат координаты нажатых источников света в порядке их нажатия в формате «столбец строки».

Нет ввода будет неверным. Все числа будут в заданных границах сетки.

Выходной сигнал будет окончательной сеткой после переключения всех источников света. Это должна быть 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. XOR с битовыми масками используются для переключения света. Я держу лишний бит в ряду, чтобы предотвратить перенос.

Кит Рэндалл
источник
Шедевр! Так много можно узнать здесь.
Олег Припин
execэто ключевое слово, а не встроенная функция (в 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) Упростил условный
Ventero
источник
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;
}
Timwi
источник
2

APL (71)

'OX'[1+⊃{⍵≠(⍳⍴⍵)∊(⊂⍺)+K,⌽¨K←(0 1)(0 0)(0 ¯1)}/({⎕}¨⍳⎕),⊂({⎕}¨⍳⎕)∊⍨⍳2/⎕]
Мэринус
источник
Можете ли вы предоставить шестнадцатеричный дамп для этого?
Кевин Браун
@KevinBrown: это просто Unicode. Какой формат вы хотите? Эти 5 блоков на самом деле называются «квадраторами» и должны выглядеть так.
Марин