Implementa crenatura semplificata


24

introduzione

Crenatura significa regolare la spaziatura tra le lettere di un testo. Ad esempio, considera la parola Topscritta con i seguenti tre glifi:

##### ..... .....
..#.. ..... .....
..#.. ..##. .###.
..#.. .#..# .#..#
..#.. .#..# .#..#
..#.. ..##. .###.
..... ..... .#...
..... ..... .#...

Potremmo semplicemente riempire gli spazi tra i glifi con punti ed essere fatto con esso, ma gli spazi in qualche modo sembrano troppo ampi. Invece, facciamo scorrere i glifi verso sinistra in modo che quasi si tocchino:

#####........
..#..........
..#..##..###.
..#.#..#.#..#
..#.#..#.#..#
..#..##..###.
.........#...
.........#...

Sembra molto meglio! Nota come la barra di si Ttrova sopra il bordo sinistro di o. In questa sfida, il tuo compito è implementare un semplice programma di crenatura per tali glifi rettangolari.

Il processo di crenatura

Considera due matrici di caratteri 2D rettangolari di .e #della stessa forma. Nel nostro semplice processo di crenatura, posizioniamo prima le matrici fianco a fianco, con una colonna di .s in mezzo. Quindi, spostiamo ciascuno #nell'array destro di un passo verso sinistra, fino a quando alcuni #s dell'array destro e sinistro sono adiacenti ortogonalmente o diagonalmente. Il risultato della crenatura è il passo prima di introdurre #s adiacenti . Il tuo compito è implementare questo processo.

Facciamo un esempio:

Inputs:
..###
#....
#....
..##.

...#.
...##
..###
....#

Process:
..###....#.
#........##
#.......###
..##......#

..###...#.
#.......##
#......###
..##.....#

..###..#.
#......##
#.....###
..##....#

..###.#.
#.....##
#....###
..##...#

..####.
#....##
#...###
..##..#

Nell'ultimo array, abbiamo nuove coppie adiacenti di #s, quindi il penultimo array è il risultato del processo di crenatura.

Ingresso e uscita

Per semplicità, devi solo gestire la crenatura di due glifi. I tuoi input sono due array 2D rettangolari, in uno dei seguenti formati:

  • Matrici 2D di numeri interi, con 0 che sta per .e 1 per #.
  • Stringhe multilinea .#.
  • Matrici di stringhe sopra .#.
  • Matrici 2D dei personaggi .#.

Se gli input sono considerati come una singola stringa, è possibile utilizzare qualsiasi delimitatore ragionevole. Tuttavia, il delimitatore dovrebbe passare tra i due array, il che significa che non è consentito prendere i due input già accoppiati riga per riga.

L'output è il risultato del processo di crenatura applicato a questi due array, che è un array 2D rettangolare nello stesso formato degli input. È consentito aggiungere o rimuovere un numero qualsiasi di colonne iniziali o finali di .s, ma l'output deve essere rettangolare e avere la stessa altezza degli input. È garantito che il processo di crenatura termina prima che il bordo sinistro del secondo input scivoli sul bordo sinistro del primo input.

Regole e punteggio

Vince il conteggio dei byte più basso in ciascun linguaggio di programmazione. Si applicano le regole standard del .

Casi test

Per facilitare il copia-incolla, questi casi di test vengono forniti come elenchi di stringhe.

