Isso foi inspirado em parte do problema da equipe # 6 da competição ARML de 2016.
Aqui está o desafio:
Você recebe uma "sequência curinga", que é uma sequência de dígitos e outro caractere. Uma sequência corresponde a essa sequência curinga pelo seguinte pseudocódigo:
w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]
Onde '?' é um personagem de sua escolha.
Em termos de regex, imagine o '?'que é '.'.
O desafio é encontrar todos os números quadrados (o requisito é de até 1 milhão) cujas representações de cadeias decimais correspondem a essa sequência curinga. O "caractere curinga" pode ser qualquer caractere ASCII de sua escolha, desde que não seja um dígito, obviamente.
Por exemplo, 4096corresponde 4**6e 4*9*mas 4114também não.
Entrada
A entrada será fornecida como uma sequência correspondente ao regex [0-9?]+. Pode ser uma cadeia de caracteres, uma matriz de caracteres ou uma matriz de bytes dos caracteres em ASCII.
Resultado
A saída será uma lista / conjunto / matriz de números delimitados pelo que você desejar, que são quadrados perfeitos e correspondem à sequência curinga.
Exemplos de entradas válidas:
1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]
Exemplos de saídas válidas:
[1, 4, 9]
1 4 9
1, 4, 9
1-4-9
etc.
Especificações
- Você não pode usar builtins para encontrar uma lista de quadrados em um determinado intervalo
- As brechas padrão se aplicam
- Você deve poder gerenciar até 1 000 000 (1 milhão)
- Se fornecido com a entrada
1******, é correto imprimir[1000000]. Também é correto imprimir[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...] - Sequências curinga nunca começarão com o caractere curinga; ou seja, eles sempre corresponderão a seqüências de caracteres do mesmo comprimento.
Casos de teste
4**6 -> [4096, 4356]
1**1 -> [1521, 1681]
1** -> [100, 121, 144, 169, 196]
9****9 -> [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9*** -> [919681, 929296]
1**0* -> [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4 -> [91204, 94864, 97344]
Ganhando
Submissão mais curta (válida) (de trabalho) até 14 de fevereiro, desempate entre as vitórias mais antigas.
25uma resposta válida é para, ***mas não para *2*?
{4, "w", "w", 6}(ou melhor ainda {4, w, w, 6}), em vez de uma matriz de caracteres, como {"4", "w", "w", "6"}?
?deve ser escolhido pelo respondente.