Classificação Quebrada Confiável


23

Dada uma lista de números inteiros positivos que contém pelo menos 3 entradas distintas, produz uma permutação dessa lista que não é classificada em ordem crescente ou decrescente.

Exemplos

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

Obrigado @Arnauld e @NoOneIsHere pelo título!


A entrada será sempre classificada?
Xnor

O tipo deve ser "confiável", dado que, dado um determinado conjunto de entradas, sempre produz a mesma permutação que a saída? Ou deve ser "confiável" apenas porque a saída não está classificada?
Wildcard

Deve apenas satisfazer as especificações.
flawr

Uma matriz aninhada seria permitida como saída? por exemplo [2,[1,3]],.
Shaggy

Não, deve ser uma única matriz / lista.
perfil completo de Flawr

Respostas:


14

JavaScript (ES6), 39 34 bytes

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

Classifique a matriz em ordem crescente, pop o último elemento e use-o como o primeiro elemento de uma nova matriz. Em seguida, desestruture os elementos restantes da matriz original na nova matriz (em JS, ambos sorte popmodifique a matriz original).


Teste-o

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 que você não pode simplesmente fazer a.sort()?
geokavel

1
@geokavel: Porque o sortmétodo de JS classifica lexicograficamente.
Shaggy

3
Então, porque já está quebrado de maneira confiável? = D
jpmc26


7

Gelatina , 3 bytes

Ṣṙ1

Experimente online!


Ṣṙ-também funciona (apenas senti como dizer isso, você provavelmente sabia: P)
HyperNeutrino

@HyperNeutrino Sim, isso também funciona, o mesmo bytecount: p
Erik the Outgolfer

Em qual codificação há Ṣṙ1apenas três bytes? No UTF-8, são 7 bytes.
precisa

2
@ heinrich5991 A geléia usa uma página de código personalizada .
cole

Eu sinto que todos que usam o Jelly devem ter uma extensão do navegador que adiciona um botão para postar automaticamente o comentário "O Jelly usa uma página de código personalizada".
precisa saber é o seguinte





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 a entrada no formato {1,2,3,4}.

O TI-Basic é um idioma tokenizado , todos os tokens usados ​​aqui são de um byte.

Explicação:

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 graças a @Nevay (esqueci que o Java 8 tinha um List#sort(Comparator)método ..)

Modifica a entrada ArrayList, em vez de retornar uma nova.

Explicação:

Experimente aqui.

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

Você pode usar l->{l.sort(null);java.util.Collections.rotate(l,1);}para salvar 16 bytes.
Nevay

2
Como alternativa, você pode usar l->{l.sort(null);l.add(l.remove(0));}para salvar 31 bytes (requer o uso de uma lista de tamanho não fixo).
Nevay

@Nevay nice one, mas ... os parênteses estão um pouco errados em relação à documentação: a realidade é que as operações opcionais adde removedevem ser implementadas; nada é dito sobre lista de tamanho fixo ... Kevin Cruijssen, como existem alternativas muito melhores nos comentários anteriores, esperarei uma edição antes de marcar com +1.
Olivier Grégoire

3

Haskell, 36 37 bytes

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

Use os padrões de exibição para corresponder no início de uma versão classificada da lista de entrada e, em seguida, anexe o primeiro item da lista ao final da lista restante.

Os padrões de exibição não valem a pena. Classifique a lista, retire a cabeça e coloque-a no final. Nesse caso, verifica-se que a solução ingênua digitada compactamente é a melhor.


1
Bem-vindo ao PPCG! Ótima idéia para usar padrões de exibição, eu não os conhecia antes. Infelizmente, eles não estão ativados no Haskell padrão; portanto, por regras do site, você precisa incluir os bytes para o sinalizador da linha de comando -XViewPatterns. Contar esses da maneira padrão f(a:b)=b++[a];f.sorté mais curto.
Laikoni 15/08/19

De alguma forma, eu não estava pensando na bandeira necessária. Acho que as utilizo tanto que esqueci de ativá-las nos meus arquivos Cabal e que não faz parte do idioma.
Typedrat

2

Perl 6 ,  43  19 bytes

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

Tente

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

Tente

Observe que [1..*,0]isso resultaria em ((2,3),1), então .flatexiste para transformá-lo em(2,3,1)



2

Ly , 7 bytes

&nasprl

Experimente online!

Ugh, arruinar o tipo é tão caro!

Explicação:

&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

Recebe entrada de stdin. Classifica a lista e move o primeiro elemento para o final, garantindo que ele não seja mais classificado. Salvo três bytes devido a Giuseppe.

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

Outra implementação, mesma contagem de bytes:

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

c(sort(x<-scan())[-1],min(x))tem 29 bytes usando essencialmente a mesma ideia que a sua.
Giuseppe




1

Retina , 10 bytes

O#`
O^#-2`

Experimente online!

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

Isso deixa a lista com o segundo elemento mais alto primeiro e o último elemento mais alto, que nunca é classificado corretamente


1

Ruby, 18 bytes

Enviado no celular. Por favor, não me mate por problemas.

->a{a.sort.rotate}

1

Pitão, 5 bytes

.>SQ1

Explicação

SQ - classificar lista de entrada

.>SQ1 - gire a lista de entrada ciclicamente por 1






1

PHP, 44 bytes

requer PHP 5.4 ou posterior para sintaxe de matriz curta.

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

classifique argumentos, substitua o 0-th argumento pelo último argumento removido, imprima.
Corra com -nrou experimente online .


O argumento 0-th é o nome do arquivo de script, "-"se você chamar PHP com -r. "-"é comparado aos outros argumentos como uma sequência e ord("-")==45, como é menor que qualquer número. Os próprios números, apesar de cordas, são comparados como números: "12" > "2".

php -nr '<code>' 3 4 2 5 1e sort($a=&$argv)levar a $a=["-","1","2","3","4","5"]
[array_pop($a)]+$aé [0=>"5"]+[0=>"-",1=>"1",2=>"2",3=>"3",4=>"4"], o
que resulta em [0=>"5",1=>"1",2=>"2",3=>"3",4=>"4"].


Você pode explicar por que [array_pop ($ a)] + $ a não substitui o 0º índice de $ a? Por exemplo: $ a = [1,2,3,4,5], array_pop ($ a) = 5, $ a = [1,2,3,4]. Se você fizer [5] + [1,2,3,4], não deveria acabar sendo [5,2,3,4] porque ambas as matrizes têm um 0º índice? Estou confuso porque o manual do PHP diz "O operador + retorna a matriz da direita anexada à matriz da esquerda; para chaves que existem nas duas matrizes, os elementos da matriz da esquerda serão usados ​​e a correspondência elementos da matriz da direita serão ignorados ".
Jstnthms

@jstnthms O +operador não anexa, é mesclado (sem reordenar os índices; mas isso não importa aqui). O ponto importante é que $aaponta para $argve $argv[0]contém o nome do arquivo do script, os argumentos começam no índice 1. Estendi a descrição. Obrigado pela pergunta.
Titus

1

Julia, 23 bytes

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

Um pouco menor que, mas equivalente a f(x)=circshift(sort(x),1). Eu gostaria de poder fazer um método baseado selectnisso, era mais compacto, mas não posso

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.