["#"] ["#"] -> ["#.#"]
["#.","..",".#"] ["##","..","##"] -> ["#..##",".....",".#.##"]
["..#","#..","#.."] ["...","..#","###"] -> ["..#..","#...#","#.###"]
["###.","##..","#...","...."] ["....","...#","..#.",".#.."] -> ["###..","##..#","#..#.","..#.."]
["..##...","#......","#......"] [".....##",".....##",".#...#."] -> ["..##..##","#.....##","#.#...#."]
["...#.",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["...#..",".....#",".#....","......","....#."]
["..#..",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["..#..","....#","#....",".....","....#"]
["######","#.....","#.....","#.....","######"] ["......",".....#",".#...#",".....#","......"] -> ["######..","#......#","#..#...#","#......#","######.."]
["######","#.....","#.....","#.....","######"] ["......","......",".#....","......","......"] -> ["######","#.....","#.#...","#.....","######"]
["#...#","#..#.","#.#..","##...","#.#..","#..#.","#...#"] ["...#.","..#..",".#...",".#...",".#...","..#..","...#."] -> ["#...#..#","#..#..#.","#.#..#..","##...#..","#.#..#..","#..#..#.","#...#..#"]
code-golf  grid  code-challenge  atomic-code-golf  code-golf  combinatorics  probability-theory  card-games  code-golf  number  geometry  code-golf  decision-problem  chess  code-golf  math  number  sequence  code-golf  string  regular-expression  code-golf  arithmetic  integer  code-golf  math  array-manipulation  code-golf  number  decision-problem  integer  code-golf  string  ascii-art  kolmogorov-complexity  code-golf  decision-problem  graph-theory  binary-matrix  code-golf  string  parsing  code-golf  string  code-golf  morse  code-golf  code-golf  string  code-golf  ascii-art  cellular-automata  code-golf  binary  base-conversion  code-golf  arithmetic  decision-problem  integer  checksum  code-golf  matrix  linear-algebra  code-golf  code-golf  game  code-golf  sequence  binary  code-golf  combinatorics  optimization  code-golf  decision-problem  quine  code-golf  rational-numbers  bitwise  code-golf  string  permutations  code-golf  kolmogorov-complexity  unicode  code-golf  ascii-art  number  code-golf  number  integer  binary  base-conversion  code-golf  array-manipulation  code-golf  chemistry  code-golf  number  sequence  fibonacci  code-golf  matrix  optimization  code-golf  number  code-golf  math  number  sequence  code-golf  math  array-manipulation  matrix  linear-algebra  code-golf  kolmogorov-complexity  cops-and-robbers  cops-and-robbers  code-golf  tips  basic  code-golf  decision-problem  binary  tiling  game  king-of-the-hill  python  code-golf  c  code-golf  ascii-art  code-golf  string  kolmogorov-complexity  alphabet  code-golf  number  code-golf  string  code-golf  number  sequence  integer  code-golf  number  permutations  restricted-complexity  restricted-time 

Visualizer . Il caso di test 5 sembra essere sbagliato.
user202729

@ user202729 Grazie, ora è stato risolto. Ho affrontato diversi round di riparazione dei casi di test nella sandbox e apparentemente mi mancava quello.
Zgarb,

Inoltre, se i due personaggi "si incrociano" tra loro, cosa dovrebbe fare il programma?
user202729

@ user202729 Puoi presumere che non accadrà. Vedi l'ultima frase della sezione "Input e output".
Zgarb,

Risposte:



2

Python 3 , 154 byte

lambda a,b,p=".":[c.rstrip(p)+d.lstrip(p).rjust(max(len((d+c).strip(p))for(c,d)in zip((a*3)[1:],b[:-1]+b+b[1:]))+1-len(c.rstrip(p)),p)for(c,d)in zip(a,b)]

Provalo online!


2

Retina , 223 byte

+`(.+)¶(¶(.+¶)*)(\W+(¶|$))
$2$1i$4
T`.`i`\.*i\.*
+`(¶(.)*#.*i.*¶(?<-2>.)*)i
$1@
+`(¶(.)*)i(.*¶(?<-2>.)*(?(2)(?!))#.*i)
$1@$3
T`i@`.`i*[#@]+i
mT`.`i`\.+i+$
msT`i`.`.*^\W+$.*
+`(\b(i+)\W+\2i*)i
$1.
+s`\bi((i+).+\b\2\b)
.$1
i

Provalo online! Il collegamento include casi di test più script di intestazione per riformattarli nel formato di input preferito di due stringhe delimitate da nuova riga. Questo sembra eccessivamente lungo, ma probabilmente c'è un caso limite che ho trascurato, ma almeno ora supera tutti i casi di test. Spiegazione:

+`(.+)¶(¶(.+¶)*)(\W+(¶|$))
$2$1i$4

Unire i due array di input insieme usando una lettera icome separatore. (Questo consente l'uso di \We in \bseguito.)

T`.`i`\.*i\.*

Cambia tutte le .s in is al join.

+`(¶(.)*#.*i.*¶(?<-2>.)*)i
$1@

Cambia tutte le is sotto le #s in @s.

+`(¶(.)*)i(.*¶(?<-2>.)*(?(2)(?!))#.*i)
$1@$3

Modificare tutte le is sopra #s a @s.

T`i@`.`i*[#@]+i

Cambia tutte le @s in .s, più tutte le is adiacenti a @s o #s.

mT`.`i`\.+i+$

Se non c'è nessun #dopo i, quindi cambiare di nuovo l'adiacente di .nuovo in un i.

msT`i`.`.*^\W+$.*

Se c'è una linea senza is, cambia tutte le is in .s, poiché qui non c'è nulla da fare.

+`(\b(i+)\W+\2i*)i
$1.

Calcola il numero minimo di is su qualsiasi riga.

+s`\bi((i+).+\b\2\b)
.$1

Propagare sulle altre linee.

i

Elimina la is, eseguendo così la crenatura richiesta.

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.