Introdução
Vamos observar o seguinte quadrado, consistindo apenas nos dígitos 0 - 9
:
1034
4167
8414
3542
A concha externa deste quadrado é:
1034
4 7
8 4
3542
Ele contém zeros, então precisamos descascar a casca externa, deixando:
16
41
A concha externa deste quadrado é:
16
41
Ele não contém zeros e, portanto, é um quadrado não contaminado . Então, basicamente, a definição de um quadrado não contaminado é quando a casca externa do quadrado não contém zeros.
A tarefa
Dado um quadrado de dígitos (contendo apenas números inteiros não negativos) em qualquer formato razoável, produza o maior quadrado não contaminado , descascando constantemente a casca externa, em qualquer formato razoável.
Casos de teste
Caso de teste 1:
Input Output
1234 1234
2345 2345
3456 3456
4567 4567
Caso de teste 2:
Input Output
123 123
204 204
346 346
Caso de teste 3:
Input Output
101 1
010
101
Caso de teste 4:
Input Output
000 (none)
000
000
Isso é código-golfe , então a submissão com a menor quantidade de bytes ganha!
416\n841\n354\n
(canto inferior esquerdo)?0
ou algo parecido.Respostas:
Geléia ,
1916 bytesExperimente online! ou verifique todos os casos de teste .
Como funciona
fonte
JavaScript,
10597 bytesEconomizei 8 bytes graças a @Patrick Roberts!
Define a função
s
, que retorna uma matriz 2D de números inteiros quando fornecida uma matriz 2D de números inteiros como entrada.Como funciona
função
l
: dada uma matriza
, retorna uma cópia sem o primeiro e o último índice.função
p
: dada uma matriz 2Da
, chamal
para remover a primeira e a última linha e, em cada linha restante, chamal
para remover o punho e a última coluna. Isso realiza o descascamento da cebola.function
c
: dada uma matriz 2Da
, retorna uma string que contém apenas os0
s na forma stringified dea
.function
s
: dado um array 2Da
, chamac
a forma descascada do array fornecida porp
e no próprio array. Compara essas seqüências lexicograficamente para determinar se a forma descascada tem menos0
s que o original. Caso isso aconteça, o original está contaminado, portanto chames
recursivamente o formulário descascado. Caso contrário, devolva o original.fonte
a.length
doend
argumento dearray.slice
inl
e salvar 8 bytes.end
é permitido ser um índice negativo.Retina ,
6057 bytesA contagem de bytes assume a codificação ISO 8859-1. O avanço de linha à direita é significativo.
Experimente online!
Explicação
Devido ao avanço de linha à direita, ele encontra todas as correspondências da regex após a
`
e as remove da entrada. Devido à liderança,+
isso é feito repetidamente até que a saída pare de mudar (o que ocorre porque o regex deixará de corresponder).Quanto ao próprio regex, ele consiste em duas partes:
Esta parte verifica se há algum
0
lugar no shell externo. Isso é feito movendo o "cursor" do mecanismo de expressão regular para o início da string com um lookback (usamos[^_]
para combinar os dígitos e os feeds de linha):E, a partir dessa posição, usamos um lookahead para encontrar um
0
na primeira linha, adjacente a um avanço de linha ou na última linha:A correspondência real consistirá na primeira linha (incluindo seu avanço de linha à direita), na última linha (incluindo seu avanço de linha inicial) ou no primeiro ou no último caractere de uma linha, onde abusamos do limite da palavra
\b
como início / fim da linha âncora:fonte
MATL ,
2621 bytesA entrada está no seguinte formato
Portanto, os outros quatro casos de teste são
O programa falha no último caso de teste, mas produz a saída correta (que não é nada). Obrigado a @Dennis por perceber!
Experimente online! . Ou verifique todos os casos de teste (isso inclui o código de quebra).
Explicação
Isso itera tantas vezes quanto o número de colunas na matriz de entrada, o que é mais que suficiente. A cada iteração, o shell é removido ou mantido dependendo de seus valores.
fonte
Pitão, 19 bytes
Suíte de teste
fonte
JavaScript (ES6), 74 bytes
Recebe entrada na forma de uma seqüência de caracteres com novas linhas separando cada linha (mas nenhuma nova linha inicial ou posterior). Explicação:
/^.*0|0\n|\n0|0.*$/
é uma regexp que corresponde a quadrados contaminados, enquanto/^.*\n?|.(.*).|\n.*$/
corresponde àquelas partes do quadrado que precisam ser excluídas, exceto a(.*)
que precisa ser mantida. (Isso é mais curto do que olhar para frente ou para trás para o caractere de nova linha.)fonte
Perl 5, 63 + 3 = 66 bytes
Requer a
-0
bandeira. A entrada não deve conter um caractere de nova linha à direita.fonte
Pyke, 29 bytes
Experimente aqui!
Também 29 bytes
Experimente aqui!
fonte
Pitão ,
3130 bytesSuíte de teste. (Os últimos erros do testcase)
Melhoria: fez do extrator de loop externo uma função (
L+hbeb
).Versão anterior de 31 bytes:
Como funciona:
O código é basicamente: enquanto o produto do escudo externo é zero, retire-o.
Vamos analisar o código principal (Q está implícito aqui):
Comece em
Q
(entrada),while
primeiro lambda, execute o segundo lambda.A primeira parte seria o lambda em
H
:A segunda parte seria a lambda em
Z
:A primeira parte
Vamos analisar isso:
Como Pyth usa notação de prefixo , isso seria avaliado:
A segunda parte
fonte
Mathematica, 78 bytes
Função anônima, recebe entrada como uma matriz. Ignore quaisquer erros que possam resultar durante a execução.
fonte