Копайте борозду


59

История вопроса: слишком много нелегальных иммигрантов из Бландии пересекают границу с Астаном. Император Астана поручил вам вырыть траншею, чтобы не пускать их, и Бландия должна оплатить расходы. Так как все машинистки были обделены, пока траншея не устроена, ваш код должен быть как можно короче. *

Задача: Учитывая двухмерную карту границы между Астаном и Бландией, заставить Бландс заплатить (вместе с землей) за пограничный желоб.

Например: с помеченными ячейками Astanian A, помеченными ячейками Blandic и ячейками Bтраншеи +(рамки карты только для ясности):

┌──────────┐ ┌──────────┐
│AAAAAAAAAA│ │AAAAAAAAAA│
│ABAAAAAABA│ │A+AAAAAA+A│
│ABBBAABABA│ │A+++AA+A+A│
│ABBBAABABA│ │A+B+AA+A+A│
│ABBBBABABA│→│A+B++A+A+A│
│ABBBBABBBB│ │A+BB+A++++│
│ABBBBABBBB│ │A+BB+A+BBB│
│ABBBBBBBBB│ │A+BB+++BBB│
│BBBBBBBBBB│ │++BBBBBBBB│
└──────────┘ └──────────┘

Детали: Карта будет иметь как минимум три строки и три столбца. Верхний ряд будет полностью астанским, а нижний - полностью бландским.
 Вы можете использовать любые три значения для представления территории Астаны, Бландии и окопа, если входные и выходные данные согласованы.

Автоматическая формулировка: ячейка Бланда, имеющая по крайней мере одну ячейку Астаниана в своем районе Мура, становится пограничной траншейной ячейкой.

Контрольные примеры

[
  "AAAAAAAAAA",
  "ABAAAAAABA",
  "ABBBAABABA",
  "ABBBAABABA",
  "ABBBBABABA",
  "ABBBBABBBB",
  "ABBBBABBBB",
  "ABBBBBBBBB",
  "BBBBBBBBBB"
]

будет выглядеть так:

[
  "AAAAAAAAAA",
  "A+AAAAAA+A",
  "A+++AA+A+A",
  "A+B+AA+A+A",
  "A+B++A+A+A",
  "A+BB+A++++",
  "A+BB+A+BBB",
  "A+BB+++BBB",
  "++BBBBBBBB"
]

[
  "AAA",
  "AAA",
  "BBB"
]

будет выглядеть так:

[
  "AAA",
  "AAA",
  "+++"
]

[
  "AAAAAAAAAA",
  "AAAABBBAAA",
  "AAAABBBAAA",
  "AAAABBBAAA",
  "AAAAAAAAAA",
  "BBBBBBABBB",
  "BBBBBBAABB",
  "BBBAAAAABB",
  "BBBBBBBBBB"
]

будет выглядеть так:

[
  "AAAAAAAAAA",
  "AAAA+++AAA",
  "AAAA+B+AAA",
  "AAAA+++AAA",
  "AAAAAAAAAA",
  "++++++A+++",
  "BB++++AA+B",
  "BB+AAAAA+B",
  "BB+++++++B"
]

* ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: ЛЮБАЯ РЕЗУЛЬТАТА К ФАКТИЧЕСКОЙ ГЕОПОЛИТИКЕ ЧИСТО СОВПАДАЕТ!


23
Политическая сатира в виде кода гольфа, мне это нравится: о)
Сок

4
-1 за это <sup><sub><sup><sub><sup><sub><sup><sub>:-P
Луис Мендо

25
python, 4 байта : passпланы по строительству пограничного желоба приводят к закрытию правительства, и ничего не происходит.
TheEspinosa

3
@TheEspinosa Нет-нет, отключение происходит до тех пор, пока не будет организована траншея .
Адам

1
Я проголосовал только из-за предыстории. Даже не продолжал читать.
труба

Ответы:



9

MATL , 11 8 байт

Вдохновленный @ flawr это октава ответ и @ lirtosiast - х Mathematica ответ .

EG9&3ZI-

Входные данные представляют собой матрицу, в которой Астан представлен, 0а Бландия - 1. Траншея представлена ​​в выводе 2.

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

Как это устроено

E       % Implicit input. Multiply by 2, element-wise
G       % Push input again
9       % Push 9
&3ZI    % Erode with neighbourhood of 9 elements (that is, 3×3) 
-       % Subtract, element-wise. Implicit display

