Clasificación confiablemente rota


23

Dada una lista de enteros positivos que contiene al menos 3 entradas distintas, genera una permutación de esa lista que no está ordenada en orden ascendente o descendente.

Ejemplos

1,2,3 -> 2,1,3 or 3,1,2 or 1,3,2 or 2,3,1
1,2,3,3 -> 2,1,3,3 or 3,1,2,3 or 1,3,2,3 etc..

¡Gracias @Arnauld y @NoOneIsHere por el título!


¿La entrada siempre se ordenará?
xnor

¿Debe ser "confiable" el tipo dado que dado un conjunto dado de entradas, siempre produce la misma permutación que la salida? ¿O solo debe ser "confiable" porque la salida no está ordenada?
Comodín el

Solo debe satisfacer las especificaciones.
flawr

¿Se permitiría una matriz anidada como salida? por ejemplo, [2,[1,3]].
Shaggy

No, debe ser una sola matriz / lista.
flawr

Respuestas:


14

JavaScript (ES6), 39 34 bytes

a=>[a.sort((x,y)=>x-y).pop(),...a]

Ordene la matriz en orden ascendente, haga estallar el último elemento y úselo como el primer elemento de una nueva matriz. Luego desestructurar los elementos restantes de la matriz original en la nueva matriz (en JS, ambos sorty popmodificar la matriz original).


Pruébalo

o.innerText=(f=

a=>[a.sort((x,y)=>x-y).pop(),...a]

)(i.value=[1,2,3]);oninput=_=>o.innerText=f(i.value.split`,`)
<input id=i><pre id=o>


¿Por qué no puedes simplemente hacer a.sort()?
geokavel

1
@geokavel: Porque el sortmétodo de JS ordena lexicográficamente.
Shaggy

3
¿Entonces porque ya no está confiablemente roto? = D
jpmc26


7

Jalea , 3 bytes

Ṣṙ1

Pruébalo en línea!


Ṣṙ-también funciona (solo tenía ganas de decir eso; probablemente sabías: P)
HyperNeutrino

@HyperNeutrino Sí, eso también funciona, mismo bytecount: p
Erik the Outgolfer

¿En qué codificación hay Ṣṙ1solo tres bytes? En UTF-8, son 7 bytes.
heinrich5991

2
@ heinrich5991 Jelly usa una página de códigos personalizada .
cole

Siento que todos los que usan Jelly deben tener una extensión de navegador que agrega un botón para publicar automáticamente el comentario "Jelly usa una página de códigos personalizada".
12Me21





5

TI-Basic (TI-84 Plus CE), 31 bytes

