Взорвать коробку


17

Коробки ASCII выглядят так:

++    +---+    +------+    +---+    +---+
++    |   |    |      |    |   |    |   |
      |   |    |      |    |   |    |   |
+-+   |   |    |      |    |   |    |   |
+-+   |   |    |      |    |   |    +---+
      +---+    |      |    |   |
+--+           |      |    |   |    ++
|  |           |      |    |   |    ||
|  |           +------+    |   |    ||
+--+                       |   |    ||
                           +---+    ||
                                    ||
                  +-----+           ||
+------------+    |     |           ++
|            |    |     |
|            |    |     |
+------------+    +-----+

Вот несколько примеров таких же ASCII-блоков:

++    +- -+    +-    -+    +- -+    +- -+
++    | - |    | -  - |    | - |    | - |
       | |      | -- |      | |      | |
+-+    | |       |  |        "      | - |
+-+   | - |       ||        | |     +- -+
      +- -+      |  |      |   |
+--+            | -- |      | |     ++
|  |           | -  - |      "      ||
|  |           +-    -+     | |     ||
+--+                       | - |   |  |
                           +- -+   |  |
      --                            ||
     -  -         +-   -+           ||
+-  -    -  -+    | - - |           ++
| --      -- |     | = |
| --      -- |    | - - |
+-  -    -  -+    +-   -+
     -  -
      --

Вот ссылка на все эти блоки тестовых примеров в более удобном для копирования формате. Порядок - все входы, за которыми следуют все выходы в одинаковом порядке.

Ваша цель - взять ASCII-бокс в качестве входных данных и вернуть взорванный бокс. Правила взрыва:

  1. «+» никогда не меняется; ни "-", ни "|" непосредственно рядом с "+"
  2. Начиная с углов, «-» и «|» переместиться внутрь на один пробел больше, чем сделал тот же персонаж ближе к углу. Если "-" и "|" никогда не будет двигаться в том же месте, ни один не движется.
  3. Если «-» и «-» перемещаются в одно и то же место, поместите «=» в это место. Если "|" и "|" переместитесь в то же место, поставьте «в этом месте». Они считаются двумя соответствующими персонажами в одном и том же месте, которые движутся в противоположных направлениях.
  4. Два "-" или два "|" может двигаться мимо друг друга, как видно в нижнем левом примере.
  5. Если коробка достаточно тонкая, она начнет расширяться наружу таким же образом, всегда удаляясь от той стороны, с которой она начала.
  6. Результат должен быть симметричным относительно центральной линии в направлениях x и y (игнорируя новые строки); это включает пробелы, поэтому для удовлетворения этого результата может потребоваться заполнить пробелами.

Детали правила:

  1. Это код-гольф, поэтому выигрывает самая короткая программа в байтах.
  2. Применяются стандартные лазейки.
  3. Вы можете предположить, что каждая строка заканчивается символом новой строки.
  4. Единственными символами во входной строке будут «+», «-», «|», «» и «\ n» (новая строка), и ваша выходная строка должна следовать тем же правилам с добавлением «=» и "как возможные персонажи.
  5. При желании у вас может быть один завершающий символ новой строки в конце последней строки.
  6. Наименьшее поле ASCII, которое вам нужно обработать, - это левый верхний пример. Каждая коробка ASCII будет иметь ровно 4 "+", точно по углам.
  7. Вам нужно будет обрабатывать поля размера m x nдля любых целых чисел, m,nтаких что 2<=m,n<256(максимально возможный размер строки 255*(255+1))
  8. Вы можете предположить, что вы всегда получите один действительный ASCII-блок в качестве ввода.

Я думаю, что вы забыли добавить «как возможный символ в выводе на цифре 4 Правил. Редактировать: Можем ли мы предположить, что на входе нет пустых строк?»
Theraot

Этот пример 1x6 является забавным, почему он взрывается наружу? Я думаю, что один из тех ||в этом примере должен быть "или что-то ...
Волшебная Урна Осьминога

@carusocomputing так же, как в нижнем левом примере, стены движутся друг через друга (поэтому объем ящика отрицательный) - правила 4 и 5.
Lyth

@ Лайф не должен все еще быть "хотя? Я думаю, что "только появляется на 3-шириной или больше?
Волшебная урна осьминога

@carusocomputing Подумайте над этим: Куда "пойдет? Слева или справа? Это не может быть и то и другое, но не может быть и так, потому что результат симметричен.
HyperNeutrino