8

JavaScript (ES7),  84  82 байта

Сохранено 2 байта благодаря @Shaggy

Принимает входные данные в виде матрицы целых чисел, с для Astan и для Blandia. Возвращает матрицу с дополнительным значением для траншеи.301

a=>(g=x=>a.map(t=(r,Y)=>r.map((v,X)=>1/x?t|=(x-X)**2+(y-Y)**2<v:v||g(X,y=Y)|t)))()

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

комментарии

a => (                      // a[] = input matrix
  g = x =>                  // g = function taking x (initially undefined)
    a.map(t =               //   initialize t to a non-numeric value
      (r, Y) =>             //   for each row r[] at position Y in a[]:
      r.map((v, X) =>       //     for each value v at position X in r[]:
        1 / x ?             //       if x is defined (this is a recursive call):
          t |=              //         set the flag t if:
            (x - X) ** 2 +  //           the squared Euclidean distance
            (y - Y) ** 2    //           between (x, y) and (X, Y)
            < v             //           is less than v (3 = Astan, 0 = Blandia)
        :                   //       else (this is the initial call to g):
          v ||              //         yield v unchanged if it's equal to 3 (Astan)
          g(X, y = Y)       //         otherwise, do a recursive call with (X, Y) = (x, y)
          | t               //         and yield the flag t (0 = no change, 1 = trench)
      )                     //     end of inner map()
    )                       //   end of outer map()
)()                         // initial call to g


4
@ Shaggy В последнее время мало вопросов. Я больше не знаю, как играть в гольф. : D Спасибо!
Арно

Раньше я думал только о том же!
лохматый

7

К (нгн / к) , 23 байта

{x+x&2{++/'3'0,x,0}/~x}

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

использует 0 1 2для"AB+"

{ } функция с аргументом x

~ не логично

2{ }/ дважды сделать

  • 0,x,0 окружить 0-с (верх и низ матрицы)

  • 3' тройки последовательных рядов

  • +/' суммировать каждый

  • + транспонирования

x&логично и xс

x+добавить xк


5

APL (Dyalog Unicode) , 11 байтов SBCS

⊢⌈{2∊⍵}⌺3 3

это основано на 12-байтовом решении @ dzaima в чате . спасибо самому @ Adám за размышления об использовании в dfn и @ H.PWiz за напоминание о необходимости использовать ту же кодировку для ввода и вывода

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

представляет собой , 'AB+'как , 2 0 1соответственно ,

{ }⌺3 3 применить функцию к каждой перекрывающейся области 3 × 3 входа, включая области, выходящие на 1 единицу за пределы матрицы, дополненные нулями

2∊⍵2 присутствует в аргументе? вернуть логическое значение 0/1

⊢⌈ на элемент максимум этого и исходной матрицы


Конечно, переход на трафарет сэкономит вам больше половины ваших байтов.
Адам

@ Adám, это будет ответ на другом языке, поэтому не сравним или не конкурирует с этим ответом. и я не нахожу игру в гольф на специальных языках особенно интересной, извините
ngn

@ Adám псевдоним, displayкоторый я забыл удалить. удалено сейчас
ngn

5

PowerShell , 220 байт

Он не такой маленький, как другие материалы, но я подумал, что добавлю его для справки. [FORE]

function m($i,$m){($i-1)..($i+1)|?{$_-in0..$m}}
$h=$a.count-1;$w=$a[0].length-1
foreach($i in 0..$h){-join$(foreach($j in 0..$w){if ($a[$i][$j]-eq'B'-and($a[(m $i $h)]|?{$_[(m $j $w)]-match'A'})){'+'}else{$a[$i][$j]}})} 

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


1
Добро пожаловать в PPCG. Хороший первый ответ, даже с ссылкой TIO! Не беспокойтесь о длине кода; каждый язык конкурирует против самого себя. Кстати, вы можете сохранить один байт, удалив первый разрыв строки без вредных последствий.
Адам

Может ли финальная строка стать 0..$h|%{-join$(foreach($j in 0..$w){if ($a[$_][$j]-eq'B'-and($a[(m $_ $h)]|?{$_[(m $j $w)]-match'A'})){'+'}else{$a[$_][$j]}})}для 207 байтов?
Габриэль Миллс

4

Октава , 37 31 26 байт

