Introdução
Suponha que você queira calcular os máximos finais de uma lista de números, ou seja, o máximo de cada sufixo não vazio. Uma maneira de fazer isso é escolher repetidamente um número e substituí-lo por um número maior ocorrendo depois dele, até que isso não seja mais possível. Nesse desafio, sua tarefa é executar uma etapa deste algoritmo.
A tarefa
Sua entrada é uma lista de números inteiros L , que podem estar vazios. Sua saída será a lista L, onde exatamente um número L i foi substituído por outro L j , onde L i <L j e i <j .
Em outras palavras, você deve substituir um número por um número maior que ocorra após ele.
Você pode escolher i e j livremente entre todos os pares válidos, ea escolha pode ser não-determinístico.
Se tal i e j não existem (ou seja, L é não aumentar), sua saída será L inalterado.
Exemplo
Considere a entrada L = [3, 1, 4, -1, 2] . As operações possíveis são substituir 3 por 4 , substituir 1 por 4 , substituir 1 por 2 ou substituir -1 por 2 . Assim, as saídas possíveis são:
[ 3 , 1 , 4 , -1 , 2 ]
------------------------------
[( 4), 1 ,( 4), -1 , 2 ]
[ 3 ,( 4),( 4), -1 , 2 ]
[ 3 ,( 2), 4 , -1 ,( 2)]
[ 3 , 1 , 4 ,( 2),( 2)]
Se você repetir as vezes suficientes operação, o resultado final será [4,4,4,2,2] , que é precisamente a lista de maxima cauda de L .
Regras e pontuação
Você pode escrever um programa completo ou uma função. No último caso, você pode modificar a entrada no lugar em vez de retornar uma nova matriz, se o seu idioma permitir. Os formatos de entrada e saída são flexíveis dentro do motivo.
A menor contagem de bytes vence.
Casos de teste
Todas as saídas possíveis são mostradas.
[] -> []
[1] -> [1]
[1,2] -> [2,2]
[2,1] -> [2,1]
[4,4,4,4] -> [4,4,4,4]
[-1,-3,-10] -> [-1,-3,-10]
[1,3,10] -> [3,3,10] [10,3,10] [1,10,10]
[1,1,2,1] -> [2,1,2,1] [1,2,2,1]
[998,64,2,-94,-789] -> [998,64,2,-94,-789]
[998,2,64,-94,-789] -> [998,64,64,-94,-789]
[3,1,4,-1,2] -> [4,1,4,-1,2] [3,4,4,-1,2] [3,2,4,-1,2] [3,1,4,2,2]
[-1,4,0,4,7,2,3] -> [4,4,0,4,7,2,3] [0,4,0,4,7,2,3] [-1,4,4,4,7,2,3] [7,4,0,4,7,2,3] [-1,7,0,4,7,2,3] [-1,4,7,4,7,2,3] [-1,4,0,7,7,2,3] [2,4,0,4,7,2,3] [-1,4,2,4,7,2,3] [3,4,0,4,7,2,3] [-1,4,3,4,7,2,3] [-1,4,0,4,7,3,3]
[3542,-12311,7662,1672,6081] -> [7662,-12311,7662,1672,6081] [3542,7662,7662,1672,6081] [3542,1672,7662,1672,6081] [6081,-12311,7662,1672,6081] [3542,6081,7662,1672,6081] [3542,-12311,7662,6081,6081]
fonte
x=>x.map(c=>c<x[++i]&!d?x[d=i]:c,d=i=0)
?x=>x.map(c=>c<x[++i]>d?x[d=i]:c,d=i=0)
(38 bytes) deve funcionar.Mathematica, 37 bytes
Função pura obtendo uma lista de números reais pares e retornando uma lista de números reais. Procura o primeiro par de entradas consecutivas na ordem "errada" e substitui o primeiro desse par pelo segundo. Um bom comportamento padrão
/.
significa que ele retorna a entrada inalterada quando apropriado.Nota lateral divertida: se substituirmos
b<c
por!OrderedQ[{c,b}]
, então a função funcionará em strings (e realmente em qualquer tipo de dados depois que a ordem apropriada for descrita). Por exemplo,#/.{a___,b_,c_,d___}/;!OrderedQ[{c,b}]:>{a,c,c,d}&
nos{"programming", "puzzles", "code", "golf"}
retornos de entrada{"puzzles", "puzzles", "code", "golf"}
.fonte
Sort[FromCharacterCode /@ Range[32, 127]]
. Fica estranho quando você tem seqüências de caracteres com várias palavras, porque então ignora espaços e outras coisas.JavaScript (ES6),
433938 bytesSaídas modificando a matriz no local. Editar: salvou 4 bytes graças a @ETHproductions. Guardou 1 byte graças a @ user81655.
fonte
a=>a[i=0,a.findIndex(e=>e<a[++i])]=a[i]
a 39.a=>a.map((_,b)=>Math.max(...a.slice(b)))
findIndex
porsome
(38 bytes):a=>a[i=0,a.some(e=>e<a[++i])*i-1]=a[i]
Haskell , 36 bytes
Experimente online!
Procure na lista elementos consecutivos
a,b
coma<b
e altere-os parab,b
.Aprimorado de 37 bytes:
fonte
f(a:r@(b:_))=max(b:r)(a:f r)
funciona e é dois bytes mais curto.f r >= r
.Geléia ,
1311 bytesSubstitui o mais à direita de todos os números possíveis.
Experimente online!
Como funciona
fonte
MATL , 15 bytes
Experimente online!
Eu não sou um grande fã desta solução. Parece terrivelmente ineficiente para mim. Particularmente as seções
whY>d*
e0h+
.fonte
Python 2,
13913493 bytesTerrivelmente longo, mas é uma primeira tentativa.
-5 bytes graças ao TemporalWolf
-41 (!!) bytes graças ao Value Ink
fonte
[1,2]
dá em[2,1]
vez de[2,2]
print
e usar uma\t
guia em vez de espaço extra para o loop interno. Além disso, você pode colocar o 0 emexit()
um extra. Deve levá-lo para 132.if a[i]<a[j]:a[i]=a[j];print a;exit()
é ainda mais curto. Heck, é melhor fazerfor j in a[i+1:]:\n\tif a[i]<j:a[i]=j;print a;exit()
MATL , 13 bytes
Experimente online!
Explicação
As duas condições a seguir são equivalentes:
O código usa a condição 2, que é mais simples. Ele calcula incrementos consecutivos e encontra o último positivo, se houver. Para as duas entradas envolvidas, ele grava o valor da segunda entrada na primeira.
Esse truque é usado para lidar com o caso quando nenhuma substituição pode ser feita. Observe também que a indexação do MATL é
1
baseada.Vamos usar a entrada
[3,1,4,-1,2]
como um exemplo.fonte
Haskell ,
3433 bytesIsso é baseado na resposta de xnor , que sugeriu que eu a publicasse.
EDIT: xnor encontrou um byte para salvar.
Experimente online!
Basicamente, observei que a ramificação do método xnor sempre acaba escolhendo a expressão que for maior, já que Haskell usa ordenação lexicográfica para listas. (O caso
a==b
também funciona porquef r>=r
, o que pode ser provado separadamente por indução.)Dito de forma diferente, sempre que
b:r > a:f r
, então,b:r
é uma resposta correta, e do contrário podemos recorrera:f r
.Então, em vez de verificar
a<b
com antecedência, apenas calculo as duas expressões e tomo o máximo. Isso pode causar uma explosão exponencial, embora a preguiça de Haskell evite isso, a menos que sejaa
eb
seja igual.fonte
max(b:r)$a:f r
salva um byte.Python 3, 79 bytes
Muda a matriz original (lista) fornecida a ela. Estou infeliz por não ser um lambda e tenho certeza de que há melhores otimizações; Espero que eu resolva isso mais tarde.
Breve explicação
Leva o máximo da matriz além do elemento atual (começando com o zeroth). Ele então compara isso ao próprio elemento: se o máximo for maior, substitua o elemento atual por ele e pare, caso contrário, aumente por um e continue tentando.
fonte
Ruby,
6661 bytesExperimente online!
fonte
C, 47 bytes
Implementação recursiva, tendo como entrada um ponteiro para o primeiro elemento de uma matriz e o comprimento da matriz. Modifica a matriz no local.
fonte
SWI-Prolog, 70 bytes
A primeira cláusula substitui o primeiro elemento da lista pelo valor máximo do restante da lista, mas apenas se esse máximo for maior. A segunda cláusula chama recursivamente o predicado para o final da lista. Se nenhuma dessas cláusulas tiver êxito, a terceira cláusula simplesmente retorna a entrada.
Este retorno é apenas uma das soluções possíveis. É trivial encontrar todos eles com código muito semelhante, mas o caso em que nenhuma alteração é possível leva muito mais bytes para ser tratado.
Exemplo:
fonte
R, 71 bytes
fonte
C, 80 bytes
Ligue para:
fonte
Python 2, 89 bytes
Experimente online -1 byte graças a @TemporalWolf
-25 bytes graças a @ValueInk
-7 bytes graças a @Cole
Função que muda a matriz de entrada
Se não houvesse necessidade de parar após a primeira iteração, seria um pouco mais bonito
fonte
[1, 3, 5, 7]
; retorna[3, 3, 5, 7]
.A[i]<y and
=>y>A[i]and
salva 1r=[y for y in A[i+1:]if y>A[i]]\n if r:A[i]=r[0];break
diminuir sua pontuação para 96!input()
.Python 2, 60 bytes
Experimente Online!
Explicação: Verifica recursivamente se um determinado elemento é menor que o
max
elemento no restante da lista. Nesse caso, retorna a listamax
substituindo o primeiro elemento.fonte
TI-Básico, 72 bytes
Explicação:
fonte
sh, 118 bytes
Inteiros de entrada são passados como argumentos para o script.
Demolir:
fonte
PHP, 88 bytes
Demolir
fonte
Haskell, 48 bytes
Exemplo de uso:
f [1,1,2,1]
->[2,1,2,1]
. Experimente online! .Se a lista de entrada tiver pelo menos um elemento, vincule
b
- se ao primeiro elemento el
ao restante da lista. Sel
não estiver vazio eb
menor que o máximo del
, retorne o máximo seguido porl
, caso contrário, retorneb
seguido por uma chamada recursiva def l
. Se a lista de entrada estiver vazia, retorne-a.fonte
Raquete 202 bytes
Ungolfed:
Teste:
Saída:
fonte
C, 67 bytes
Execução única, 67 bytes ao vivo
Etapa única, 78 bytes ao vivo
Máximos de cauda, 96 bytes em tempo real
fonte
Python 3 ,
103102 bytesExperimente online!
fonte