Introdução
Esse desafio é sobre três (ruins) algoritmos de classificação:, Bogosort
e duas outras variantes que eu Bogoswap
criei (mas provavelmente já foram consideradas por outras pessoas em algum momento): (AKA Bozosort) e Bogosmart
.
Bogosort
funciona embaralhando completamente a matriz aleatoriamente e verificando se ela é classificada (crescente). Caso contrário, repita.
Bogoswap
funciona selecionando dois elementos aleatoriamente e trocando-os. Repita até classificar (crescente).
Bogosmart
funciona selecionando dois elementos, aleatoriamente, e apenas trocando-os se aproximar a matriz da ordem (ascendente), ie. se o elemento com o índice mais baixo era originalmente maior que o elemento com o mais alto. Repita até classificar.
O desafio
Esse desafio explora a eficiência (ou falta de) de cada um desses três algoritmos de classificação. O código golfado será
gere uma matriz embaralhada de 8 elementos dos números inteiros 1-8 inclusive (continue lendo para ver como você deve fazer isso);
aplique cada algoritmo a essa matriz; e
exibir a matriz original, seguida pelo número de cálculos necessários para cada algoritmo, separados por um espaço (espaço à direita ok), no formato
<ARRAY> <BOGOSORT> <BOGOSWAP> <BOGOSMART>
.
O programa produzirá 10 casos de teste; você pode gerar todos os dez no começo ou um de cada vez, qualquer que seja. Exemplo de saída abaixo.
Detalhes:
Pois Bogosort
, ele deve registrar o número de vezes que a matriz foi embaralhada.
Pois Bogoswap
, deve registrar o número de swaps realizados.
Pois Bogosmart
, deve registrar o número de swaps realizados.
Exemplo de saída:
87654321 1000000 100 1
37485612 9050000 9000 10
12345678 0 0 0
28746351 4344 5009 5
18437256 10000 523 25
15438762 10000 223 34
18763524 58924 23524 5
34652817 9283 21 445
78634512 5748 234 13
24567351 577 24 34
Eu inventei esses números; é claro, seu programa imprimirá resultados diferentes, mas no mesmo formato.
Regras
- Toda aleatoriedade usada no seu programa deve vir de geradores de números pseudoaleatórios disponíveis para você e, caso contrário, não serão computados extensivamente por você. Você não precisa se preocupar com sementes.
- Não há limite de tempo para os programas.
- As matrizes devem ser classificadas de forma crescente.
- Trailing espaços ou uma nova linha extra não é grande coisa.
- Pois
Bogosort
, o array deve ser embaralhado usando qualquer algoritmo de embaralhamento imparcial, como Fisher-Yates ou Knuth Shuffling , explicitamente especificado em sua explicação. Métodos de embaralhamento internos não são permitidos. Gere suas matrizes de teste da mesma maneira. - Se depois de embaralhar ou trocar a matriz permanecer a mesma, ela ainda conta e deve ser incluída na contagem do programa. Por exemplo, embaralhar a matriz para si mesma por coincidência conta como uma ordem aleatória, e trocar um elemento consigo conta como uma troca, mesmo que nenhuma dessas operações altere a matriz.
- Se minha memória me servir corretamente, uma matriz de 8 elementos não deve demorar muito para nenhum dos três algoritmos. Na verdade, acho que algumas vezes para uma matriz de 10 elementos, quando tentei,
Bogoswap
exigiu apenas alguns milhares (ou menos) de shuffles reais e bem menos de 10 segundos. - Seu código deve realmente classificar as matrizes, não apenas fornecer valores esperados ou cálculos matemáticos para uma resposta esperada.
- Este é um desafio do código-golfe, pelo que vence o programa mais curto em bytes.
Aqui estão algumas etapas de exemplo para cada algoritmo de classificação:
BOGOSORT
56781234
37485612
28471653
46758123
46758123
12685734
27836451
12345678
BOGOSWAP
56781234
16785234
17685234
12685734
12685743
12685734
12485763
12385764
12385764
12345768
12345678
BOGOSMART
56781234
16785234
12785634
12785364
12785364
12385764
12385674
12345678
Nesse caso, o programa produziria 56781234 7 10 7
e, em seguida, faria a mesma coisa 10 vezes. Você não precisa imprimir as matrizes durante a classificação, mas forneci as etapas de amostra acima para que você possa entender como cada algoritmo funciona e como contar os cálculos.
Respostas:
Pitão,
6260 bytesIsso foi bem divertido. Não tenho certeza se isso é válido, provavelmente estou usando algumas brechas não escritas.
Uma saída de amostra seria:
Explicação:
Minha função de reprodução aleatória usa a função incorporada
order-by
. Basicamente, atribuo a cada elemento da lista um número aleatório do intervalo[0-1)
e ordeno a lista por eles. Isso me dá uma aleatória aleatória imparcial.Laço externo
O
VT
no início repete o seguinte código 10 vezes.Preparação
Bogosort
Bogoswap
Bogosmart
Impressão
fonte
=JXJO.cJ2)
é o mesmo que=XJO.cJ2)
atribuição aumentada. O mesmo vale para=bXb
mais tarde. Além disso, acho swaps são supostamente é suposto ter os pares escolhidos com substituição (.C
).c
ou.C
não. Por exemplo.C[3 1 2)2
, não retorna o par[2, 1]
. Que é uma propriedade que estou explorando no meu algoritmo.*JJ
então? É também um personagem mais curto, o que é legal.JavaScript ( ES6 ), 319
345Sem surpresa, isso é bastante longo.
Para aleatório aleatório, créditos para @ core1024 (melhor que o meu para o mesmo chellenge)
Teste a execução do snippet (Firefox apenas como de costume)
fonte