Эта функция выполняет морфологическую эрозию в 1-bчасти «изображения» с помощью Astan ( ) , а затем использует некоторую арифметику, чтобы сделать все три области разными символами. Спасибо @LuisMendo за -5 байт!conv2 imerode

@(b)2*b-imerode(b,ones(3))

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


2
-1 без свертки :-P
Луис Мендо

@LuisMendo Более ранняя версия включала в себя свертку :)
flawr

Спасибо, обновлено!
flawr

3

J , 28 байт

>.3 3(2 e.,);._3(0|:@,|.)^:4

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

'AB+' -> 2 0 1

Вдохновленный решением APL ngn. 12 байтов, чтобы заполнить матрицу нулями ...


почему решение APL может обойтись без заполнения нулями?
Иона

@Jonah: APL (Stencil) делает это автоматически: «Прямоугольники центрированы на последовательных элементах Y и (если размер прямоугольника не равен 1), дополнены элементами заливки».
Гален Иванов

это кажется гораздо более полезным, чем версия J ...
Иона

@Джона Да, это так!
Гален Иванов

2

Древесный уголь , 20 байтов

≔⪫θ⸿θPθFθ⎇∧№KMA⁼Bι+ι

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔⪫θ⸿θ

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

Pθ

Вывести строку ввода без перемещения курсора.

Fθ

Цикл по каждому символу входной строки.

⎇∧№KMA⁼Bι

Если соседство Мура содержит A, а текущий символ B...

+

... затем переписать Bс +...

ι

... в противном случае выведите текущий символ (или перейдите к следующей строке, если текущий символ - возврат каретки).


2

JavaScript, 85 байт

Бросил это вместе поздно прошлой ночью и забыл об этом. Возможно, где-то еще есть место для улучшения

Ввод и вывод - это массив массивов цифр, использующий 3для Astan, 0для Blandia и 1для траншеи.

a=>a.map((x,i)=>x.map((y,j)=>o.map(v=>o.map(h=>y|=1&(a[i+v]||x)[j+h]))|y),o=[-1,0,1])

Попробуйте онлайн (для удобства карты из и обратно в формат ввода / вывода, используемый в конкурсе)


2

Javascript, 126 118 байт

_=>_.map(x=>x.replace(/(?<=A)B|B(?=A)/g,0)).map((x,i,a)=>[...x].map((v,j)=>v>'A'&&(a[i-1][j]<v|(a[i+1]||x)[j]<v)?0:v))

Передайте один из строковых массивов из вопроса, и вы получите массив строковых символьных массивов (спасибо @Shaggy!), Используя 0 для траншеи. Можно , вероятно , будет более golfed (без перехода на числовые массивы), но я не могу думать ни о чем в данный момент.


Я думаю, что это работает для 120 байтов.
лохматый

Или 116 байтов, возвращающих массив символьных массивов.
лохматый

1
@ Shaggy К сожалению, ваш гольф не работает - он не ловит места, где А и В расположены по диагонали друг к другу. С другой стороны, это действительно указывает на некоторые действительно простые игры в гольф, которые я пропустил ...
M Dirr

1

Сетчатка 0.8.2 , 92 80 байт

