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, 4096
corresponde 4**6
e 4*9*
mas 4114
també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.
?
deve ser escolhido pelo respondente.25
uma 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"}
?Respostas:
05AB1E , 22 bytes
Provavelmente, há muito espaço para melhorias aqui.
Qualquer não dígito é aceito como curinga.
Experimente online!
Explicação a seguir após mais golfe.
fonte
Mathematica, 44 bytes
A entrada é uma lista de dígitos com um
_
(sem aspas) como curinga. por exemplo{4, _, _, 6}
Explicação
Gerar lista
{1, 2, 3, ... , 1000}
Quadrado. (lista de todos os quadrados de 1 a 1.000.000)
Divida cada quadrado em uma lista de dígitos.
Encontre os que correspondem ao padrão especificado pela entrada.
Imprima-os.
fonte
Braquilog , 23 bytes
Experimente online!
Explicação
Formato de entrada diferente, 13 bytes
Dependendo do que você considera válido como entrada, você pode fazer o seguinte:
Experimente online!
que é basicamente a segunda parte da resposta acima, com uma lista como entrada contendo dígitos e variáveis onde estão os caracteres curinga.
Eu não considero isso válido, porque existem apenas 26 nomes de variáveis no Brachylog (letras maiúsculas), portanto isso não funcionaria se você tivesse mais de 26 wilcards.
fonte
true.
), mas eu não usei idiomas que exigem isso antes. Vou tentar encontrar alguma referência para determinar como devo pontuar isso, mas faria sentido pontuar como 23, então continuarei assim.Perl 6 ,
3026 bytesObrigado a @ b2gills por -4 bytes!
Usa o ponto como caractere curinga, para que a entrada possa ser usada como um regex:
Experimente online .
Uma variante que aceita o asterisco como curinga (conforme sugerido por uma revisão anterior da descrição da tarefa) seria de 42 bytes:
fonte
{ ... }("9*9***")
) ou atribuí-lo a uma variável / símbolo para uso posterior. Observe que o Perl 6 é um idioma separado do Perl, portanto, não funcionará com um intérprete do Perl.sudo apt-get install rakudo
ter um suposto intérprete Perl6 ... Quando colocoperl6
como comando no meu terminal, ele inicia o que parece ser um intérprete Perl6, mas não sei como usá-lo. Eu sei que é um lambda, mas não sei como chamá-lo.perl6 foo.p6
. Você também pode testá-lo em um oneliner shell, comoperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
Ruby, 54 bytes
Função que recebe um argumento de cadeia. Experimente online.
fonte
#
está fazendo um comentário ao restante da linha.Lote, 109 bytes
Usa
?
como curinga. Funciona criando 1000 arquivos. O nome do arquivo é o número do quadrado e a extensão do arquivo é o número do quadrado com um$
sufixo. Isso ocorre porque a correspondência de padrões do Lote conta à direita de?
s como opcional, portanto1?
corresponderá a ambos1
e16
; o$
que força a partida a ser exata. No entanto, não queremos$
produzir o arquivo, apenas produzimos o nome do arquivo apenas sem extensão.fonte
JavaScript (ES6),
6866 bytesEDIT: Atualizei minha solução abaixo depois de me inspirar na resposta de JungHwan Min . Agora é compatível com ES6.
Recebe a entrada no formato em
'1..4'
que.
está o curinga.Em vez de iterar para 1e6 e o enraizamento quadrado, este itera para 1e3 e quadrados.
Mostrar snippet de código
JavaScript (ES7),
7169 bytesCria uma matriz de números de 0 a 1e6 e depois a filtra por números que são quadrados e correspondem ao padrão.
É terrivelmente lento porque sempre interage com 1e6.
Mostrar snippet de código
fonte
**
está funcionando, porque está me dando um"SyntaxError: expected expression, got '*'"
.1e6
...**
operador não existe, pelo menos não no meu sistema.**
. Sim, é ES7 Eu irei atualizar o título aqui está uma lista de navegadores suportados atualmente developer.mozilla.org/en/docs/Web/JavaScript/Reference/...Perl,
424538 bytesEDIT: esclarecimento por Alex, podemos usar o período como caractere curinga que corta a operação y //.
EDIT: solução que usa o asterisco como caractere curinga e espera a sequência curinga em STDIN
Este deixa, sem dúvida, muito espaço para melhorias, é bem direto. A expressão curinga é esperada como argumento de linha de comando, com o caractere curinga de período (o que mais?).
fonte
Python
3-9897 bytesRequer entrada como '4..6'.
fonte
import re
ere.findall
; a otimização com ofrom...import *
realmente não a otimiza nesse caso.1....
, ele fornece1 4 9
e16 25
como respostas válidas, o que não está correto. Corrija seu programa.1......
. Ele retorna[]
, mas deve dar[1000000]
. Isso pode ser corrigido a um custo de 0 bytes usando emrange(0, 1001)
vez derange(0, 1000)
.k - 28 caracteres
Usa
?
como o caractere curinga. Alike
função usa?
como curinga e faz uma lista dos primeiros 1001 quadrados (incluindo 1M), converte todos eles em seqüências de caracteres e depois verifica onde eles correspondem ao padrão.fonte
type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":"
. Você poderia fornecer um link para um conjunto de testes em funcionamento ou verificar se há algum problema?utilitários bash + Unix, 33 bytes
Isso usa '.' como o caractere curinga.
O programa dc imprime os números quadrados em um loop infinito:
A saída dc é canalizada para grep, que imprime apenas os quadrados que correspondem ao padrão necessário.
Isso funciona quando eu o executo em um sistema Linux ou OS X real (mas não funciona no TIO, provavelmente porque o programa dc tenta se recuperar para sempre, e eu suspeito que o TIO fique sem espaço de pilha para a recursão e / ou um problema com o tubo sem fim).
fonte
dc
comando interminável .--line-buffered
de ambos os lados^$1$
, mas não funciona de qualquer maneira.sed s/./0/g<<<$1
| grep ^ $ 1 $ Isso usa o comprimento do padrão para limitar os números que estão sendo testados (padrões de 4 caracteres verificam apenas até 9999, etc.). Aqui está um link do TIO: tio.run/nexus/…grep
. No entanto, como atualmente não é a solução mais curta, vou mantê-lo em 33 bytes para pontuação. Parece funcionar para todas as entradas, bom trabalho!