Копайте прикордонну траншею


59

Передумови: Занадто багато нелегальних іммігрантів з Бландії перетинають кордон до Астана. Імператор Астану доручив вам викопати траншею, щоб уникнути їх, і Бландія повинна оплатити витрати. Оскільки всі друкарки були розкриті до тих пір, поки траншея не буде влаштована, ваш код повинен бути якомога коротшим. *

Завдання: Давши двовимірну карту кордону між Астаном та Бландією, змусьте Бландс платити (землею) за прикордонну траншею.

Наприклад: Якщо позначені Aастанські клітини, позначені клітини Бландської 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
Політична сатира у вигляді кодового гольфу, я люблю це: o)
Sok

4
-1 для цього <sup><sub><sup><sub><sup><sub><sup><sub>:-P
Луїс Мендо

25
python, 4 байти : passПлани побудови прикордонної траншеї призводять до відключення уряду, і нічого не відбувається.
TheEspinosa

3
@ TheEspinosa Ні ні, відключення відбувається, поки траншея не влаштована .
Адам

1
Я схвалив саме через фонову історію. Навіть не читав.
труба

Відповіді:



9

MATL , 11 8 байт

Натхненний @ flawr - х Октав відповідь і Mathematica відповідь @ lirtosiast в .

EG9&3ZI-

Вхід є матрицею з Астаном, представленим 0і Blandia 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

Вводиться як матриця цілих чисел, для Астана і для 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 одиницю поза матрицею, доповнену 0s

2∊⍵2 є в аргументі? повернути 0/1 булева

⊢⌈ максимум цього елемента та оригінальну матрицю


Звичайно, перехід на трафарет заощадить більше половини ваших байтів.
Адам

@ Adám, це була б відповідь іншою мовою, тому не можна порівняти та не конкурувати з цією відповіддю. і я не знаходжу в гольф на мовах спеціального призначення особливо цікаво, шкода
СПП

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

5

PowerShell , 220 байт

Це не так мало, як інші матеріали, але я подумав, що додам його для довідки. [ДАЙ!]

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частині «зображення» Астана ( ) , а потім використовує деяку арифметику, щоб зробити усі три області різними символами. Дякую @LuisMendo за -5 байт!conv2 imerode

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

Спробуйте в Інтернеті!


2
-1 за відсутність згортки :-P
Луїс Мендо

@LuisMendo Більш рання версія включала згортку :)
недолік

Дякую, оновлено!
дефект

3

J , 28 байт

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

Спробуйте в Інтернеті!

'AB+' -> 2 0 1

Натхненний рішенням APL ngn. 12 байт, щоб просто набити матрицю з нулями ...


чому рішення APL здатне піти, не роблячи нульові накладки?
Йона

@Jonah: APL's (Трафарет) робить це атоматично: "Прямокутники зосереджені на послідовних елементах Y і (якщо розмір прямокутника не дорівнює 1), оббитим елементами заливки."
Гален Іванов

що здається набагато кориснішим, ніж версія J ...
Йона

@Jonah Так, так!
Гален Іванов

2

Вугілля деревне , 20 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

≔⪫θ⸿θ

Об'єднайте вхідний масив із поверненнями каретки, а не звичайними новими рядками. Це потрібно, щоб символи можна було надрукувати окремо.

Pθ

Роздрукувати вхідний рядок, не переміщуючи курсор.

Fθ

Переведіть петлю на кожен символ вхідного рядка.

⎇∧№KMA⁼Bι

Якщо околиці Мура містить A, а поточний персонаж - це B...

+

... потім перезапишіть Bіз +...

ι

... в іншому випадку надрукуйте поточний символ (або перейдіть до наступного рядка, якщо поточний символ є поверненням каретки).


2

JavaScript, 85 байт

Кинули це разом пізно вчора ввечері і забули про це. Напевно, десь ще є якісь покращення.

Введення та вихід - це масив цифрових масивів, використовуючи 3для Astan, 0Blandia та 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 Ваш гольф не працює, на жаль - він не ловить місця, де A і B діагональні один до одного. З іншого боку, це вказує на деякі справді прості гольфи, які я пропустив ...
М Дір

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 K (NGN / к) відповідь «и , так що також використовує введення / виведення 2D - целочисленную матрицю з 012для 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 # Interactive Compiler) , 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, замість цього використовується дубль для циклів для пошуку сусідів. ВЕЛИЧЕЗНЕ зменшення байтів, з 392 байт до 187. Linq не завжди найкоротший!

Спробуйте в Інтернеті!


1

Perl 5, 58 46 байт

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

ТІО

-12 байт завдяки @Grimy

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

ТІО

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

-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

дякую, у мене теж виникла ідея, але відмовилися, бо думав катастрофічно відкликати, однак для кодової характеристики гольфу не важливо
Nahuel Fouilleul

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 Данг, це набагато простіше .. Дякую!
Кевін Круїссен

Я думаю, що це справедливо і для ваших відповідей на попередні виклики, враховуючи, що вони, схоже, мають однакову структуру
Олів'є Грегоар

@ OlivierGrégoire Так, я вже збирався пограти в гольф з вашою пропозицією, але потім ще один коментар (і питання на роботі) прийшов між ними. Зробимо це за мить.
Кевін Круїссен

1

PowerShell , 86 80 байт

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

Спробуйте в Інтернеті!

Карта - це рядок з новими рядками. Цей сценарій замінюється Bна +regexp (?<=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 символів. Сценарій, включений внизу і зовсім інший. Вибачте, що зайняли стільки місця.

Гольф:

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 @

Безголівки:

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 байт (Використання змінної таблиці як вхідного)

Виконайте цей скрипт у студії управління - використовуйте "запит" - "результат до тексту", щоб зробити його читабельним

--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 не погана ідея створити код, використовуючи також таблицю в якості аргументу - я
зрозумію

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