(?<=¶(.)*)B(?=.*¶(?<-1>.)*(?(1)_)A|(?<=¶(?(1)_)(?<-1>.)*A.*¶.*))
a
iT`Ba`+`.?a.?

Попробуйте онлайн! На основании моего ответа на вопрос, успею ли я разобраться вовремя? Пояснение: Любые Bs непосредственно выше или ниже As превращаются в as. Это тогда сводит проблему к проверке Bs слева или справа от As или as. Сами as также должны быть превращены в +s, конечно, но, к счастью, iфлаг Tвлияет только на совпадение с регулярным выражением, а не на фактическую транслитерацию, поэтому As остается неизменным.


1

05AB1E , 29 байт

_2FIн¸.øVgN+FYN._3£})εøO}ø}*Ā+

Матрицы на самом деле не являются сильной стороной 05AB1E (и при этом они не являются моей сильной стороной) .. Хотя, безусловно, можно играть в гольф еще.
Вдохновлен ответом @ngn 's K (ngn / k) , поэтому также использует ввод / вывод двумерной целочисленной матрицы с 012for для AB+соответственно.

Попробуйте онлайн . (Нижний колонтитул в TIO должен красиво печатать вывод. Не стесняйтесь удалить его, чтобы увидеть матричный вывод.)

Объяснение:

_                # Inverse the values of the (implicit) input-matrix (0→1 and 1→0)
                 #  i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]]
                 #   → [[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0]]
 2F              # Loop `n` 2 times in the range [0, 2):
   Iн            #  Take the input-matrix, and only leave the first inner list of 0s
                 #   i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]] → [0,0,0,0]
     ¸           #  Wrap it into a list
                 #   i.e. [0,0,0,0] → [[0,0,0,0]]
               #  Surround the inverted input with the list of 0s
                 #   i.e. [[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0]] and [0,0,0,0]
                 #    → [[0,0,0,0],[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0]]
        V        #  Pop and store it in variable `Y`
   g             #  Take the length of the (implicit) input-matrix
                 #   i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]] → 4
    N+           #  Add `n` to it
                 #   i.e. 4 and n=0 → 4
                 #   i.e. 4 and n=1 → 5
      F          #  Inner loop `N` in the range [0, length+`n`):
       Y         #   Push matrix `Y`
        N._      #   Rotate it `N` times towards the left
                 #    i.e. [[0,0,0,0],[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0]] and N=2
                 #     → [[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,1,1,1]]
            3£   #   And only leave the first three inner lists
                 #    i.e. [[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,1,1,1]]
                 #     → [[1,0,1,1],[1,0,0,0],[0,0,0,0]]
              }  #  After the inner loop:
    )            #  Wrap everything on the stack into a list
                 #   → [[[0,0,0,0],[1,1,1,1],[1,0,1,1]],[[1,1,1,1],[1,0,1,1],[1,0,0,0]],[[1,0,1,1],[1,0,0,0],[0,0,0,0]],[[1,0,0,0],[0,0,0,0],[0,0,0,0]]]
     €ø          #  Zip/transpose (swapping rows/columns) each matrix in the list
                 #   → [[[0,1,1],[0,1,0],[0,1,1],[0,1,1]],[[1,1,1],[1,0,0],[1,1,0],[1,1,0]],[[1,1,0],[0,0,0],[1,0,0],[1,0,0]],[[1,0,0],[0,0,0],[0,0,0],[0,0,0]]]
       O         #  And take the sum of each inner list
                 #   → [[2,1,2,2],[3,1,2,2],[2,0,1,1],[1,0,0,0]]
        ø        #  Zip/transpose; swapping rows/columns the entire matrix again
                 #   i.e. [[2,1,2,2],[3,1,2,2],[2,0,1,1],[1,0,0,0]]
                 #    → [[2,3,2,1],[1,1,0,0],[2,2,1,0],[2,2,1,0]]
               } # After the outer loop:
                 #   i.e. [[3,5,5,4,2],[4,6,5,4,2],[2,3,2,2,1],[1,1,0,0,0]]
  *              # Multiple each value with the input-matrix at the same positions,
                 # which implicitly removes the trailing values
                 #  i.e. [[3,5,5,4,2],[4,6,5,4,2],[2,3,2,2,1],[1,1,0,0,0]]
                 #   and [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]]
                 #    → [[0,0,0,0],[0,1,0,0],[0,2,1,0],[2,2,1,0]]
   Ā             # Truthify each value (0 remains 0; everything else becomes 1)
                 #  i.e. [[0,0,0,0],[0,1,0,0],[0,2,1,0],[2,2,1,0]]
                 #   → [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,0,0]]
    +            # Then add each value with the input-matrix at the same positions
                 #  i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,0,0]]
                 #   and [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]]
                 #    → [[0,0,0,0],[0,2,0,0],[0,2,2,2],[2,2,1,1]]
                 # (and output the result implicitly)

1

C # (интерактивный компилятор Visual C #) , 187 байт

a=>a.Select((b,i)=>b.Select((c,j)=>{int k=0;for(int x=Math.Max(0,i-1);x<Math.Min(i+2,a.Count);x++)for(int y=Math.Max(0,j-1);y<Math.Min(j+2,a[0].Count);)k+=a[x][y++];return k>1&c<1?9:c;}))

Вместо создания цепочек Take()s, Skip()s и Select()s вместо этого используются двойные циклы for для поиска соседей. ОГРОМНОЕ уменьшение байтов с 392 до 187. Linq не всегда самый короткий!

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


1

Perl 5, 58 46 байт

$m=($n=/$/m+"@+")-2;s/A(|.{$m,$n})\KB|B(?=(?1)A)/+/s&&redo

TIO

-12 байт благодаря @Grimy

/.
/;s/A(|.{@{-}}.?.?)\KB|B(?=(?1)A)/+/s&&redo

TIO

  • -pнравится, -nно печать также
  • -00 режим абзаца
  • чтобы получить ширину-1 /.\n/соответствует последнему символу первой строки
  • @{-} специальный массив - позиция начала совпадения предыдущих сопоставленных групп, приведенная как строка (первый элемент)
  • s/../+/s&&redoзаменить совпадение на +время совпадения
    • /sфлаг, так что .соответствует также символу новой строки
  • A(|.{@{-}}.?.?)\KB Спички
    • ABили Aпосле (width-1) до (width + 1) символов, следующих заB
    • \Kоставить Bбез изменений
  • B(?=(?1)A),
    • (?1) рекурсивный dirverting, для ссылки на предыдущее выражение (|.{$m,$o})
    • (?=..) вперед, чтобы соответствовать, не потребляя ввод

-9 байт с /. /,@m=@-while s/A(|.{@m}.?.?)\KB|B(?=(?1)A)/+/s(буквальный перевод строки в первом регулярном выражении). TIO
Grimmy

1
Вплоть до 46: /. /;s/A(|.{@{-}}.?.?)\KB|B(?=(?1)A)/+/s&&redo. TIO
Grimmy

спасибо, у меня тоже была идея, но я отказался, потому что думал о катастрофическом возврате, однако для кода игра в гольф не важна
Науэль Фуийе

1

Java 8, 169 145 байт

m->{for(int i=m.length,j,k;i-->0;)for(j=m[i].length;j-->0;)for(k=9;m[i][j]==1&k-->0;)try{m[i][j]=m[i+k/3-1][j+k%3-1]<1?2:1;}catch(Exception e){}}

-24 байта благодаря @ OlivierGrégoire .

Использует 0вместо Aи 1вместо того B, чтобы вход был двумерной целочисленной матрицей. Изменяет матрицу ввода вместо возврата новой, чтобы сохранить байты.

Клетки проверяются так же , как в моем ответ за все одиночные восьмерки вызова .

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

Объяснение:

m->{                            // Method with integer-matrix parameter and no return-type
  for(int i=m.length,j,k;i-->0;)//  Loop over the rows
    for(j=m[i].length;j-->0;)   //   Inner loop over the columns
      for(k=9;m[i][j]==1&       //    If the current cell contains a 1:
          k-->0;)               //     Inner loop `k` in the range (9, 0]:
        try{m[i][j]=            //      Set the current cell to:
             m[i+k/3-1]         //       If `k` is 0, 1, or 2: Look at the previous row
                                //       Else-if `k` is 6, 7, or 8: Look at the next row
                                //       Else (`k` is 3, 4, or 5): Look at the current row
              [j+k%3-1]         //       If `k` is 0, 3, or 6: Look at the previous column
                                //       Else-if `k` is 2, 5, or 8: Look at the next column
                                //       Else (`k` is 1, 4, or 7): Look at the current column
               <1?              //       And if this cell contains a 0:
                  2             //        Change the current cell from a 1 to a 2
                 :              //       Else:
                  1;            //        Leave it a 1
        }catch(Exception e){}}  //      Catch and ignore ArrayIndexOutOfBoundsExceptions
                                //      (try-catch saves bytes in comparison to if-checks)

1
Я не очень много проверял, но что-то не так m[i+k/3-1][j+k%3-1]? 145 байтов
Оливье Грегуар

@ OlivierGrégoire Dang, это намного проще .. Спасибо!
Кевин Круйссен

Я думаю, что это также верно для ваших ответов на предыдущие вызовы, учитывая, что они, кажется, имеют одинаковую структуру
Оливье Грегуар

@ OlivierGrégoire Да, я тоже собирался сыграть в гольф с вашим предложением, но затем между ними возник другой комментарий (и вопрос на работе). Сделаем это через мгновение.
Кевин Круйссен

1

PowerShell , 86 80 байт

$p="(.?.?.{$(($args|% i*f '
')-1)})?"
$args-replace"(?s)(?<=A$p)B|B(?=$p`A)",'+'

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

