Levanta un solo número

25

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]
Zgarb
fuente

Respuestas:

9

JavaScript (ES6), 41 40 39 38 bytes

Guardado un byte gracias a @Neil, otro gracias a @ user81655

x=>x.map(c=>c<x[++i]>d?x[d=i]:c,d=i=0)

Justo cuando parece reduceRightque finalmente podría tener una oportunidad, .mapaparece una vez más ...

ETHproducciones
fuente
x=>x.map(c=>c<x[++i]&!d?x[d=i]:c,d=i=0)?
Neil
Los condicionales se evalúan de izquierda a derecha, lo que significa que x=>x.map(c=>c<x[++i]>d?x[d=i]:c,d=i=0)(38 bytes) deberían funcionar.
user81655
@ user81655 Eso es increíble :-)
ETHproductions
7

Mathematica, 37 bytes

#/.{a___,b_,c_,d___}/;b<c:>{a,c,c,d}&

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<ccon !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"}.

Greg Martin
fuente
Una advertencia para la nota al margen: el ordenamiento canónico de las cadenas de Mathematica es extraño.
Martin Ender
¿Cómo es así, Martin Ender?
Greg Martin
Solo inténtalo 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.
Martin Ender
6

JavaScript (ES6), 43 39 38 bytes

a=>a[a.some(e=>e<a[++i],i=0)*i-1]=a[i]

Salidas modificando la matriz en el lugar. Editar: Guardado 4 bytes gracias a @ETHproductions. Guardado 1 byte gracias a @ user81655.

Neil
fuente
Creo que puedes hacerlo a=>a[i=0,a.findIndex(e=>e<a[++i])]=a[i]por 39.
ETHproductions
Otro enfoque para 40B:a=>a.map((_,b)=>Math.max(...a.slice(b)))
Luke
@Luke, creo que estás malinterpretando el desafío; el punto es hacer que uno de los enteros en la matriz sea más grande.
ETHproductions
@ETHproductions Gracias por devolver el favor, ¡ahora los honores son parejos!
Neil
Creo que puede reemplazarlo findIndexcon some(38 bytes):a=>a[i=0,a.some(e=>e<a[++i])*i-1]=a[i]
user81655
5

Haskell , 36 bytes

f(a:r@(b:_))|a<b=b:r|1>0=a:f r
f e=e

Pruébalo en línea!

Mire a través de la lista elementos consecutivos a,bcon a<by cámbielos a b,b.

Mejorado de 37 bytes:

f(a:b:t)|a<b=b:b:t
f(a:t)=a:f t
f e=e
xnor
fuente
Creo que f(a:r@(b:_))=max(b:r)(a:f r)funciona y es dos bytes más corto.
Ørjan Johansen
@ ØrjanJohansen ¡Es un método hermoso! Creo que deberías publicarlo como tu propia respuesta. Al principio no estaba seguro de que manejaría los lazos correctamente, pero ahora veo que funciona porque sí f r >= r.
xnor
Gracias, ya lo hice !
Ørjan Johansen
4

Jalea , 13 11 bytes

ṫJṀ€ż¹ŒpQ-ị

Reemplaza el más a la derecha de todos los números posibles.

Pruébalo en línea!

Cómo funciona

ṫJṀ€ż¹ŒpQ-ị  Main link. Argument: A (array)

 J           Yield all indices of A, i.e., the array [1, ..., len(A)].
ṫ            Dyadic tail; for index k, take all elements starting with the k-th.
             This constructs the array of suffixes.
  Ṁ€         Maximum each; map the monadic maximum atom over the suffixes.
     ¹       Identity; yield A.
    ż        Zip; construct all pairs of elements of the result to the left and the
             corresponding elements of the result to the right.
      Œp     Cartesian product. Construct all arrays that, for each index, take
             either the left or the right element.
        Q    Unique; deduplicate the resulting arrays.
         -ị  At-index -1; select the second to last result.
             The last result is A itself, the first maxima of suffixes.
Dennis
fuente
3

MATL , 15 bytes

tdt0>0whY>d*0h+

Pruébalo en línea!

No soy un gran admirador de esta solución. Me parece terriblemente ineficiente. Particularmente las secciones whY>d*y 0h+.

DJMcMayhem
fuente
3

Python 2, 139 134 93 bytes

a=input()
for i in range(len(a)):
 for j in a[i+1:]:
    if a[i]<j:a[i]=j;print a;exit()
print a

Terriblemente largo, pero es un primer intento.

-5 bytes gracias a TemporalWolf
-41 (!!) bytes gracias a Value Ink