Prompt A
SortA(LA
max(LA→B
dim(LA)-1→dim(LA
augment({B},LA

Solicita entrada en el formato {1,2,3,4}.

TI-Basic es un lenguaje tokenizado , todos los tokens utilizados aquí son de un byte.

Explicación:

Prompt A         # 3 bytes, store user input in LA
SortA(LA         # 4 bytes, sort LA ascending
max(LA→B         # 6 bytes, save the last value in the sorted list to B
dim(LA)-1→dim(LA # 11 bytes, remove the last value from LA
augment({B},LA   # 7 bytes, prepend B to LA and implicitly print the result





3

Java 8, 68 37 bytes

l->{l.sort(null);l.add(l.remove(0));}

-31 bytes gracias a @Nevay (olvidé que Java 8 tenía un List#sort(Comparator)método ...)

Modifica la entrada ArrayList, en lugar de devolver una nueva.

Explicación:

Pruébalo aquí

l->{                   // Method with ArrayList parameter and no return-type
  l.sort(null);        //  Sort the input-list (no need for a Comparator, thus null)
  l.add(l.remove(0));  //  Remove the first element, and add it last
}                      // End of method

Puede usar l->{l.sort(null);java.util.Collections.rotate(l,1);}para guardar 16 bytes.
Nevay

2
Alternativamente, puede usar l->{l.sort(null);l.add(l.remove(0));}para guardar 31 bytes (requiere el uso de una lista de tamaño no fijo).
Nevay

@Nevay agradable, pero ... los paréntesis están un poco apagados con respecto a la documentación: la realidad es que las operaciones opcionales addy removedeben implementarse; nada se dice sobre la lista de tamaño fijo ... Kevin Cruijssen, dado que hay alternativas mucho mejores en los comentarios anteriores, esperaré una edición antes de + 1ing.
Olivier Grégoire

3

Haskell, 36 37 bytes

import Data.List
f(a:b)=b++[a];f.sort

Utilice los patrones de vista para que coincidan en el encabezado de una versión ordenada de la lista de entrada, luego agregue el primer elemento de la lista al final de la lista restante.

Los patrones de vista no valen la pena. Ordena la lista, quita la cabeza y agrégala hasta el final. En este caso, resulta que la solución ingenua tipificada de forma compacta es la mejor.


1
Bienvenido a PPCG! Gran idea para usar patrones de vista, no los conocía antes. Desafortunadamente, no están habilitados en Haskell estándar, por lo tanto, según las reglas del sitio, debe incluir los bytes para el indicador de línea de comando -XViewPatterns. Contarlos de la manera estándar f(a:b)=b++[a];f.sortes más corto.
Laikoni

De alguna manera no estaba pensando en la bandera necesaria. Supongo que los uso tanto que olvidé que lo enciendo en mis archivos Cabal y que no es parte del lenguaje.
typedrat



2

Ly , 7 bytes

&nasprl

Pruébalo en línea!

¡Uf, arruinar el tipo es tan caro!

Explicación:

&nasprl

&n      # take input as a list of numbers
  a     # sort
   sp   # save top of stack and pop
     r  # reverse stack
      l # load saved item

2

R, 33 32 29 bytes

Toma información de stdin. Ordena la lista y luego mueve el primer elemento hasta el final, asegurando que ya no esté ordenado. Guardado tres bytes debido a Giuseppe.

c(sort(x<-scan())[-1],min(x))

Otra implementación, el mismo número de bytes:

c((x<-sort(scan()))[-1],x[1])

c(sort(x<-scan())[-1],min(x))es de 29 bytes usando esencialmente la misma idea que la tuya.
Giuseppe




1

Retina , 10 bytes

O#`
O^#-2`

Pruébalo en línea!

O#`     Sort the list
O^#-2`  Reverse sort the list other than the last element

Esto deja la lista con el segundo elemento más alto primero y el elemento más alto último que nunca se ordena correctamente


1

Ruby, 18 bytes

Enviado en el móvil. Por favor no me mates por problemas.

->a{a.sort.rotate}

1

Pyth, 5 bytes

.>SQ1

Explicación

SQ - ordenar lista de entrada

.>SQ1 - rotar la lista de entrada cíclicamente por 1






1

PHP, 44 bytes

requiere PHP 5.4 o posterior para la sintaxis de matriz corta.

sort($a=&$argv);print_r([array_pop($a)]+$a);

ordenar argumentos, reemplazar el argumento 0 con el último argumento eliminado, imprimir.
Ejecutar -nro probarlo en línea .


El argumento 0 es el nombre del archivo de script, "-"si llama a PHP con -r. "-"se compara con los otros argumentos como una cadena, y desde entonces ord("-")==45, es más pequeño que cualquier número. Los números mismos, aunque son cadenas, se comparan como números:"12" > "2" .

php -nr '<code>' 3 4 2 5 1y sort($a=&$argv)conducen a $a=["-","1","2","3","4","5"]
[array_pop($a)]+$aes [0=>"5"]+[0=>"-",1=>"1",2=>"2",3=>"3",4=>"4"], lo
que resulta en [0=>"5",1=>"1",2=>"2",3=>"3",4=>"4"].


¿Puede explicar por qué [array_pop ($ a)] + $ a no sobrescribe el índice 0 de $ a? Por ejemplo: $ a = [1,2,3,4,5], array_pop ($ a) = 5, $ a = [1,2,3,4]. Si haces [5] + [1,2,3,4], ¿no debería terminar siendo [5,2,3,4] porque ambas matrices tienen un índice 0? Estoy confundido porque el manual de PHP dice "El operador + devuelve la matriz de la derecha adjunta a la matriz de la izquierda; para las claves que existen en ambas matrices, se utilizarán los elementos de la matriz de la izquierda y la coincidencia los elementos de la matriz de la derecha se ignorarán ".
jstnthms

@jstnthms El +operador no agrega , se fusiona (sin reordenar los índices; pero eso no importa aquí). El punto importante es que $aseñala $argvy $argv[0]contiene el nombre del archivo del script, los argumentos comienzan en el índice 1. Extendí la descripción. Gracias por la pregunta
Titus

1

Julia, 23 bytes

f(x)=sort(x)[[2:end;1]]

Ligeramente más corto que, pero equivalente a f(x)=circshift(sort(x),1). Desearía poder hacer un método basado en selecteso que fuera más compacto, pero no puedo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.