Introducción
Suponga que desea calcular los máximos de cola de una lista de números, es decir, el máximo de cada sufijo no vacío. Una forma de hacerlo es elegir repetidamente un número y reemplazarlo por un número más alto que ocurra después, hasta que esto ya no sea posible. En este desafío, su tarea es realizar un paso de este algoritmo.
La tarea
Su entrada es una lista de enteros L , que pueden estar vacíos. Su salida será la lista L donde exactamente un número L i ha sido reemplazado por otro L j , donde L i <L j e i <j .
En otras palabras, deberá reemplazar un número con un número mayor que ocurra después.
Puedes elegir i y j libremente entre todos los pares válidos, y la elección puede ser no determinista.
Si tales i y j no existen (es decir, L no aumenta), su salida será L sin cambios.
Ejemplo
Considere la entrada L = [3, 1, 4, -1, 2] . Las posibles operaciones son reemplazar 3 por 4 , reemplazar 1 por 4 , reemplazar 1 por 2 o reemplazar -1 por 2 . Por lo tanto, las salidas posibles son:
[ 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)]
Si repite la operación suficientes veces, el resultado final será [4,4,4,2,2] , que es precisamente la lista de máximos de cola de L .
Reglas y puntaje
Puede escribir un programa completo o una función. En el último caso, puede modificar la entrada en su lugar en lugar de devolver una nueva matriz, si su idioma lo permite. Los formatos de entrada y salida son flexibles dentro de lo razonable.
El conteo de bytes más bajo gana.
Casos de prueba
Se muestran todas las salidas posibles.
[] -> []
[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]
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) deberían funcionar.Mathematica, 37 bytes
Función pura tomando incluso una lista de números reales y devolviendo una lista de números reales. Busca el primer par de entradas consecutivas en el orden "incorrecto" y reemplaza el primero de ese par con el segundo. El buen comportamiento predeterminado de
/.
significa que devuelve la entrada sin alterar cuando sea apropiado.Nota al margen divertida: si reemplazamos
b<c
con!OrderedQ[{c,b}]
, entonces la función funciona en cadenas (y realmente cualquier tipo de datos una vez que se describe el orden apropiado). Por ejemplo,#/.{a___,b_,c_,d___}/;!OrderedQ[{c,b}]:>{a,c,c,d}&
en la entrada{"programming", "puzzles", "code", "golf"}
devuelve{"puzzles", "puzzles", "code", "golf"}
.fuente
Sort[FromCharacterCode /@ Range[32, 127]]
. Se vuelve extraño una vez que tienes cadenas con varias palabras, porque luego ignora los espacios y esas cosas.JavaScript (ES6),
433938 bytesSalidas modificando la matriz en el lugar. Editar: Guardado 4 bytes gracias a @ETHproductions. Guardado 1 byte gracias a @ user81655.
fuente
a=>a[i=0,a.findIndex(e=>e<a[++i])]=a[i]
por 39.a=>a.map((_,b)=>Math.max(...a.slice(b)))
findIndex
consome
(38 bytes):a=>a[i=0,a.some(e=>e<a[++i])*i-1]=a[i]
Haskell , 36 bytes
Pruébalo en línea!
Mire a través de la lista elementos consecutivos
a,b
cona<b
y cámbielos ab,b
.Mejorado de 37 bytes:
fuente
f(a:r@(b:_))=max(b:r)(a:f r)
funciona y es dos bytes más corto.f r >= r
.Jalea ,
1311 bytesReemplaza el más a la derecha de todos los números posibles.
Pruébalo en línea!
Cómo funciona
fuente
MATL , 15 bytes
Pruébalo en línea!
No soy un gran admirador de esta solución. Me parece terriblemente ineficiente. Particularmente las secciones
whY>d*
y0h+
.fuente
Python 2,
13913493 bytesTerriblemente largo, pero es un primer intento.
-5 bytes gracias a TemporalWolf
-41 (!!) bytes gracias a Value Ink
fuente
[1,2]
da en[2,1]
lugar de[2,2]
print
y usar una\t
pestaña en lugar de espacio adicional para el bucle interno. Además, puede colocar el 0exit()
para obtener uno adicional. Debería llevarte a 132.if a[i]<a[j]:a[i]=a[j];print a;exit()
Es aún más corto. Diablos, es mejor hacerlofor j in a[i+1:]:\n\tif a[i]<j:a[i]=j;print a;exit()
MATL , 13 bytes
Pruébalo en línea!
Explicación
Las siguientes dos condiciones son equivalentes:
El código usa la condición 2, que es más simple. Calcula incrementos consecutivos y encuentra el último positivo, si lo hay. Para las dos entradas involucradas, escribe el valor de la segunda entrada en la primera.
Este truco se usa para manejar el caso cuando no se puede realizar ninguna sustitución. Tenga en cuenta también que la indexación MATL está
1
basada en.Usemos la entrada
[3,1,4,-1,2]
como ejemplo.fuente
Haskell ,
3433 bytesEsto se basa en la respuesta de xnor , quien sugirió que lo publicara yo mismo.
EDITAR: xnor encontró un byte para guardar.
Pruébalo en línea!
Básicamente, observé que la ramificación del método de xnor siempre termina eligiendo la expresión de rama más grande, ya que Haskell usa el orden lexicográfico para las listas. (El caso cuando
a==b
también funciona porquef r>=r
, que se puede probar por separado por inducción).Dicho de otra manera, siempre que sea
b:r > a:f r
, entoncesb:r
es una respuesta correcta, y de lo contrario podemos recurrir aa:f r
.Entonces, en lugar de verificar
a<b
por adelantado, solo calculo ambas expresiones y tomo el máximo. Esto podría dar una explosión exponencial, aunque la pereza de Haskell evita que a menos quea
yb
son iguales.fuente
max(b:r)$a:f r
guarda un byte.Python 3, 79 bytes
Muta la matriz original (lista) que se le ha dado. No estoy contento de que esto no sea una lambda y estoy seguro de que hay mejores optimizaciones; Espero abordarlos más tarde.
Breve explicacion
Lleva el máximo de la matriz más allá del elemento actual (comenzando con el cero). Luego compara esto con el elemento en sí: si el máximo es mayor, reemplace el elemento actual con él y pare, de lo contrario, incremente en uno y siga intentándolo.
fuente
Ruby,
6661 bytesPruébalo en línea!
fuente
C, 47 bytes
Implementación recursiva que toma como entrada un puntero al primer elemento de una matriz y la longitud de la matriz. Modifica la matriz en su lugar.
fuente
SWI-Prolog, 70 bytes
La primera cláusula reemplaza el primer elemento de la lista con el valor máximo del resto de la lista, pero solo si este máximo es mayor. La segunda cláusula recurrentemente llama al predicado para el final de la lista. Si ninguna de estas cláusulas tiene éxito, la tercera cláusula simplemente devuelve la entrada.
Este retorno solo es una de las posibles soluciones. Es trivial encontrarlos a todos con un código muy similar, pero el caso en que no es posible cambiar requiere muchos más bytes.
Ejemplo:
fuente
R, 71 bytes
fuente
C, 80 bytes
Llamar con:
fuente
Python 2, 89 bytes
Pruébelo en línea -1 byte gracias a @TemporalWolf
-25 bytes gracias a @ValueInk
-7 bytes gracias a @Cole
Función que muta la matriz de entrada
Si no hubiera necesidad de detenerse después de la primera iteración, sería un poco más bonito
fuente
[1, 3, 5, 7]
; vuelve[3, 3, 5, 7]
.A[i]<y and
=>y>A[i]and
guarda 1r=[y for y in A[i+1:]if y>A[i]]\n if r:A[i]=r[0];break
bajar su puntaje a 96!input()
.Python 2, 60 bytes
Pruébalo en línea!
Explicación: Verifica recursivamente si un elemento dado es menor que el
max
elemento en el resto de la lista. Si es así, devuelve la lista con lamax
sustitución del primer elemento.fuente
TI-Basic, 72 bytes
Explicación:
fuente
sh, 118 bytes
Los enteros de entrada se pasan como argumentos al script.
Descompostura:
fuente
PHP, 88 bytes
Descompostura
fuente
Haskell, 48 bytes
Ejemplo de uso:
f [1,1,2,1]
->[2,1,2,1]
.Pruébalo en línea!.Si la lista de entrada tiene al menos un elemento, enlace
b
al primer elemento yl
al resto de la lista. Sil
no está vacío y esb
inferior al máximo del
, devuelve el máximo seguido del
, de lo contrario, devuelveb
seguido de una llamada recursiva def l
. Si la lista de entrada está vacía, devuélvala.fuente
Raqueta 202 bytes
Sin golf:
Pruebas:
Salida:
fuente
C, 67 bytes
Ejecución única, 67 bytes en vivo
Paso único, 78 bytes en vivo
Cola máxima, 96 bytes en vivo
fuente
Python 3 ,
103102bytesPruébalo en línea!
fuente