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!

falla
fuente
¿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>

Lanudo
fuente
¿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!

Erik el Outgolfer
fuente
Ṣṙ-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
6

Japt , 3 bytes

n é

Pruébalo

Ordena ( n) la matriz y la rota ( é) un elemento a la derecha.

Lanudo
fuente
5

Python 3 , 31 bytes

lambda a:sorted(a)[1:]+[min(a)]

Pruébalo en línea!

-1 byte gracias a xnor

Hiperneutrino
fuente
... ¿Cómo no vi esta lógica básica? >.>
totalmente humano
@totallyhuman lol las 3 de mis respuestas hacen exactamente lo mismo. pero ja: P También
fusioné
Sí, me di cuenta y eliminé mi rama. : P
totalmente humano
Poner el minal final ahorra un byte.
xnor
5

APL, 9 bytes

{1⌽⍵[⍋⍵]}

Pruébalo en línea!

¿Cómo?

⍵[⍋⍵] - ordenar la lista

1⌽ - rotar por 1

Uriel
fuente
También funciona en GNU y ngn!
Zacharý
@ Zacharý supongo que eliminaré el dyalog ...
Uriel
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
pizzapants184
fuente
5

Pyth , 7 5 4 bytes

.P1S

Pruébalo en línea!

-1 byte gracias a FryAmTheEggman

No hay nadie aquí
fuente
Puede guardar un byte utilizando permutaciones: pyth.herokuapp.com/…
FryAmTheEggman
@FryAmTheEggman gracias, lo actualizaré cuando llegue a una computadora.
NoOneIsHere
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
Kevin Cruijssen
fuente
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.

typedrat
fuente
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

Perl 6 ,  43  19 bytes

{first {![<=]($_)&&![>=] $_},.permutations}

Intentalo

*.sort[1..*,0].flat

Intentalo

Tenga en cuenta que [1..*,0]daría como resultado ((2,3),1), por .flatlo que hay que convertirlo en(2,3,1)

Brad Gilbert b2gills
fuente
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
LyricLy
fuente
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])
rturnbull
fuente
c(sort(x<-scan())[-1],min(x))es de 29 bytes usando esencialmente la misma idea que la tuya.
Giuseppe
1

Ohm , 2 bytes

S╜

Pruébalo en línea!

Creo que esto es lo suficientemente diferente de la publicación totalmente humana para publicar una nueva respuesta; Espero que no te importe : P EDITAR : MALDITA NINJA'D ME

Hiperneutrino
fuente
Ninja'd you. ;)
totalmente humano
1

Python, 31 bytes

def f(a):a[1:]=a[a.sort():0:-1]

Otra solución más de Python.

Lamentablemente, este tiene la misma longitud que la respuesta de HyperNeutrino .

tsh
fuente
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

PunPun1000
fuente
1

Ruby, 18 bytes

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

->a{a.sort.rotate}
dkudriavtsev
fuente
1

Pyth, 5 bytes

.>SQ1

Explicación

SQ - ordenar lista de entrada

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

Karan Elangovan
fuente
1

Protón , 19 bytes

a=>sorted(a)[1to,0]

Pruébalo en línea!

-2 bytes indirectamente gracias a xnor

Todavía no estoy trabajando en TIO; esperando un tirón

Hiperneutrino
fuente
1

Python 3 , 28 bytes

lambda a:a[1:a.sort()]+a[:1]

Pruébalo en línea!

a.sort()se ordena aen su lugar y vuelve None. Nonepuede usarse como un índice de segmentación y es lo mismo que omitir ese índice.

Gato de negocios
fuente
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"].

Titus
fuente
¿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

Lyndon White
fuente