Закладіть коробку


17

Поле ASCII виглядає так:

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

Ось кілька прикладів тих самих ящиків ASCII, які вбудовані:

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

Ось посилання на всі ці скриньки тестів у легшому для копіювання форматі. Порядок - це всі входи з подальшим результатом у тому ж порядку.

Ваша мета - взяти вікно ASCII в якості вхідного даних і повернути імплодоване поле. Правила імплозії:

  1. "+" ніколи не змінюється; ні "-", ні "|" безпосередньо поруч із "+"
  2. Починаючи з кутів, "-" та "|" переміщення всередину на один пробіл більше, ніж той самий символ ближче до кута. Якщо "-" і "|" ніколи не переїхав би на одне і те ж місце, ані ходи.
  3. Якщо "-" і "-" переміститися на одне місце, поставте "=" у цьому місці. Якщо "|" та "|" перемістіться на те саме місце, поставте "в цьому місці". Вони вважаються двома їх відповідними символами в тому ж місці, що рухаються в протилежних напрямках.
  4. Два "-" або два "|" може рухатися повз один одного, як видно з нижнього лівого прикладу.
  5. Якщо ящик досить худий, він почне розширюватися назовні таким же чином, завжди віддаляючись від тієї сторони, з якої почав працювати.
  6. Результат повинен бути симетричним по лінії центра в обох напрямках x та y (ігноруючи нові рядки); сюди входять пробіли, тому результат, можливо, знадобиться прокласти пробілами, щоб задовольнити це.

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

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

Я думаю, ви забули додати "як можливий символ у висновку на цифрі 4 деталей правила. Редагувати: Чи можна припустити, що на вході немає порожніх рядків?"
Theraot

Цей приклад 1x6 є прикольним, чому він висувається назовні? Я думаю, що одним із тих, хто є ||в цьому прикладі, має бути "щось чи щось ...
Magic Octopus Urn

@carusocomputing так само, як приклад зліва внизу, стіни переміщуються одна з одною (тому об'єм поля негативний) - правила 4 і 5.
Літ

@Lyth, чи не повинно все ж бути "? Я здогадуюсь, що "з'являється лише на 3-х ширших або більших розмірах?
Magic Octopus Urn

@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 байт завдяки Leaky Nun!
-17 байт шляхом переходу від верхньої імплозії до лівої імплозії, що дозволяє зберігати весь рядок у змінну та змінювати. Дякуємо Leaky Nun за пропозицію!
-1 байт, перемикаючи речі навколо, щоб видалити пробіл.
-30 байт завдяки Leaky Nun!


Призначте 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.