Hiperneutrino
fuente
[1,2]da en [2,1]lugar de[2,2]
TemporalWolf
1
@TemporalWolf Sí, leí mal el desafío. Sin bytes guardados o perdidos, se solucionará.
HyperNeutrino
Puede eliminar el retorno antes de su interior printy usar una \tpestaña en lugar de espacio adicional para el bucle interno. Además, puede colocar el 0 exit()para obtener uno adicional. Debería llevarte a 132.
TemporalWolf
@TemporalWolf Ok, gracias!
HyperNeutrino
1
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()
Value Ink
3

MATL , 13 bytes

ttd0>fX>Q)2M(

Pruébalo en línea!

Explicación

Las siguientes dos condiciones son equivalentes:

  1. Hay un número que tiene un número más alto a su derecha
  2. Hay un número que tiene un número más alto inmediatamente a su derecha

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á 1basada en.

Usemos la entrada [3,1,4,-1,2]como ejemplo.

tt    % Get input implicitly and duplicate it twice
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], [3,1,4,-1,2]
d     % Consecutive differences
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], [-2  3 -5  3]
0>    % Are they positive?
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], [0 1 0 1]
f     % Find indices of all positive differences. Result may be empty
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], [2 4]
X>    % Maximum index with a positive difference. Empty input remains as empty
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], 4
Q     % Add 1. Since the addition is elementwise, empty input remains as empty
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], 5
)     % Get the entry of the input at that position
      % STACK: [3,1,4,-1,2], 2
2M    % Push maximum index with a positive difference, again
      % STACK: [3,1,4,-1,2], 2, 4
(     % Assign to that position. Implicitly display
      % STACK: [3,1,4,2,2]
Luis Mendo
fuente
3

Haskell , 34 33 bytes

Esto se basa en la respuesta de xnor , quien sugirió que lo publicara yo mismo.

EDITAR: xnor encontró un byte para guardar.

f(a:r@(b:_))=max(b:r)$a:f r
f e=e

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==btambién funciona porque f r>=r, que se puede probar por separado por inducción).

Dicho de otra manera, siempre que sea b:r > a:f r, entonces b:res una respuesta correcta, y de lo contrario podemos recurrir aa:f r .

Entonces, en lugar de verificar a<bpor 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 que ay bson iguales.

Ørjan Johansen
fuente
1
Parece que max(b:r)$a:f rguarda un byte.
xnor
2

Python 3, 79 bytes

def f(x):
 for i,a in enumerate(x):
  m=max(x[i+1:])
  if m>a:x[i]=m;break

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.

col
fuente
2

C, 47 bytes

f(p,n)int*p;{n>1?*p<p[1]?*p=p[1]:f(p+1,n-1):0;}

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.

hvd
fuente
El código devuelto parece no válido ideone.com/83HJqN
Khaled.K
@ Khaled.K Muestra la salida "3 4 4 -1 2", que es una de las salidas permitidas en la pregunta. ¿Qué crees que está mal con eso?
hvd
Ya veo, la pregunta no está clara sobre eso, sin embargo
Khaled.K
2

SWI-Prolog, 70 bytes

f([H|T],[S|T]):-max_list(T,S),S>H,!.
f([H|T],[H|R]):-f(T,R),!.
f(I,I).

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:

?- f([-1,4,0,4,7,2,3], O).
O = [7, 4, 0, 4, 7, 2, 3]
Steven
fuente
1

R, 71 bytes

a=scan()
l=length(a) 
lapply(1:l,function(x){
  a[x]=max(a[x:l])
  a
})
Chris
fuente
1

C, 80 bytes

i,j;f(l,n)int*l;{for(i=0;i<n;++i)for(j=i;++j<n;)if(l[i]<l[j]){l[i]=l[j];j=i=n;}}

Llamar con:

int main()
{
    int a[5]={3,1,4,-1,2};
    f(a,5);
    for(int k=0;k<5;++k)
        printf("%d ", a[k]);
}
Steadybox
fuente
1

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

def F(A):
 for i in range(len(A)):
    r=[y for y in A[i+1:]if y>A[i]]
    if r:A[i]=r[0];break

Si no hubiera necesidad de detenerse después de la primera iteración, sería un poco más bonito

Zarigüeya muerta
fuente
Esto parece no funcionar. Prueba [1, 3, 5, 7]; vuelve [3, 3, 5, 7].
HyperNeutrino
1
A[i]<y and=> y>A[i]andguarda 1
TemporalWolf
@HyperNeutrino Si entiendo bien la tarea, es válida outut
Dead Possum
1
¡Considere r=[y for y in A[i+1:]if y>A[i]]\n if r:A[i]=r[0];breakbajar su puntaje a 96!
Value Ink
1
¿Puedo sugerir lo que sugerí para una de las otras respuestas de Python: convertir lo que tiene a una función que muta la matriz original para que pueda evitar la impresión y input().
cole
1

Python 2, 60 bytes

f=lambda x:x and[x[:1]+f(x[1:]),[max(x)]+x[1:]][x[0]<max(x)]

Pruébalo en línea!