Ответы:


15

Python 2 , 591 555 545 527 525 496 436 351 334 333 303 байта

s=input()
w=len(s[0])
h=len(s)
V=max(0,w/2-h)
H=max(0,h/2-w)
p=[[' ']*w]*V
q=[' ']*H
s=[q+k+q for k in p+s+p]
d,c=' -=',' |"'
exec"c,d,V,H,w,h=d,c,H,V,h,w;s=map(list,zip(*s))[::-1]\nfor j in range(h-4):q=s[V+j+2];q[H]=c[q[H]==c[2]];r=H+min(j+1,h-4-j);q[r]=c[1+(q[r]>' ')]\n"*4
for x in s:print''.join(x)

Попробуйте онлайн!

РЕДАКТИРОВАТЬ : мой старый метод сначала взорвался сверху и снизу, а затем влево и вправо. Вместо этого мы можем взорвать вершину, повернуть на 90 градусов и сделать это 4 раза. Кроме того, я использовал удобный код, который требует ввода в форме, [['+', '-', '-', '-', '-', '-', '+'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['+', '-', '-', '-', '-', '-', '+']]которая уродлива, но короче для программы: P (Спасибо Phoenix за то, что поймал это)

Кредиты Leaky Nun для кода заголовка в ссылке TIO, используемой для преобразования читабельного ввода человеком в читаемый компьютером ввод.

-85 байт благодаря Лики Нун!
-17 байт путем переключения с верхней имплозии на левую имплозию, что позволяет хранить всю строку в переменной и изменять ее. Спасибо Leaky Nun за предложение!
-1 байт, переключая вещи, чтобы удалить пробел.
-30 байт благодаря Лики Нун!


Присваивать s[0]и S[0]переменным, чтобы сохранить несколько байтов
caird coinheringaahing

@Ilikemydog Да, верно. Благодарность!
HyperNeutrino

Вы можете заменить p=s[0]и P=S[0]с p=z(s[0])и P=z(S[0]), соответственно, а затем заменить все вхождения z(p)с pи все z(P)с , Pчтобы сэкономить 18 байт.
Р. Кап

Кроме того, можно заменить (z(s)-1)/2-pс z(s)/2-.5-pи (p-1)/2-z(s)с , p/2-.5-z(s)чтобы сохранить больше 2 байта.
Р. Кап

@ R.Kap Да ладно. Спасибо за оба предложения!
HyperNeutrino

1

C (лязг) , 693 байта

Новые строки добавлены для удобства чтения. Первые два обязательны, а остальные нет.

#define P B[i][l]
#define m malloc(8)
I(B,h,V,S,J,Z,i,j,l,n,H,W,c,C,a,z,_,L,G,u,N,M)char**B,**Z;char*L,*G,*u;{
V=strlen(B[0]);
S=J=0;
Z=m;
for(i=0,j=h-1;i<h/2+h%2;i++,j--){
for(l=0,n=V-1;l<V/2+V%2;l++,n--){
if(P!=43&&((B[i][l-1]!=43&&i<1)||(B[i-1][l]!=43&&l<1))){
H=P==45;
W=P=='|';
P=B[j][l]=B[i][n]=B[j][n]=32;
if(H){
c=(N=i+l-1)==(M=j-l+1)?61:45;
if(M<0)L=m,sprintf(L,"%*s",V,""),L[l]=L[n]=c,Z[J]=L,J++;
else B[N][l]=B[N][n]=B[M][l]=B[M][n]=c;
}
if(W){
c=(N=l+i-1)==(M=n-i+1)?34:'|';
if(M<0)G=m,sprintf(G,"|%*s%s%*s|",i-n-2,"",B[i],i-n-2,""),B[i]=B[j]=G,S++;
else B[i][N]=B[j][N]=B[i][M]=B[j][M]=c;
}
}
}
}
for(a=-J+1;a<=h+J;u=a<1?Z[-a]:a<=h?B[a-1]:Z[a-h-1],C=S+1-strlen(u)/2,printf("%*s%s\n",C>0?C:0,"",u),a++);
}

Спасибо за большой вызов! Это было довольно сложно, но мне все равно было очень весело.

Он принимает входные данные в качестве аргументов командной строки и выводит в STDOUT многострочную строку развернутого блока. Как всегда, советы по игре в гольф очень ценятся.

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.