Scava una trincea di confine


59

Contesto: troppi immigrati clandestini provenienti dalla Blandia stanno attraversando il confine con Astan. L'imperatore di Astan ti ha incaricato di scavare una trincea per tenerli fuori, e Blandia deve pagare le spese. Dal momento che tutti i dattilografi sono stati informati fino alla disposizione della trincea, il codice deve essere il più breve possibile. *

Compito: data una mappa 2D del confine tra Astan e Blandia, fai pagare le Blands (con terra) per una trincea di confine.

Ad esempio: con le celle Astaniane contrassegnate A, le celle Blandiche contrassegnate Be le celle di trincea contrassegnate +(i riquadri della mappa sono solo per chiarezza):

┌──────────┐ ┌──────────┐
│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│
└──────────┘ └──────────┘

Dettagli: la mappa avrà almeno tre righe e tre colonne. La fila in alto sarà interamente astaniana e la fila in basso sarà interamente blandica.
 È possibile utilizzare tre valori qualsiasi per rappresentare il territorio astaniano, il territorio blandico e la trincea del confine, purché input e output siano coerenti.

Formulazione automatica: una cellula blandica con almeno una cellula astaniana nel suo quartiere di Moore diventa una cellula di trincea di confine.

Casi test

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

diventa:

[
  "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"
]

diventa:

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

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

diventa:

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

* ESCLUSIONE DI RESPONSABILITÀ: QUALSIASI RIMBORSO ALLA GEOPOLITICA ATTUALE È PURAMENTE COINCIDENTALE!


23
Satira politica sotto forma di codice golf, lo adoro: o)
preso il

4
-1 per quello <sup><sub><sup><sub><sup><sub><sup><sub>:-P
Luis Mendo il

25
Python, 4 byte : passi piani per costruire una trincea di confine portano a un arresto del governo e non succede nulla.
TheEspinosa,

3
@TheEspinosa No no, l'arresto è fino a quando la trincea è organizzata .
Adám,

1
Ho votato solo per la storia di fondo. Non ho nemmeno continuato a leggere.
pipe

Risposte:




8

JavaScript (ES7),  84  82 byte

Salvato 2 byte grazie a @Shaggy

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)))()

Provalo online!

Commentate

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 Non abbastanza domande ultimamente. Non so più giocare a golf. : D Grazie!
Arnauld

Stavo pensando solo la stessa cosa prima!
Shaggy,

7

K (ngn / k) , 23 byte

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

Provalo online!

utilizza 0 1 2per"AB+"

{ } funzione con argomento x

~ logico no

2{ }/ due volte

  • 0,x,0 surround con 0-s (sopra e sotto la matrice)

  • 3' triple di file consecutive

  • +/' sommare ciascuno

  • + trasporre

x&logico e di xcon

x+aggiungere xa


5

APL (Dyalog Unicode) , SBCS da 11 byte

⊢⌈{2∊⍵}⌺3 3

questo si basa sulla soluzione a 12 byte di @ dzaima in chat . merito a @ Adám stesso per aver pensato di usare nel dfn e a @ H.PWiz per averci ricordato di usare la stessa codifica per input e output

Provalo online!

rappresenta 'AB+'come 2 0 1rispettivamente

{ }⌺3 3 applica una funzione a ciascuna regione 3 × 3 sovrapposta dell'ingresso, comprese le regioni che si estendono 1 unità all'esterno della matrice, riempite con 0s

2∊⍵è un 2 presente nell'argomento? restituisce un valore booleano 0/1

⊢⌈ per elemento massimo di quello e la matrice originale


Naturalmente, il passaggio a Stencil ti farà risparmiare più della metà dei byte.
Adám,

@Adám sarebbe una risposta in una lingua diversa, quindi non confrontabile o in competizione con questa risposta. e non trovo il golf nelle lingue speciali particolarmente interessante, mi dispiace
ngn

@ Adám un alias per il displayquale ho dimenticato di rimuovere. rimosso ora
ngn

5

PowerShell , 220 byte

Non è piccolo come gli altri invii, ma ho pensato di aggiungerlo come riferimento. [PRUA, TESTA!]

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]}})} 

Provalo online!


1
Benvenuti in PPCG. Bella prima risposta, anche con collegamento TIO! Non preoccuparti della lunghezza del codice; ogni lingua compete contro se stessa. A proposito, puoi salvare un byte rimuovendo la prima interruzione di riga senza effetti negativi.
Adám,

