Inspirado por este post sobre Puzzling. Spoilers para esse quebra-cabeça estão abaixo.
Dado três números inteiros positivos como entrada, (x, y, z)
construa o intervalo inclusivo [x, y]
, concatene esse intervalo e remova z
dígitos não necessariamente consecutivos para produzir o maior e o menor número inteiro positivo possível. Zeros à esquerda não são permitidos (ou seja, os números devem começar com [1-9]
). Saída esses dois números em qualquer ordem.
Para o exemplo do post Puzzling, para entrada (1, 100, 100)
, o maior número possível é 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
,
e o menor número é 10000012340616263646566676869707172737475767778798081828384858687888990919293949596979899100
,
seguindo a lógica abaixo da resposta da jafe publicada lá:
- Não podemos influenciar o comprimento do número (há um número fixo de dígitos); portanto, para maximizar o valor, usamos o primeiro dígito máximo, depois o segundo dígito etc.
- Remova os 84 primeiros não-noves (16 dígitos restantes para remover):
999995051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- O maior número dentro dos próximos 17 dígitos é 7, portanto, a partir daqui, o próximo dígito na resposta pode ter no máximo 7 (não podemos remover mais de 16 dígitos). Portanto, remova 15 não-7's ... (1 dígito para remover):
999997585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- A partir daqui, o próximo dígito pode ter no máximo 8, então remova um não-8 do meio:
99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- Lógica semelhante, mas invertida (ou seja, queremos líderes
1
s em vez de líderes9
s) para o menor número.
Aqui está um exemplo menor: (1, 10, 5)
.
Construímos o intervalo 12345678910
e determinamos quais 5
dígitos podemos remover, deixando o maior número possível. Obviamente, isso significa que queremos maximizar o dígito inicial, pois não podemos influenciar o comprimento da saída. Então, se removermos 12345
, ficamos com 678910
, e é o maior que podemos fazer. Tornar o menor é um pouco mais complicado, pois podemos extrair números do meio, deixando 123410
o menor possível.
Pois (20, 25, 11)
, o resultado é bastante chato, como 5
e 1
.
Finalmente, descartar respostas que tentam zeros à esquerda, (9, 11, 3)
fornece as 91011
que, por sua vez, produzem 91
e 10
são as maiores e as menores.
E / S e regras
- Se for mais fácil / mais curto, você pode codificar dois programas / funções - um para o maior e outro para o menor -, nesse caso, sua pontuação é a soma das duas partes.
- A entrada e saída podem ser fornecidas por qualquer método conveniente .
- Pode-se presumir que a entrada se encaixa no tipo de número nativo do seu idioma, no entanto , nem o número concatenado nem a saída podem ser assumidos para isso.
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
fonte
9, 11, 3
que valeria a pena .Respostas:
Haskell , 162 bytes
Experimente online!
Usa o algoritmo descrito por jafe. Pode ser mais curto para usar um método menos eficiente, mas isso foi mais divertido de escrever :)
A
%
operação recebe 4 argumentos (na verdade 3, mas o que for):m
qual é uma função que seleciona o membro "ideal" de uma lista (maximum
ouminimum
dependendo do que queremos);f
que é uma função de "filtro";n
o número de dígitos restantes para serem descartados; es
a corda. Primeiro, verificamos se n é igual ao número de dígitos restantes na string (usei>=
por segurança) e eliminamos o restantes
. Caso contrário, verificamos se ainda precisamos soltar dígitos (n>0
) e, em seguida,span
dividimos nossa string em três partes:p
os dígitos a serem soltos,c
o dígito alcançável ideal er
a sequência restante. Fazemos isso passando um predicado que verifica a igualdade em relação ao nosso dígito ideal. Para encontrar esse dígito, pegamos os primeirosn+1
dígitos da string, filtramos e passamos para nossa função "seletor". Agora, apenas produzimos nosso dígito ideal e recorremos, subtraindo o comprimento dep
(o número de dígitos descartados) den
. Observe que não passamos nossa função de filtragem para a chamada recursiva e, em vez disso, a substituímos porid
. Isso ocorre porque o filtro existe apenas para evitar a seleção de 0s iniciais nominimum
caso, o que é relevante apenas na primeira iteração. Depois disso, não precisamos mais de nenhum filtro.%
é realmente apenas uma função auxiliar para#
que é nossa função "real", tendox
,y
ez
. Usamos uma compreensão de lista apenas para evitar um pouco de repetição, repetindo as tuplas de função e passando-as para%
junto comz
a string concatenada. Essa string é criada usando o operador magic monad(=<<)
que, nesse contexto, funciona comoconcatMap
.fonte
Gelatina , 17 bytes
Experimente online!
Calcula todas as possibilidades e mantém a maior e a menor.
Argumento
x,y
à esquerda: para construir o intervalo. Argumento correto:z
dígitos a serem removidos.fonte
Python 2 , 143 bytes
Experimente online!
Isso funciona calculando todas as combinações do tamanho do destino (a ordem dos elementos é preservada) e obtendo os menores / maiores números
fonte
Carvão , 56 bytes ou 21 +
4635 =6756 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Insira
x
ey
, crie um intervalo inclusivo e junte os números em uma sequência.Faça um loop uma vez para cada dígito a ser removido.
Crie uma lista de cadeias formadas removendo cada caractere possível da cadeia atual e use o máximo.
Imprima o resultado.
Experimente online! Link é a versão detalhada do código. Explicação:
Insira
x
ey
, crie um intervalo inclusivo e junte os números em uma sequência.Insira
z
e aumente. Em seguida, crio uma lista com esse comprimento: preciso incrementarz
o filtro a seguir, mas apenas os comandos têm permissão para incrementar variáveis; existe uma brecha quePushOperator
aumenta o comprimento da lista.Filtre os caracteres desejados, verificando se não há caracteres inferiores na região cortável. A região começa com os primeiros
z+1
caracteres (já que é possível dividir os primeirosz
, se necessário) e o ponto final é incrementado para cada caractere mantido. É tomado cuidado para não escolher um zero para o primeiro caractere.O algoritmo mais rápido tem 30 bytes quando usado para calcular o maior número possível:
Experimente online! Link é a versão detalhada do código. Edit: desde então, consegui combinar os dois acima em uma segunda solução de 56 bytes, que gera os dois resultados:
Experimente online! Link é a versão detalhada do código. Explicação:
Gere a sequência inicial.
Representar
z+1
como o comprimento da lista.Inverta a lista, clonando-a e salve o resultado.
Imprima os dois resultados em linhas separadas. (Outra maneira de fazer isso é separar os resultados com um
\r
caractere literal .)Gere o maior número possível.
Gere o menor número possível usando a lista clonada para acompanhar
z
.fonte
Geléia ,
1918 bytesExperimente online!
1, 100, 100
fonte
05AB1E , 16 bytes
Experimente online!
Programa completo, lendo as entradas nesta ordem: y, x, z . Produz uma lista de duas listas de caracteres.
Explicação
fonte
Ć`‚
é muito inteligente, boa resposta!Matlab, 95 bytes
Experimente Online!
Retorna uma matriz 1x2 com min e max.
Como funciona
fonte