Код-Гольф: Вимкнено світло!


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 рядки містять координати натиснутих вогнів у тому порядку, в якому вони були натиснуті, у форматі "рядок колони".

Жодне введення не буде помилковим. Усі числа будуть в заданих межах сітки.

Вихід буде остаточною сіткою після включення всіх вогнів. Це повинно бути п по п сітці. Для кожної області, на якій увімкнено світло, слід використовувати верхній символ "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

Пітон, 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

Рубін 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/⎕]

Чи можете ви надати для цього шістнадцятковий дамп?
Кевін Браун

@KevinBrown: Це просто Unicode. Який формат ви хочете? П'ять блоків насправді називають "квадратиками" і повинні виглядати так.
marinus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.