La riga finale può diventare 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]}})}per 207 byte?
Gabriel Mills,

4

Ottava , 37 31 26 byte

Questa funzione esegue un'erosione morfologica sulla parte Astan ( 1-b) dell '"immagine" usando , e quindi usa un po' di aritmetica per rendere differenti tutte e tre le aree simboli. Grazie @LuisMendo per -5 byte!conv2 imerode

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

Provalo online!


2
-1 per nessuna convoluzione :-P
Luis Mendo

@LuisMendo Una versione precedente includeva una convoluzione :)
flawr

Grazie, aggiornato!
Flawr

3

J , 28 byte

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

Provalo online!

'AB+' -> 2 0 1

Ispirato alla soluzione APL di ngn. 12 byte solo per riempire la matrice di zero ...


perché la soluzione APL è in grado di cavarsela senza fare il padding zero?
Giona

@Jonah: APL (Stencil) lo fa in modo automatico: "I rettangoli sono centrati su elementi successivi di Y e (a meno che la dimensione del rettangolo sia 1), imbottiti con elementi di riempimento."
Galen Ivanov,

sembra molto più utile della versione di J ...
Giona

@Giona Sì, lo è!
Galen Ivanov,

2

Carbone , 20 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

≔⪫θ⸿θ

Unisci l'array di input con i ritorni a capo anziché i soliti newline. Ciò è necessario affinché i caratteri possano essere stampati singolarmente.

Pθ

Stampa la stringa di input senza spostare il cursore.

Fθ

Passa sopra ogni carattere della stringa di input.

⎇∧№KMA⁼Bι

Se il quartiere di Moore contiene un A, e il personaggio attuale è un B...

+

... quindi sovrascrivi il Bcon un +...

ι

... altrimenti stampa il carattere corrente (o passa alla riga successiva se il carattere corrente è un ritorno a capo).


2

JavaScript, 85 byte

L'ho messo insieme ieri sera tardi e se ne è dimenticato. Probabilmente c'è ancora spazio per qualche miglioramento da qualche parte.

L'input e l'output sono una matrice di array di cifre, usando 3per Astan, 0per Blandia e 1per la trincea.

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])

Provalo online (per comodità, mappe da e indietro al formato I / O utilizzato nella sfida)


2

Javascript, 126 118 byte

_=>_.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))

Passa uno degli array di stringhe dalla domanda e otterrai una matrice di array di caratteri di stringhe (grazie @Shaggy!) Usando 0 per la trincea. Può forse essere giocato a golf più (senza passare verso le matrici numeriche), ma non riesco a pensare a niente in questo momento.


Penso che questo funzioni per 120 byte.
Shaggy,

O 116 byte che restituiscono una matrice di matrici di caratteri.
Shaggy,

1
@Shaggy Il tuo golf non funziona, purtroppo - non cattura luoghi in cui A e B sono diagonali tra loro. D'altra parte, indica alcuni golf davvero semplici che mi sono perso ...
M Dirr

1

Retina 0.8.2 , 92 80 byte

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

Provalo online! Liberamente basato sulla mia risposta a Farò fuori in tempo? Spiegazione: Qualsiasi Bs immediatamente sopra o sotto As viene trasformato in as. Ciò quindi riduce il problema al controllo di Bs a sinistra oa destra di As o as. Gli astessi devono anche essere trasformati in +s, ovviamente, ma per fortuna la ibandiera Tinfluenza solo la corrispondenza regex, non la traslitterazione reale, quindi gli As rimangono inalterati.


1

05AB1E , 29 byte

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

Le matrici non sono proprio il seme forte di 05AB1E (né lo sono il mio seme forte). Tuttavia, si può sicuramente giocare ancora a golf.
Ispirato @ngn 's K (ngn / k) risposta , utilizza quindi anche I / O di una matrice integer 2D 012per AB+rispettivamente.

Provalo online . (Il piè di pagina nel TIO è di stampare graziosamente l'output. Sentiti libero di rimuoverlo per vedere l'output della matrice.)

Spiegazione:

_                # 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 # (compilatore interattivo Visual C #) , 187 byte

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;}))

Invece di concatenare Take()s, Skip()s e Select()s, questo invece usa il doppio per i loop per trovare i vicini. Enorme riduzione dei byte, da 392 byte a 187. Linq non è sempre il più breve!

Provalo online!


1

Perl 5, 58 46 byte

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

TIO

