É resolver Sudoku muito difícil? Até a versão da força bruta ? Aqui está um exercício de codificação um pouco mais fácil. Eu espero. :-P
Escreva a função mais curta para implementar o bogosort. Especificamente, sua função deve:
- Pegue uma matriz (ou o equivalente do seu idioma) como entrada
- Verifique se seus elementos estão em ordem classificada; Nesse caso, retorne a matriz
- Caso contrário, embaralhe os elementos e comece novamente
A entrada mais curta vence. No caso de empate, é preferida uma função que suporte um comparador personalizado (e / ou gerador de números aleatórios pseudo). Quaisquer laços restantes são resolvidos favorecendo o envio anterior.
Esclarecimentos: Você pode usar qualquer tipo de elemento que desejar, desde que haja alguma maneira de solicitá-los, é claro. Além disso, o embaralhamento deve ser uniforme; nada disso "vou classificá-lo rapidamente e chamá-lo de embaralhado". :-)
Respostas:
APL (Dyalog), 20
Explicação
⍵
é o argumento (à direita)⍵≡⍵[⍋⍵]
: verifica se a⍵
classificação é igual a⍵
si mesma:⍵
: se sim, retorne⍵
∇⍵[?⍨⍴⍵]
: Senão, gere uma matriz de 1 a⍴⍵
(comprimento de⍵
) em ordem aleatória, reordene de⍵
acordo com isso (⍵[...]
) e aplique a função a ele (∇
)De repente, revisitando esse problema e ...
APL (Dyalog), 19
Só de pensar em classificar uma matriz na verificação torna-o meio inútil (sem dizer que o Bogosort é significativo), uma implementação mais precisa seria
∧/2≤/⍵
e isso acontece para diminuir a contagem de caracteres.fonte
Caracteres do Perl 6: 23
fonte
[<=]
verifica se uma lista está classificada:[<=] (1, 2, 3,) == (1 <= 2 <= 3) == (1 <= 2) and (2 <= 3)
e.pick(n)
escolhe n elementos aleatórios da lista e.pick(*)
permite que o Perl escolha todos os elementos. use.perl.org/~masak/journal/40459pick
usado antes, muito menos[<=]
. Onde estão esses documentos na documentação?[]
é operador de redução que leva o operador entre colchetes. Por exemplo,[<=] 1, 2, 3
é1 <= 2 <= 3
(e sim, você faz intervalos como este no Perl 6). Nesse caso, é usado para determinar se os elementos estão em ordem..pick(*)
O método embaralha a lista (pick(N)
selecionaN
elementos da lista)..=
chama o método e atribui o resultado à variável Quanto à documentação - bem, por enquanto apenas existe a especificação Perl 6 - feather.perl6.nl/syn , mas existe.APL (22)
Uso:
Explicação:
⍋⍵
: retorna os índices dos itens na ordem classificada, portanto⍋30 10 20
fornece2 1 3
(⍳X←⍴⍵)≡⍋⍵:⍵
Armazene o comprimento da lista de entrada em X. Se o intervalo[1..X]
for igual à ordem de índice classificada, a lista é classificada, então retorne-a.⋄∇⍵[X?X]
: se não for esse o caso, recorra com a matriz aleatória.fonte
Ruby - 33 caracteres
fonte
g=proc{|l|0until l.sort==l.shuffle!}
f=->l{l.sort!=l.shuffle!?redo:l}
(Ruby 1.9)redo
funciona com umproc
método clássico, mas não com eledef...end
? Eu pensei queredo
só funciona com loops?redo
[…] transfere o controle de volta ao início do proc ou lambda“. Simplesmente é assim.Mathematica ,
4037Com espaço em branco:
fonte
#//.l_/;Sort@l!=l:>RandomSample@l&
J -
3427por exemplo:
A parte {~? ~ @ # Embaralha a entrada:
fonte
Python 61
Classifica no lugar.
fonte
from random import*
pode salvar um caractere.Python 94
Outras respostas python usam random.shuffle (). A documentação do módulo aleatório python afirma:
fonte
return[x...
o contrárioreturn [x...
. O mesmo compermutations(a) if
- poderia serpermutations(a)if
.lambda a: [x for x in __import__("itertools").permutations(a) if x==tuple(sorted(a))][0]
É 88 bytesK,
3125{while[~x~x@<x;x:x@(-#x)?#x];x}
.
.
fonte
Python (69 caracteres)
Classifica números inteiros em ordem numérica crescente. Observe que soluções recursivas, como
from random import*;f=lambda a:a>sorted(a)and(shuffle(a)or f(a))or a
falhará devido ao estouro da pilha, mesmo para pequenas entradas (por exemplo, N> 5), porque o Python não faz otimização de chamada de cauda.
fonte
D sem comparador personalizado: 59 caracteres
Mais legivelmente:
D com comparador personalizado: 69 caracteres
Mais legivelmente:
fonte
Scala 73:
No Scala, podemos verificar se o compilador fez uma otimização de chamada de cauda:
e sim, fez. No entanto, para uma lista curta de 100 valores:
demorou quase 4 meses para concluir. ;)
fonte
C # (184 caracteres)
Não é muito bom fazer isso em c #. Você precisa oferecer suporte a genéricos para oferecer suporte aos tipos de valor e referência. Não há função ou função de reprodução aleatória de matriz para verificar se algo está classificado.
Alguém tem alguma dica para melhorar isso?
Edite a versão que classifica apenas int (134 caracteres):
fonte
GNU / BASH 65
fonte
C ++ 11, 150 caracteres
Apenas .. feito por diversão.
fonte
Python - 61 caracteres
Recursivo
fonte
from random import*
pode ser mais curto.PowerShell ,
8582565552 bytes-26 bytes graças às sugestões de mazzy
-1 byte graças a AdmBorkBork
-3 bytes graças a mazzy
Experimente online!
O PowerShell tem uma comparação de matriz relativamente barata convertendo-a em cadeias e comparando isso.
fonte
param
inicialização para suafor
inicialização para salvar um byte -for($l=$args;
-ne
converte o operador direito em um tipo escalar do operador esquerdo. Assim, você pode salvar alguns bytes: Experimente online!Javascript 291 caracteres
min
un-min
fonte
var
s. Basta torná-los globais implícitos, é apenas tornar o código o mais curto possível.Matlab, 59 bytes
Abordagem relativamente direta:
fonte
J, 22 bytes
Esta é uma mônada recursiva e tácita, usando uma agenda. Veja como funciona:
Vamos
y
ser a nossa lista. Primeiro, o verbo à direita da agenda é-:/:~
. Este é um verbo graciosamente fornecido por Leaky Nun . Corresponde a (-:
) se a entrada é ou não classificada (/:~
) usando um gancho monádico. ((f g) y = y f (g y)
) Isso retorna um um ou um zero de acordo. O lado esquerdo da agenda é um gerúndio de dois verbos: à direita está o verbo de identidade]
e à esquerda é o local onde ocorre a recursão. A agenda seleciona o verbo de identidade na posição1
se a lista estiver classificada e o verbo mais longo na posição0
se a lista não estiver classificada.$:@({~?~@#)
chama$:
(o verbo mais longo em que está contido) sobre o resultado de{~?~@#
ony
. Isso embaralha a lista, conforme?~@#
as permutações do comprimento dey
, sendo índices aleatoriamente ordenados dey
.{~
, em um gancho monádico, retorna uma listay
cujos índices são o argumento correto. Essa lista embaralhada é chamada novamente com a agenda e se repete até que seja classificada.fonte
C ++ 14, 158 bytes
fonte
Geleia , 6 bytes, desafio de pós-datas de idiomas
Experimente online!
Explicação
Œ¿
atribui um número a cada permutação de uma lista; 1 é classificado, 2 tem os dois últimos elementos trocados, etc., até o fatorial do comprimento da lista (que é a lista na ordem inversa). Portanto, para uma lista classificada, ele tem o valor 1, e podemos diminuí-lo usando’
para produzir um teste "não classificado" que pode ser usado como um booleano em uma condição de loop while. O$
objetivo é fazer com que a condição seja analisada como um grupo.fonte
C ++, 166 bytes
Meh.
Isso deve funcionar em todos os contêineres STL que possuem
begin()
eend()
.Ungolfed:
fonte
APL (Dyalog Extended) , 15 bytes
Experimente online!
fonte
?⍨∘≢⍛⊇⍨⍣{⍺≡∧⍺}
Braquilog , 5 bytes
Experimente online!
Quando vi pela primeira vez a resposta Brachylog do ais523 (em oposição à sua resposta Jelly, porque se não me engano o user62131 também era ele), pensei: e se ele usasse retrocesso em vez de recursão? Então, no começo, eu tentei
ṣ≤₁
. Acontece que, como escolher algo aleatoriamente não produz várias saídas, mas produz apenas uma saída de forma não-determinística, o predicado de reprodução aleatóriaṣ
não pode ser retrocedido, portanto, executar isso simplesmente falhará a menos que você tenha sorte o suficiente para reproduzi-la corretamente. na primeira tentativa. Depois disso, tenteipṣ≤₁
, o que funcionou na maior parte do tempo, mas como uma lista finitamente longa tem muitas permutações finitas, ela ainda falhava aleatoriamente às vezes. Depois de ter abandonado o objetivo de obter redução de comprimento, finalmente cheguei a isso:(Demonstração de aleatoriedade)
Embora na verdade possa ser um pouco mais curto se tomarmos algumas liberdades com E / S ...
Braquilog , 4 bytes
Experimente online!
Para que a saída seja útil, a entrada não deve conter nenhum elemento duplicado, pois, além de classificar a entrada, esse predicado bogosort adiciona um número aleatório de elementos duplicados e zeros. (Hipoteticamente, poderia acrescentar algo, mas simplesmente não funciona.) Normalmente, eu não me incomodaria em mencionar algo tão longe de funcionar corretamente, mas acho que está no espírito do desafio.
fonte
Perl 6 , 28 bytes
Experimente online!
Bloco de código anônimo que embaralha a lista até que ela seja classificada. Observe que ele classifica a lista pelo menos uma vez, o que é permitido. E não,
{.pick(*)}
não pode ser substituído por*.pick(*)
fonte
Pitão , 11 bytes
Muito feliz com isso, provavelmente pode ser jogado um pouco mais
Explicação
Experimente online!
fonte
=Q.SQ
a=.SQ
para -1 byte (trabalhos com outros operadores também, como=QhQ
->=hQ
)Japonês ,
119 bytesTente
fonte
Braquilog (v2), 5 bytes
Experimente online!
Envio de função. (O link TIO usa um argumento de linha de comando que agrupa automaticamente uma função em um programa completo.)
Explicação
O prólogo (a linguagem na qual o Brachylog compila) é recursivo da cauda, portanto, essa função acaba sendo compilada em um loop restrito.
fonte
C (203 caracteres, sem loop de entrada: apenas a função)
É o mesmo que se segue, onde também lemos a matriz do stdin e escrevemos a matriz classificada. Como o Q pediu a função e não um programa inteiro ...
C (296 caracteres)
A compilação pode dar aviso (declarações implícitas). Limite de tamanho de matriz com código rígido de 999 elementos. Frágil.
se não for necessário verificar previamente se a matriz está classificada, isso pode ser feito em 284.
C (251 caracteres, era 284)
(usando globais em vez da função args).
fonte