Uma lista de números é chamada de aumento monotônico (ou não decrescente), pois todo elemento é maior ou igual ao elemento anterior.
Por exemplo, 1, 1, 2, 4, 5, 5, 5, 8, 10, 11, 14, 14
está aumentando monotonicamente.
Dada uma lista monotonicamente crescente de números inteiros positivos que possui um número arbitrário de pontos vazios indicado por ?
, preencha os pontos vazios com números inteiros positivos, de modo que o maior número possível de números únicos possíveis esteja presente na lista, mas ele continua aumentando monotonicamente.
Pode haver várias maneiras de conseguir isso. Qualquer um é válido.
Saída da lista resultante.
Por exemplo , se a entrada for
?, 1, ?, 1, 2, ?, 4, 5, 5, 5, ?, ?, ?, ?, 8, 10, 11, ?, 14, 14, ?, ?
é garantido que, sem os espaços vazios, a lista aumentará monotonicamente
1, 1, 2, 4, 5, 5, 5, 8, 10, 11, 14, 14
e sua tarefa é atribuir números inteiros positivos a cada um
?
para maximizar o número de números inteiros distintos na lista, mantendo-os não decrescentes.Uma tarefa que não é válida é
1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 8, 10, 11, 14, 14, 14, 14, 14
porque, embora não diminua, ele possui apenas mais um número inteiro exclusivo que a entrada, a saber
3
.Neste exemplo, é possível inserir seis números inteiros positivos exclusivos e manter a lista não decrescente.
Algumas maneiras possíveis são:1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 6, 7, 8, 8, 8, 10, 11, 12, 14, 14, 15, 16 1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 5, 6, 6, 7, 8, 10, 11, 13, 14, 14, 20, 200
Qualquer um desses (e muitos outros) seria uma saída válida.
Todos os lugares vazios devem ser preenchidos.
Não há limite superior para números inteiros que podem ser inseridos. Tudo bem se números inteiros muito grandes forem impressos em notação científica.
Zero não é um número inteiro positivo e nunca deve ser inserido.
No lugar de ?
que você pode usar qualquer valor consistente, que não é um número inteiro positivo, como 0
, -1
, null
, False
, ou ""
.
O código mais curto em bytes vence.
Mais exemplos
[input]
[one possible output] (a "*" means it is the only possible output)
2, 4, 10
2, 4, 10 *
1, ?, 3
1, 2, 3 *
1, ?, 4
1, 2, 4
{empty list}
{empty list} *
8
8 *
?
42
?, ?, ?
271, 828, 1729
?, 1
1, 1 *
?, 2
1, 2 *
?, 3
1, 3
45, ?
45, 314159265359
1, ?, ?, ?, 1
1, 1, 1, 1, 1 *
3, ?, ?, ?, ?, 30
3, 7, 10, 23, 29, 30
1, ?, 2, ?, 3, ?, 4
1, 1, 2, 3, 3, 3, 4
1, ?, 3, ?, 5, ?, 7
1, 2, 3, 4, 5, 6, 7 *
1, ?, 3, ?, 5, ?, ?, 7
1, 2, 3, 4, 5, 6, 7, 7
1, ?, ?, ?, ?, 2, ?, ?, ?, ?, 4, ?, 4, ?, ?, 6
1, 1, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 6
98, ?, ?, ?, 102, ?, 104
98, 99, 100, 101, 102, 103, 104 *
fonte
Respostas:
Haskell , 41 bytes
f
pega uma lista e retorna uma lista, com 0 representando?
s.Basicamente, a primeira lista de varredura da esquerda, substituindo 0s por um a mais que o elemento anterior (ou 0 no início); em seguida, digitalize da direita, reduzindo elementos muito grandes para igualar à direita.
Experimente online! (com invólucro para converter
?
s.)fonte
Mathematica, 84 bytes
Função pura, tendo uma lista como argumento, onde os pontos vazios são denotados por
Null
(como em{1, Null, Null, 2, Null}
) ou excluídos por completo (como em{1, , , 2, }
) e retornando uma lista adequada (neste caso{1, 2, 2, 2, 3}
).Acontece que estou usando o mesmo algoritmo da resposta Haskell de Ørjan Johansen : primeiro substitua cada
Null
um por um a mais que o número à esquerda (//.{a___,b_,,c___}:>{a,b,b+1,c}
), depois substitua qualquer número muito grande pelo número à direita (//.{a___,b_,c_,d___}/;b>c:>{a,c,c,d}
). Para lidar com possíveisNull
s no início da lista, começamos adicionando a0
({0,##}&@@#
), executando o algoritmo e excluindo a inicial0
(Rest
).Sim, eu escolhi em
Null
vez deX
ou algo assim para salvar literalmente um byte no código (aquele que seria entre as vírgulas deb_,,c___
).fonte
?, 2
. Eu suspeito que você produziria em2, 2
vez do correto1, 2
.C 160
Isso nunca vai ganhar, mas:
Ele pega a lista nos argumentos da linha de comando.
fonte
05AB1E ,
312313 bytesEconomizou 10 bytes graças ao Grimy
Experimente online!
Explicação
fonte
}}
podem ser]
para salvar 2 bytes; eõ-)R
pode ser)˜R
para salvar um byte adicional.Pip ,
252321 bytesRecebe entrada como vários argumentos de linha de comando separados por espaço. Emite a lista de resultados um número por linha. Experimente online! (Eu falsifiquei a coisa de vários argumentos da linha de comando, porque seria difícil adicionar 25 argumentos no TIO, mas funciona como anunciado também.)
Explicação
Prosseguimos em dois passes. Primeiro, substituímos todas as execuções de
?
s na entrada por uma sequência iniciando no número anterior da lista e aumentando em um a cada vez:Então passamos novamente; para cada número, imprimimos o mínimo e todos os números à direita. Isso reduz os números altos demais para manter a monotonicidade.
fonte
Python 2 com NumPy, 163 bytes
Guardado 8 bytes graças a @wythagoras
Zeros usados para marcar pontos vazios
Mais legível com comentários:
fonte
if l[a]>l[b]:l[a]=l[b]
pode serl[a]=min(l[a],l[b])
e, em seguida, pode estar na linha antes disso. Além disso, isso significa que toda a linha pode ser colocada após owhile
. E pensol=input()
el=[1]+l
posso serl=[1]+input()
(Além disso, em geral: se você usar dois níveis de indentação, poderá usar um espaço e uma guia em vez de um espaço e dois espaços no Python 2 (consulte codegolf.stackexchange.com/a/58 ) )len(z)-i:f(z[i-1],z[i]);i+=1
iniciar com i = 1.PHP,
9577716968 bytesrecebe entrada de argumentos da linha de comando, imprime lista separada por espaço. Corra com
-nr
.demolir
$n
é verdadeiro para qualquer string, exceto a string vazia e"0"
.$n>0
é verdade para números positivos - e cadeias que os contêm.fonte
Perl 6 , 97 bytes
A entrada é uma lista de valores ou uma sequência separada por espaço, onde
?
é usada para substituir os valores a serem substituídos.Saída é uma cadeia separada por espaço com um espaço à direita.
Tente
Expandido:
fonte
$"
vez de' '
raspar um byte. Isso funciona aqui?$!
. ($/
Existe mas é usado para$1
→$/[1]
e$<a>
→$/{ qw< a > }
)JavaScript (ES6), 65 bytes
Porque eu queria usar
reduceRight
. Explicação: Omap
substitui cada valor falso por um a mais que o valor anterior e, em seguida,reduceRight
trabalha de volta a partir do final, garantindo que nenhum valor exceda o valor a seguir.fonte
Q, 63 bytes
{1_(|){if[y>min x;y-:1];x,y}/[(|){if[y=0;y:1+-1#x];x,y}/[0,x]]}
Essencialmente, o mesmo algoritmo da resposta Haskell de Ørjan Johansen .
O uso de min vs last foi usado para salvar um byte, pois pode assumir que o último elemento será o elemento min, de acordo com o tipo decrescente da matriz.
fonte
TI-Basic (TI-84 Plus CE), 81 bytes
Um simples porto de Haskell de Ørjan Johansen responde à TI-Basic. Usa 0 como valor nulo. Recebe entrada de L 1 .
Explicação:
fonte
Java 8,
199164 bytesModifica a matriz de entrada em vez de retornar uma nova para salvar bytes.
Usa em
0
vez de?
.Experimente online.
Explicação:
fonte
Python 2 ,
144124119 bytesExperimente online!
Usa em
0
vez de?
fonte
b=filter(abs,l[n:])
igual ab=l[n:]
?JavaScript (ES6), 59
Uma função com uma matriz inteira como entrada. Os pontos vazios são marcados com
0
Teste
fonte
C # (.NET Core) , 182 bytes
Usando a mesma estratégia que Ørjan Johansen.
Usa 0 na lista de entrada para marcar a var desconhecida.
Experimente online!
fonte
Perl 5
-p
, 99 bytesExperimente online!
fonte