Encontre o maior número de dígito N em uma grade de dígitos W por H


25

Escreva um programa ou função que obtenha um número inteiro positivo N e uma grade de dígitos decimais (0 a 9) com largura W e altura H (que também são números inteiros positivos). Você pode assumir que N será menor ou igual ao maior de W e H.

Imprima ou retorne o maior número contíguo de N dígitos que aparece horizontal ou verticalmente na grade, gravado na ordem de leitura normal ou no sentido inverso.

  • Linhas diagonais de dígitos não são consideradas.
  • A grade não contorna, ou seja, não possui condições de contorno periódicas.

Por exemplo, a grade 3 × 3

928
313
049

teria 9como saída para N = 1, 94como saída para N = 2 e 940como saída para N = 3.

A grade 4 × 3

7423
1531
6810

teria 8como saída para N = 1, 86para N = 2, 854para N = 3 e 7423para N = 4.

A grade 3 × 3

000
010
000

teria saída 1para N = 1 e 10para N = 2 e N = 3 ( 010também é válido para N = 3).

A grade 1 × 1

0

teria saída 0para N = 1.

Você pode receber a entrada em qualquer formato razoável e conveniente. por exemplo, a grade pode ser uma sequência de dígitos separados por nova linha, ou uma matriz multidimensional, ou uma lista de listas de dígitos, etc. Os zeros à esquerda são permitidos na saída se eles fizerem parte da grade.

Isso é , então o código mais curto em bytes vence, mas também atribuirei pontos de brownie (ou seja, mais prováveis ​​de upvotes) por respostas que possam mostrar que seu algoritmo é computacionalmente eficiente.


1
É permitido imprimir zeros à esquerda?
PurkkaKoodari

@ Pietu1998 "Zeros à esquerda são permitidos na saída se eles fizerem parte da grade."
Calvin's Hobbies

Respostas:


0

Pitão, 22 19 bytes

3 bytes graças a Jakube.

seSs.:RQ.n,L_MdCB.z

Experimente online.

Se for permitido imprimir zeros à esquerda, o código será 18 bytes:

eSs.:RQ.n,L_MdCB.z

A conversão de uma string com zeros à esquerda em um número inteiro pode ser realizada com s.
Jakube 7/11

9

CJam, 39 36 35 34 bytes

qN/)i\[{zW%_}4*]ff{_,@e<ew:i}e_:e>

Rapidamente, antes de @Dennis acordar: P

Experimente online .

Explicação

O algoritmo básico é fazer todas as quatro rotações da grade e dividir cada linha em pedaços de comprimento N(ou o comprimento da linha, o que for menor). Em seguida, converta os pedaços em ints e pegue o maior.

qN/             Split input by newlines, giving an array of lines
)i\             Drop N from the array and put at bottom
[        ]      Wrap in array...
 {    }4*         Perform 4 times...
  zW%_              Rotate grid anticlockwise and push a copy
                Note that this gives an array of 5 grids [CCW1 CCW2 CCW3 CCW4 CCW4]
ff{         }   For each grid row, mapping with N as an extra parameter...
   _,             Push length of row
     @e<          Take min with N
        ew        Split into chunks
          :i      Convert to ints
e_              Flatten that array
:e>             Take cumulative max

Por curiosidade, faz fewalgo de especial ou são três comandos separados?
ETHproductions

3
@ETHproductions Na verdade, é o operador ewaplicado usando f, ou "mapear com parâmetro extra". Por exemplo, ["abcd" "efgh"] 2 fewresulta em [["ab" "bc" "cd"] ["ef" "fg" "gh"]].
Sp3000 6/11/15

Entendi :) Mas é uma coincidência interessante.
ETHproductions

O único problema é que, quando @Dennis acorda, todo mundo perde de qualquer maneira. ;)
kirbyfan64sos

-2

Burlesque

Ainda não é uma resposta final, mas provavelmente funcionará assim:

blsq ) "7423\n1531\n6810"ln)XXJ)\[jtp)\[_+J)<-_+{3.+ti}m[>]
854
blsq ) "7423\n1531\n6810"ln)XXJ)\[jtp)\[_+J)<-_+{4.+ti}m[>]
7423

Como N e a grade são dados exatamente?


Normalmente, deve-se esperar para postar uma resposta até que funcione. Quaisquer perguntas para o OP devem ser feitas como comentários na publicação.
Alex A.

O código realmente funciona.
mroman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.