Explicación: Verifica recursivamente si un elemento dado es menor que el maxelemento en el resto de la lista. Si es así, devuelve la lista con la maxsustitución del primer elemento.

adicto a las matemáticas
fuente
1

TI-Basic, 72 bytes

Prompt L1
If 2≤dim(L1
Then
For(A,1,dim(L1)-1
For(B,A,dim(L1
If L1(A)<L1(B
Then
L1(B→L1(A
Goto E
End
End
End
End
Lbl E
L1

Explicación:

Prompt L1          # 4 bytes, input list
If 2≤dim(L1        # 7 bytes, if the list has 2 or 1 element(s), skip this part and return it
Then               # 2 bytes
For(A,1,dim(L1)-1  # 12 bytes, for each element in the list other than the last
For(B,A,dim(L1     # 9 bytes, for each element after that one
If L1(A)<L1(B      # 12 bytes, if the second is larger than the first
Then               # 2 bytes
L1(B→L1(A          # 10 bytes, replace the first with the second
Goto E             # 3 bytes, and exit
End                # 2 bytes
End                # 2 bytes
End                # 2 bytes
End                # 2 bytes
Lbl E              # 3 bytes
L1                 # 2 bytes, implicitly return L1
pizzapants184
fuente
1

sh, 118 bytes

Los enteros de entrada se pasan como argumentos al script.

l=("$@");for i in "$@";{ for j in "$@";{(($i<$j))&&{ l[$x]=$j;echo ${l[@]};exit;};};shift;x=`expr $x+1`;};echo ${l[@]}

Descompostura:

l=("$@");                      #copy original list
for i in "$@";{ for j in "$@"; #check all elements j that follow element i in list
{(($i<$j))&&{ l[$x]=$j;echo ${l[@]};exit;};};   #if i<j, make i=j; print list, done
shift;                         #makes sure that i is compared only to j that occur after it
x=`expr $x+1`;};               #keeps track of i'th position in the list
echo ${l[@]}                   #prints list if it was unchanged
Maxim Mikhaylov
fuente
0

PHP, 88 bytes

<?for(;$i+1<$c=count($a=$_GET)&&$a[+$i]>=$a[++$i];);$i>=$c?:$a[$i-1]=$a[$i];print_r($a);

Descompostura

for(;
$i+1<($c=count($a=$_GET))  # first condition end loop if the item before the last is reach 
&&$a[+$i]>=$a[++$i] # second condition end loop if item is greater then before 
;);
$i>=$c?:$a[$i-1]=$a[$i]; # replace if a greater item is found
print_r($a); #Output
Jörg Hülsermann
fuente
0

Haskell, 48 bytes

f(b:l)|l>[],m<-maximum l,b<m=m:l|1<2=b:f l
f x=x

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 bal primer elemento y lal resto de la lista. Si lno está vacío y es binferior al máximo de l, devuelve el máximo seguido de l, de lo contrario, devuelve bseguido de una llamada recursiva de f l. Si la lista de entrada está vacía, devuélvala.

nimi
fuente
0

Raqueta 202 bytes

(let((g(λ(L i n)(for/list((c(in-naturals))(l L))(if(= c i)n l))))(ol'()))
(for((c(in-naturals))(i L))(for((d(in-range c(length L)))#:when(>(list-ref L d)i))
(set! ol(cons(g L c(list-ref L d))ol))))ol)

Sin golf:

(define (f L)
  (let ((replace (λ (L i n)   ; sub-function to replace i-th item in list L with n;
                   (for/list ((c (in-naturals))
                              (l L))
                     (if (= c i) n l))))
        (ol '()))             ; outlist initially empty; 
    (for ((c (in-naturals))               ; for each item in list
          (i L))
      (for ((d (in-range c (length L)))   ; check each subsequent item in list
            #:when (> (list-ref L d) i))  ; if greater, replace it in list
        (set! ol (cons (replace L c (list-ref L d)) ol)))) ; and add to outlist.
    ol))          ; return outlist.

Pruebas:

(f '(3 1 4 -1 2))

Salida:

'((3 1 4 2 2) (3 2 4 -1 2) (3 4 4 -1 2) (4 1 4 -1 2))
rnso
fuente
0

C, 67 bytes

Ejecución única, 67 bytes en vivo

j;f(l,i)int*l;{j=i-1;while(i-->0)while(j-->0)l[j]=fmax(l[i],l[j]);}

Paso único, 78 bytes en vivo

j;f(l,i)int*l;{j=i-1;while(i-->0)while(j-->0)if(l[j]<l[i]){l[j]=l[i];return;}}

Cola máxima, 96 bytes en vivo

x;i;j;f(l,n)int*l;{do{x=0;for(i=0;i<n;i++)for(j=0;j<i;j++)if(l[j]<l[i])l[j]=l[i],x=1;}while(x);}
Khaled.K
fuente