O Driftsort é uma maneira simples de "classificar" uma matriz. Ele funciona "deslizando" ou "girando" os elementos na matriz até que a matriz seja classificada ou até que a matriz falhe na classificação.
Vamos percorrer dois exemplos. Primeiro, considere a matriz [10, 2, 3, 4, 7]
. Como o array não está classificado, nós o rotacionamos uma vez. (Isso pode acontecer em qualquer direção, desde que permaneça na mesma direção.) Em seguida, a matriz se torna:
[7, 10, 2, 3, 4]
Como não está classificado, giramos novamente.
[4, 7, 10, 2, 3]
E de novo:
[3, 4, 7, 10, 2]
E uma última vez:
[2, 3, 4, 7, 10]
E está resolvido! Portanto, a matriz [10, 2, 3, 4, 7]
é selecionável em derivações. Aqui estão todas as rotações da matriz, para maior clareza:
[10, 2, 3, 4, 7]
[7, 10, 2, 3, 4]
[4, 7, 10, 2, 3]
[3, 4, 7, 10, 2]
[2, 3, 4, 7, 10]
Considere agora a matriz [5, 3, 9, 2, 6, 7]
. Veja suas rotações:
[5, 3, 9, 2, 6, 7]
[7, 5, 3, 9, 2, 6]
[6, 7, 5, 3, 9, 2]
[2, 6, 7, 5, 3, 9]
[9, 2, 6, 7, 5, 3]
[3, 9, 2, 6, 7, 5]
Nenhuma dessas matrizes é classificada, portanto, a matriz [5, 3, 9, 2, 6, 7]
não é passível de derivação.
Objetivo Dada uma matriz / lista não-vazias de números inteiros como entrada para um programa / função, implemente o driftsort na entrada e a produza ou produza um valor falsey ( ou uma matriz / lista vazia) se não puder ser derivado. Os números inteiros estão vinculados aos seus idiomas max / min, mas isso deve ser pelo menos 255 para o máximo e 0 para o mínimo.
Você pode usar métodos de classificação internos, mas não um interno que resolva o desafio.
Este é um código de golfe , portanto, o programa mais curto em bytes.
Casos de teste
input => output
[1] => [1]
[5, 0, 5] => [0, 5, 5]
[3, 2, 1] => false
[0, 9, 3] => false
[1, 2, 3, 4] => [1, 2, 3, 4]
[4, 1, 2, 3] => [1, 2, 3, 4]
[0, 2, 0, 2] => false
[5, 3, 9, 2, 6, 7] => false
[0, 0, 0, 0, 0, 0, 0] => [0, 0, 0, 0, 0, 0, 0]
[75, 230, 30, 42, 50] => [30, 42, 50, 75, 230]
[255, 255, 200, 200, 203] => [200, 200, 203, 255, 255]
sorted(l)
é uma sub- lista contígua del+l
.shiftsort
?shift
operação que remove o primeiro elemento de uma matriz.Respostas:
Gelatina , 6 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Ruby, 33
a.any?
dispara até uma vez para cada elemento da matriz, exceto que para (e retorna verdadeiro) assim que a matriz for alterada para um estado classificado. Se isso acontecer, retornamos a matriz mutada. Caso contrário, retornamos o valor falso queany?
retorna.fonte
Python 2, 51 bytes
Não se incomoda em girar. Em vez disso, classifica a lista e, em seguida, verifica se o original é classificável por desvio, verificando se há no máximo uma diminuição entre os elementos consecutivos da lista ciclificada. A contagem é
<3
porquemap
preenche a lista mais curtaNone
no final, adicionando uma diminuição falsa.fonte
[1, 3, 2, 4]
só tem uma diminuição entre os elementos consecutivos, mas não é selecionável à deriva.<3
também<3
é para evitar ter que girar a lista com precisão.Pitão, 9 bytes
Explicação:
Experimente aqui!
Ou use uma suíte de testes!
fonte
.:
. Combinações incluiriam elementos não contíguos.Matlab,
614741 bytesObrigado @Suever por -6 bytes!
Se
strfind([a,a],sort(a))
tentar encontrar o vetor de entrada classificado como uma 'subcadeia' do não classificado, esse foi anexado a si mesmo. Se verdadeiro, a entrada é passível de derivação e obtemos um vetor de comprimento 2; caso contrário, obtemos um vetor vazio.min
apenas transforma isso em um número / vetor vazio. Adicionar o vetor classificado a 0 apenas o exibe, adicionando-o a um vetor vazio gera um erro.fonte
[2, 3]
não identifica uma sub -lista de[12, 34]
?strfind
pode funcionar diretamente com números, não apenas com caracteres (mesmo que isso não esteja documentado). Se os números estivessem sendo interpretados como caracteres, eles seriam limitados a65535
(tente por exemplo+char(1e5)
)Julia,
716652 bytesEsta é uma função anônima que aceita uma matriz e retorna uma matriz ou um booleano. Para chamá-lo, atribua-o a uma variável.
Para uma matriz de entrada x , construímos o conjunto de todas as rotações de x e verificamos se a versão classificada x é um elemento dessa lista. Se for, retornamos x classificados, caso contrário, retornamos false.
Economizou 19 bytes graças a Dennis!
fonte
Pip , 15 + 1 =
1716 bytesUgh, as outras línguas do golfe estão soprando isso fora da água. No entanto, desde que eu já escrevi ...
Recebe entrada como argumentos de linha de comando separados por espaço. Requer
-p
ou outro sinalizador de formatação de matriz para exibir o resultado de forma legível e não concatenada. O caso false gera uma sequência vazia, visível em virtude da nova linha à direita.fonte
JavaScript (ES6),
727065 bytesRetorna
0
em caso de falha. Anterior8583versão de 80-byte evitado chamandosort
:Editar: salvou 2 bytes inicializando
c
em-1
vez de0
. Economizou 5 bytes alternando dereduce
paramap
, suspiro ...fonte
[10, 2, 3, 4, 7]
.[1]
,[0, 0, 0, 0, 0, 0, 0]
e[75, 230, 30, 42, 50]
.sort
supervisão, que causou a terceira falha no teste. As outras duas falhas de teste foram causadas por mim jogando golfe demais; Eu voltei para a versão anterior.05AB1E , 12 bytes
Código:
Usa a codificação CP-1252 . Experimente online! .
fonte
Boneco de neve 1.0.2 , 27 bytes
Essa é uma sub-rotina que recebe as entradas e saídas do permavar atual.
Experimente online!
fonte
MATL,
1312109 bytesA mesma idéia que a resposta de @ flawr, onde sequestramos
strfind
(Xf
) para encontrar a versão classificada da entrada na concatenação de duas cópias da entrada.Experimente Online!
Explicação
fonte
g
? Ou substituirng
pora
n
porquen
poderia ser> 1.a
definitivamente funciona. Imaginei que havia uma maneira melhor. Obrigado!Julia, 33 bytes
Experimente online!
Como funciona
Isso concatena a matriz x consigo e conta o número de pares que estão fora de ordem, ou seja, o número de sub-matrizes contíguas [a, b] para as quais b - a <0 . Se c é o número de pares não ordenados de x em si et é 1 se o último elemento de x for maior que o primeiro,
sum
retornará 2c + t .A matriz x é selecionável em derivação iff (c, t) = (1, 0) ( x deve ser girado para o valor menor do único par não ordenado), (c, t) = (0, 1) ( x é classificado) ou (c, t) = (0, 0) ( x é classificado e todos os seus elementos são iguais), o que é verdadeiro se 2c + t <3 .
fonte
Javascript ES6,
484543 caracteresTeste:
fonte
(x+[,x])
e outro byte usando em~
vez de1+
em sua condição.Braquilog , 39 bytes
Eu realmente preciso adicionar um argumento opcional para
$( - circular permute left
para permutar mais de uma vez ... isso teria sido 13 bytes. Isso aguardará após a implementação de um novo transpiler estável no Prolog.Explicação
fonte
Ruby, 47 bytes
Função recursiva. Retorna
nil
se a matriz de entrada não puder ser alterada.fonte
CJam,
1713 bytesAgradecimentos a Dennis por salvar 4 bytes.
Um bloco (função) sem nome que pega e retorna uma lista.
Suíte de teste.
Explicação
Isso essencialmente usa a observação do xnor de que a lista classificada aparece duas vezes a lista original, se a sua deriva classificável:
fonte
C ++ 14, 242 caracteres
Se eu não puder deixar a saída em branco, 252 caracteres http://ideone.com/HAzJ5V
Versão ungolfed http://ideone.com/Dsbs8W
PS: Baseado na ideia de @ MichelfrancisBustillos .
fonte
Java 7, 207 bytes
Teste detalhado aqui
fonte
Java 175
imprime a saída como valores separados por espaço ou imprime
f
para um valor de falsey.passa por todas as combinações da matriz de números inteiros até encontrar a sequência válida ou ficar sem combinações. a matriz não é modificada, mas a sequência derivada de variações é armazenada como uma sequência delimitada por espaço.
um pouco mais legível:
experimente online
fonte
C, 105 bytes
Isso aceita os números inteiros de entrada como argumentos separados da linha de comando e imprime a lista de saída como um número inteiro por linha.
Se a lista não for selecionável por derivação, o programa será encerrado prematuramente devido a uma exceção de ponto flutuante; portanto, sua saída vazia representa uma lista vazia.
Verificação
fonte
Ruby, 28
Retorna a matriz classificada ou
nil
(que é um valor falso) se a entrada não puder ser classificada como derivada.fonte
Python, 53 bytes
Se você quiser testar isso, acesse https://www.repl.it/languages/python3 e copie e cole:
Como funciona:
s
é uma variável que armazena asorted
função python que classifica listasN
é a função principals(x)
é multiplicada pelo fato de a lista ser ou não derivadastr(s(x))[1:-1]in str(x+x)
(graças a @xnor)[1,2,3,4]*false
resulta em uma lista vazia[]
[1,2,3,4]*true
resulta em[1,2,3,4]
fonte
lambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)
para 44 bytes.Python, 83 bytes
Isso ficou envergonhado pelas outras respostas python, mas eu também poderia postá-lo de qualquer maneira. Eu realmente não gosto do
parte. Existe uma maneira mais rápida de percorrer a lista?
fonte
l.append(l.pop(0))or g==l for _ in l
economiza um byte na abordagem de alcance de len. Usar umlambda
salvaria 14 bytes adicionais.MATLAB / oitava, 118 bytes
fonte
input('')
. Evite também espaços e parênteses desnecessários! E você pode novamente lançar alguns bytes definindo primeirof=@issorted
.PowerShell v2 +,
8780 bytesPercorre a lista de entrada
$a
, verificando cada elemento em pares (incluindo o último e o primeiro) para ver se há mais de um par decrescente. Se o par em particular está diminuindo, diminuímos$c
. Produz a lista classificada ou um elemento único0
, com base no valor de$c
no final. Se mais de um par "ruim" estiver presente,++$c
ainda será negativo; caso contrário, será pelo menos0
; portanto, o segundo elemento do pseudo-ternário será escolhido ($a|sort
).Vejo que o xnor fez algo semelhante , mas criei isso de forma independente.
fonte
Fator, 47 bytes
junte a sequência a ela mesma e verifique se a representação ordenada do original é uma subsequência.
fonte
dup dup append \\ natural sort \\ dip subseq?
Mesmo se encaixa no padrão 4-4-3 :)C ++, 313
359370bytesGrito enorme para @Qwertiy por fazer isso funcionar e me ensinar alguns ótimos métodos de golfe!
Golfe:
Ungolfed:
fonte
using namespace std;
é 20 caracteres quandostd::
6 vezes é 30.bool s = False;
- por que não=0
? Você pode largarreturn 0;
. Por que os colchetes estão aqui!s&&(c<=v.size())
? Figura chaves e sem vírgulas ...std::
ereturn 0;
) se tornaram um hábito nas aulas de programação. Eu realmente preciso começar a verificar meus programas melhor.True
e emFalse
vez detrue
efalse
. ideone.com/kVTI25 - sua versão, ideone.com/y8s44A - corrigida e preparada para a versão de golfe.True
eFalse
é de Python. Eu nem sabia que você poderia escreverif
assim!Mathcad, TBD
No Mathcad, 0 (escalar) == falso.
A contagem de bytes (equivalente) é TBD até o método de contagem acordado. Aproximadamente 52 bytes usando uma equivalência de teclado byte = operador / símbolo.
fonte
Mathematica
55 50 6158 bytesCom 3 bytes salvos, graças a Martin Büttner.
Minhas tentativas anteriores não passaram em todo o caso de teste. Eu precisava adicionar
Union
para evitar repetições na lista que foram inseridas em ordem.Testes
Explicação
Gire à direita a lista de entrada de 1 para
n
vezes, onden
está o comprimento da lista de entrada. Se a lista de entrada classificada estiver entre as listas rotacionadas de saída, retorne-a; caso contrário, retorne uma lista vazia.fonte
@@
e/@
em listas vazias.Join@@
ainda deve ser mais curto do queFlatten@
embora.PHP, 98 bytes
Gera uma saída
1
se for variável, senão nadafonte