Ordinamento rotto in modo affidabile


23

Dato un elenco di numeri interi positivi che contiene almeno 3 voci distinte, genera una permutazione di tale elenco che non è ordinata in ordine crescente o decrescente.

Esempi

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..

Grazie @Arnauld e @NoOneIsHere per il titolo!


L'input verrà sempre ordinato?
xnor

L'ordinamento deve essere "affidabile" in quanto dato un dato set di voci, produce sempre la stessa permutazione dell'output? O deve essere solo "affidabile" in quanto l'output non è ordinato?
Wildcard il

Deve solo soddisfare le specifiche.
Flawr,

Un array nidificato sarebbe consentito come output? ad es [2,[1,3]].
Shaggy,

No, dovrebbe essere un singolo array / elenco.
Flawr,

Risposte:


14

JavaScript (ES6), 39 34 byte

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

Ordina l'array in ordine crescente, fai apparire l'ultimo elemento e usalo come primo elemento di un nuovo array. Quindi strutturare gli elementi rimanenti dell'array originale nel nuovo array (in JS, entrambi sorte popmodificare l'array originale).


Provalo

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>


Perché non puoi farlo a.sort()?
geokavel,

1
@geokavel: Perché il sortmetodo di JS ordina lessicograficamente.
Shaggy,

3
Quindi perché è già irrimediabilmente rotto? = D
jpmc26


7

Gelatina , 3 byte

Ṣṙ1

Provalo online!


Ṣṙ-funziona anche (
volevo

@HyperNeutrino Sì, anche quello funziona, stesso conteggio: p
Erik the Outgolfer

In quale codifica sono Ṣṙ1solo tre byte? In UTF-8, sono 7 byte.
heinrich5991

2
@ heinrich5991 Jelly utilizza una tabella codici personalizzata .
Cole

Sento che tutti coloro che usano Jelly devono avere un'estensione del browser che aggiunge un pulsante per pubblicare automaticamente il commento "Jelly utilizza una tabella codici personalizzata".
Me21,





5

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

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

Richiede input nel formato {1,2,3,4}.

TI-Basic è un linguaggio tokenizzato , tutti i token utilizzati qui sono a un byte.

Spiegazione:

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 byte

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

-31 byte grazie a @Nevay (dimenticato che Java 8 aveva un List#sort(Comparator)metodo ..)

Modifica l'ingresso- ArrayList, invece di restituirne uno nuovo.

Spiegazione:

Provalo qui.

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

È possibile utilizzare l->{l.sort(null);java.util.Collections.rotate(l,1);}per salvare 16 byte.
Nevay,

2
In alternativa è possibile utilizzare l->{l.sort(null);l.add(l.remove(0));}per salvare 31 byte (richiede l'utilizzo di un elenco di dimensioni non fisse).
Nevay,

@Nevay bello, ma ... le parentesi sono un po 'fuori rispetto alla documentazione: la realtà è che le operazioni opzionali adde removedevono essere implementate; nulla si dice sull'elenco di dimensioni fisse ... Kevin Cruijssen, dato che ci sono alternative molto migliori nei commenti precedenti, aspetterò una modifica prima di +1.
Olivier Grégoire,

3

Haskell, 36 37 byte

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

Utilizzare i modelli di visualizzazione per abbinarli sull'intestazione di una versione ordinata dell'elenco di input, quindi aggiungere il primo elemento dell'elenco alla coda dell'elenco rimanente.

I modelli di visualizzazione non ne valgono la pena. Ordina l'elenco, togli la testa, aggiungilo alla fine. In questo caso, risulta che la soluzione ingenua scritta in modo compatto è la migliore.


1
Benvenuti in PPCG! Ottima idea di usare modelli di vista, non li conoscevo prima. Sfortunatamente, non sono abilitati in Haskell standard, quindi per le regole del sito è necessario includere i byte per il flag della riga di comando -XViewPatterns. Contare quelli nel modo standard f(a:b)=b++[a];f.sortè più breve.
Laikoni,

In qualche modo non stavo pensando alla bandiera necessaria. Immagino di usarli così tanto che ho dimenticato di accenderlo nei miei file Cabal e che non fa parte della lingua.
typedrat



2

Ly , 7 byte

&nasprl

Provalo online!

Ugh, rovinare il genere è così costoso!

Spiegazione:

&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 byte

Riceve input dallo stdin. Ordina l'elenco, quindi sposta il primo elemento alla fine, assicurandosi che non sia più ordinato. Salvati tre byte grazie a Giuseppe.

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

Un'altra implementazione, stesso conteggio byte:

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

c(sort(x<-scan())[-1],min(x))è di 29 byte usando essenzialmente la stessa idea della tua.
Giuseppe,




1

Retina , 10 byte

O#`
O^#-2`

Provalo online!

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

Questo lascia l'elenco con il primo elemento più alto per primo e l'ultimo elemento più alto che non viene mai ordinato correttamente


1

Rubino, 18 byte

Inviato su cellulare. Per favore, non uccidermi per problemi.

->a{a.sort.rotate}

1

Pyth, 5 byte

.>SQ1

Spiegazione

SQ - ordina l'elenco di input

.>SQ1 - ruota ciclicamente l'elenco di input di 1



1

Python 3 , 28 byte

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

Provalo online!

a.sort()ordina asul posto e ritorna None. Nonepuò essere utilizzato come indice di suddivisione ed equivale a omettere tale indice.




1

PHP, 44 byte

richiede PHP 5.4 o successivo per la sintassi dell'array breve.

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

ordina gli argomenti, sostituisce l'ottavo argomento con l'ultimo argomento rimosso, stampa.
Corri con -nro provalo online .


L'argomento 0 ° è il nome del file di script, "-"se si chiama PHP con -r. "-"viene confrontato con gli altri argomenti come una stringa e ord("-")==45, poiché , è più piccolo di qualsiasi numero. I numeri stessi, anche se le stringhe, vengono confrontati come numeri: "12" > "2".

php -nr '<code>' 3 4 2 5 1e sort($a=&$argv)portare a $a=["-","1","2","3","4","5"]
[array_pop($a)]+$ais [0=>"5"]+[0=>"-",1=>"1",2=>"2",3=>"3",4=>"4"],
che risulta in [0=>"5",1=>"1",2=>"2",3=>"3",4=>"4"].


Puoi spiegare perché [array_pop ($ a)] + $ a non sovrascrive il 0 ° indice di $ a? Ad esempio: $ a = [1,2,3,4,5], array_pop ($ a) = 5, $ a = [1,2,3,4]. Se si fa [5] + [1,2,3,4], non dovrebbe finire per essere [5,2,3,4] perché entrambi gli array hanno un 0 ° indice? Sono confuso perché il manuale di PHP dice "L'operatore + restituisce l'array di destra aggiunto all'array di sinistra; per le chiavi che esistono in entrambi gli array, verranno utilizzati gli elementi dell'array di sinistra e la corrispondenza gli elementi dell'array di destra verranno ignorati. "
jstnthms,

@jstnthms L' +operatore non aggiunge, si fonde (senza riordinare gli indici; ma qui non importa). Il punto importante è che $apunta $argve $argv[0]contiene il nome del file dello script, gli argomenti iniziano dall'indice 1. Ho esteso la descrizione. Grazie per la domanda
Tito,

1

Julia, 23 byte

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

Leggermente più corto di, ma equivalente a f(x)=circshift(sort(x),1). Vorrei poter fare makeamethod in base a selectciò che era più, compatto ma non posso

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.