-12 byte grazie a @Grimy

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

TIO

  • -pcome -nma anche stampare
  • -00 modalità paragrafo
  • per ottenere la larghezza-1 /.\n/corrisponde all'ultimo carattere della prima riga
  • @{-} matrice speciale la posizione di inizio della partita dei gruppi corrispondenti precedenti, forzata come stringa (primo elemento)
  • s/../+/s&&redosostituire la partita con +while partite
    • /sflag, in modo che .corrisponda anche al carattere di nuova riga
  • A(|.{@{-}}.?.?)\KB fiammiferi
    • ABo Aseguito da (larghezza-1) a (larghezza + 1) caratteri seguiti daB
    • \Kper mantenere la sinistra Binvariata
  • B(?=(?1)A),
    • (?1) dirverting ricorsivo, per fare riferimento all'espressione precedente (|.{$m,$o})
    • (?=..) lookahead, per abbinare senza consumare input

-9 byte con /. /,@m=@-while s/A(|.{@m}.?.?)\KB|B(?=(?1)A)/+/s(letterale newline nella prima regex). TIO
Grimmy,

1
Giù per 46: /. /;s/A(|.{@{-}}.?.?)\KB|B(?=(?1)A)/+/s&&redo. TIO
Grimmy,

grazie, ho anche avuto l'idea, ma ho scartato perché pensavo a un backtracking catastrofico, tuttavia per le prestazioni del codice golf non è importante
Nahuel Fouilleul,

1

Java 8, 169 145 byte

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 byte grazie a @ OlivierGrégoire .

usi 0 invece di Ae 1invece di B, con l'input che è una matrice intera 2D. Modifica la matrice di input invece di restituirne una nuova per salvare i byte.

Le celle sono controllate come nella mia risposta per il sfida All the single eights .

Provalo online.

Spiegazione:

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
Non ho controllato molto, ma c'è qualcosa che non va m[i+k/3-1][j+k%3-1]? 145 byte
Olivier Grégoire il

@ OlivierGrégoire Dang, è molto più facile .. Grazie!
Kevin Cruijssen, il

Penso che sia valido anche per le tue risposte alle sfide precedenti dato che sembrano avere la stessa struttura
Olivier Grégoire,

@ OlivierGrégoire Sì, stavo per giocare a golf anche con il tuo suggerimento, ma poi è intervenuto un altro commento (e una domanda al lavoro). Lo farò tra un momento.
Kevin Cruijssen, il

1

PowerShell , 86 80 byte

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

Provalo online!

La mappa è una stringa con nuove righe. Questo script sostituisce Ba+ con regexp (?<=A(.?.?.{$MapWidth-1})?)B|B(?=(.?.?.{$MapWidth-1})?A).

Script di test meno golfato:

$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
}

Produzione:

True
True
True

0

Rubino , 102 byte

->a{a+=?.*s=a.size
(s*9).times{|i|a[j=i/9]>?A&&a[j-1+i%3+~a.index($/)*(i/3%3-1)]==?A&&a[j]=?+}
a[0,s]}

Provalo online!

input / output come una stringa separata newline


0

Python 2 , 123 119 byte

lambda m:[[[c,'+'][c=='B'and'A'in`[x[j-(j>0):j+2]for x in m[i-(i>0):i+2]]`]for j,c in e(l)]for i,l in e(m)];e=enumerate

Provalo online!

L'I / O è un elenco di elenchi


0

TSQL, 252 byte

Dividere la stringa è molto costoso, se la stringa fosse divisa e già in una tabella il conteggio dei byte sarebbe di 127 caratteri. Script incluso nella parte inferiore e completamente diverso. Scusami per aver occupato così tanto spazio.

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 @

Provalo

TSQL, 127 byte (Uso della variabile di tabella come input)

Eseguire questo script in Management Studio - utilizzare "query" - "risultato in testo" per renderlo leggibile

--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

Provalo : l'output di avviso è selezionato e non leggibile. Sarebbe leggibile con la stampa, ma ciò non è possibile usando questo metodo


Cosa ti fa pensare di non poter prendere un tavolo come argomento?
Adám,

@ Adám non è una cattiva idea creare il codice usando anche una tabella come argomento - ci
penserò

@Adám Immagino di aver sbagliato, per far funzionare lo script per 120 caratteri, avrei bisogno sia della tabella che del varchar come input, l'ho riscritto. Ci sono voluti 151 caratteri
t-clausen.dk il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.