Карта представляет собой строку с символами новой строки. Этот скрипт заменяет Bна +регулярное выражение (?<=A(.?.?.{$MapWidth-1})?)B|B(?=(.?.?.{$MapWidth-1})?A).

Менее гольф-тестовый сценарий:

$f = {
$l=($args|% indexOf "`n")-1
$p="(.?.?.{$l})?"
$args-replace"(?s)(?<=A$p)B|B(?=$p`A)",'+'
}

@(
,(@"
AAAAAAAAAA
ABAAAAAABA
ABBBAABABA
ABBBAABABA
ABBBBABABA
ABBBBABBBB
ABBBBABBBB
ABBBBBBBBB
BBBBBBBBBB
"@,@"
AAAAAAAAAA
A+AAAAAA+A
A+++AA+A+A
A+B+AA+A+A
A+B++A+A+A
A+BB+A++++
A+BB+A+BBB
A+BB+++BBB
++BBBBBBBB
"@)
,(@"
AAA
AAA
BBB
"@,@"
AAA
AAA
+++
"@)
,(@"
AAAAAAAAAA
AAAABBBAAA
AAAABBBAAA
AAAABBBAAA
AAAAAAAAAA
BBBBBBABBB
BBBBBBAABB
BBBAAAAABB
BBBBBBBBBB
"@,@"
AAAAAAAAAA
AAAA+++AAA
AAAA+B+AAA
AAAA+++AAA
AAAAAAAAAA
++++++A+++
BB++++AA+B
BB+AAAAA+B
BB+++++++B
"@)
) | % {
    $map,$expected = $_
    $result = &$f $map
    $result-eq$expected
    #$result # uncomment this line to display results
}

Выход:

True
True
True



0

TSQL, 252 байта

Разделение строки очень дорого, если строка была разделена и уже в таблице счетчик байтов был бы 127 символов. Сценарий включен снизу и совершенно другой. Извините, что занял столько места.

Golfed:

WITH C as(SELECT x,x/z r,x%z c,substring(@,x+1,1)v
FROM spt_values CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
WHERE'P'=type)SELECT @=stuff(@,x+1,1,'+')FROM c WHERE
exists(SELECT*FROM c d WHERE abs(r-c.r)<2and
abs(c-c.c)<2and'AB'=v+c.v)PRINT @

Ungolfed:

DECLARE @ varchar(max)=
'AAAAAAAAAA
ABAAAAAABA
ABBBAABABA
ABBBAABABA
ABBBBABABA
ABBBBABBBB
ABBBBABBBB
ABBBBBBBBB
BBBBBBBBBB';

WITH C as
(
  SELECT x,x/z r,x%z c,substring(@,x+1,1)v
  FROM spt_values
  CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
  WHERE'P'=type
)
SELECT
  @=stuff(@,x+1,1,'+')
FROM c
WHERE exists(SELECT*FROM c d 
         WHERE abs(r-c.r)<2 
           and abs(c-c.c)<2 and'AB'=v+c.v)
PRINT @

Попробуйте это

TSQL, 127 байт (используя переменную таблицы в качестве входных данных)

Выполните этот скрипт в Management Studio - используйте «query» - «result to text», чтобы сделать его читаемым

--populate table variable
USE master
DECLARE @v varchar(max)=
'AAAAAAAAAA
ABAAAAAABA
ABBBAABABA
ABBBAABABA
ABBBBABABA
ABBBBABBBB
ABBBBABBBB
ABBBBBBBBB
BBBBBBBBBB'

DECLARE @ table(x int, r int, c int, v char)

INSERT @
SELECT x+1,x/z,x%z,substring(@v,x+1,1)
FROM spt_values
CROSS APPLY(SELECT number x,charindex(char(10),@v)z)z
WHERE'P'=type and len(@v)>number

-- query(127 characters)

SELECT string_agg(v,'')FROM(SELECT
iif(exists(SELECT*FROM @
WHERE abs(r-c.r)<2and abs(c-c.c)<2and'AB'=v+c.v),'+',v)v
FROM @ c)z

Попробуйте - вывод предупреждения выбран и не читается. Будет читаться с печатью, но это невозможно при использовании этого метода


Что заставляет вас думать, что вы не можете принять таблицу в качестве аргумента?
Адам

@ Adám неплохая идея создать код с использованием таблицы в качестве аргумента - я получу право на это
t-clausen.dk

@ Adám Полагаю, я был не прав, чтобы скрипт работал на 120 символов, мне понадобится и таблица, и varchar для ввода, я переписал его. Это заняло 151 символов
t-clausen.dk
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.