Codegolf Rainbow: Classificando cores com reflexão

9

Introdução:

Depois de postar dois desafios relacionados ao arco-íris: Codegolf Rainbow: Fun with Integer-Arrays 1 e Codegolf Rainbow: Draw em preto e branco 2 , o seguinte comentário foi feito por @ChrisM no ASCII ( Draw em preto e branco) ) desafio :

Talvez você saiba disso e seja por design (sei que arco-íris não são losangos ou ascii também, e as posições de ordens mais altas ficam mais complicadas), mas as cores não são revertidas no segundo arco-íris?

E ele está realmente certo. Quando você vê um arco-íris duplo, o segundo é na verdade um reflexo do primeiro, então as cores são invertidas. Com três arco-íris, é um arco-íris duplo real, com o terceiro sendo um reflexo de um dos outros dois. E com quatro, há dois arco-íris e dois reflexos deles.
insira a descrição da imagem aqui

Então, vamos fazer um terceiro desafio relacionado usando esse fato.

Desafio:

Entradas: Um inteiro positivo nque é >=2, e uma lista de inteiros de tamanho >= n+1.
Saída: a mesma lista ordenada da seguinte forma:

  1. Primeiro, divida as listas de entrada em sub-listas de tamanho n(onde a sub-lista final pode ter qualquer tamanho no intervalo [1,n]).
  2. Em seguida, fazemos o seguinte com base na quantidade de sub-listas m:
    • Classifique a primeira m - m//2quantidade de sub-listas da menor para a maior (onde //é a divisão do número inteiro). (Ou seja, com 6 sub-listas, os três primeiros serão classificados do menor para o maior; com 5 sub-listas, os três primeiros serão classificados do menor para o maior.)
    • Classifique a última m//2quantidade de sub-listas da maior para a menor (onde //é a divisão do número inteiro). (Ou seja, com 6 sub-listas, os três últimos serão classificados do mais alto para o mais baixo; com 5 sub-listas, os dois últimos serão classificados do mais alto para o mais baixo.)
  3. Mesclar todas as sub-listas para formar uma única lista novamente

Exemplos:

Entradas: n=7e [3,2,1,-4,5,6,17,2,0,3,5,4,66,-7,7,6,-5,2,10]
Etapa 1: [[3,2,1,-4,5,6,17],[2,0,3,5,4,66,-7],[7,6,-5,2,10]]
Etapa 2: [[-4,1,2,3,5,6,17],[-7,0,2,3,4,5,66],[10,7,6,2,-5]]
Etapa 3 / Saída:[-4,1,2,3,5,6,17,-7,0,2,3,4,5,66,10,7,6,2,-5]

Entradas: n=4e [7,4,-8,9,3,19,0,-23,-13,13]
Etapa 1: [[7,4,-8,9],[3,19,0,-23],[-13,13]]
Etapa 2: [[-8,4,7,9],[-23,0,3,19],[13,-13]]
Etapa 3 / Saída:[-8,4,7,9,-23,0,3,19,13,-13]

Regras do desafio:

  • A entrada inteira né garantida para ser maior que 1.
  • É garantido que o tamanho da lista inteira seja maior que n.
  • A sub-lista final pode ser menor que n(como pode ser visto nos exemplos e casos de teste).
  • O formato de E / S é flexível em qualquer formato razoável. Pode ser uma lista / matriz de números inteiros ou decimais, uma seqüência de caracteres delimitada por vírgula / espaço / nova linha, fluxo de números inteiros etc. (A saída pode não ser uma lista 2D de listas como a etapa 2. Etapa 3) é necessário para esse desafio.)

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Casos de teste:

Inputs: n=7 and [3,2,1,-4,5,6,17,2,0,3,5,4,66,-7,7,6,-5,2,10]
Output: [-4,1,2,3,5,6,17,-7,0,2,3,4,5,66,10,7,6,2,-5]

Inputs: n=4 and [7,4,-8,9,3,19,0,-23,-13,13]
Output: [-8,4,7,9,-23,0,3,19,13,-13]

Inputs: n=2 and [7,-3,1]
Output: [-3,7,1]

Inputs: n=3 and [1,6,99,4,2]
Output: [1,6,99,4,2]

Inputs: n=2 and [5,2,9,3,-5,-5,11,-5,4,12,9,-2,0,4,1,10,11]
Output: [2,5,3,9,-5,-5,-5,11,4,12,9,-2,4,0,10,1,11]

Inputs: n=3 and [5,2,9,3,-5,-5,11,-5,4,12,9,-2,0,4,1,10,11]
Output: [2,5,9,-5,-5,3,-5,4,11,12,9,-2,4,1,0,11,10]
Kevin Cruijssen
fonte

Respostas:

5

Brachylog , 18 17 16 bytes

ġ₎↔ḍ↔{izo₎ᵐ↔}ᶠcc

Experimente online!

-1 byte graças a @sundar

Espera entrada como [<integer list>, n]. Observe que números inteiros negativos são representados com _"menos-menos" de Brachylog. A variável de saída é R.

Primeira vez que tentei o Brachylog, imagino que seja sub-ideal e pronto para reduzir em bytes.

Explicação

Partição, bifurcação, classificação com base no índice (0: asc, 1: desc), achatar.

ġ₎               | split head of input into groups of length n (last of list)
  ↔              | reverse so that...
   ḍ             | dichotomize splits in two, attaching any additional element to the second list
    ↔            | reverse so first half of partitions corresponds to the 0 index
     {      }    | apply
      i          | : append index
       z         | : zip each sublist with the index of its parent
        o₎ᵐ      | : map over sublists, ordering by the zipped index
           ↔     | : undo earlier reverse
             ᶠ   | find all outputs
              cc | flatten two levels
redundância
fonte
Um pequeno ajuste na sua segunda solução, para obter 17 bytes: Experimente online!
sundar - Restabelece Monica
@ Sundar Eu tinha uma suspeita furtiva de que estava mapeando um, obrigado!
Redundância
Para que serve esse idioma?
Sam Orozco
@SamOrozco Programação lógica declarativa concisa. Tente clicar no nome do idioma!
Adám 21/08/19
3

Geléia , 9 bytes

sṢ€ŒHUÐeF

Experimente online!

Mr. Xcoder
fonte
11
Não entendo por que essa linguagem de programação existe.
Sam Orozco
@ SamOrozco Seu único objetivo é resolver problemas com o menor código possível.
Adám 21/08/18
Sério. Isso é legal.
Sam Orozco
2

Japonês , 10 bytes

òV ®nÃÇwÃc

Also 10 bytes
òV mn ow c

Experimente online!

Luis felipe De jesus Munoz
fonte
2

05AB1E (herdado) , 9 bytes

ô€{2ä`í«˜

Experimente online!

Experimente online! em 05AB1E (reescrita do Elixir) - espera que a entrada esteja na pilha, um método de E / S padrão.

Kevin criou seu próprio 11-byter, que eu costumava chegar a 10. Depois, criei outra coisa para 9 bytes.

Mr. Xcoder
fonte
Agradável. Aqui foi a minha solução inicial como alternativa 11-byte: ô€{2äRć€R)˜.
Kevin Cruijssen 17/08/2018
11
@KevinCruijssen Chegou a 10 usando sua abordagem, haha. EDIT : 9 agora!
Sr. Xcoder 17/08/2018
Ah legal. Esqueci completamente í. E bom golfe adicional.
Kevin Cruijssen
2

JavaScript (ES6), 82 81 bytes

Guardado 1 byte graças a @redundancy

Toma entrada como (list)(n).

a=>n=>(g=z=>a+a?[...a.splice(0,n).sort((x,y)=>1/z?x-y:y-x),...g(a[i+=n])]:a)(i=0)

Experimente online!

Arnauld
fonte
Como aé unidimensional, acredito que você pode substituir a>[]por a+apara verificar o caso não vazio e salvar 1 byte. Estratégia recorrente muito inteligente para particionar e determinar quando reverter o tipo também!
redundância
@ redundância Isso deve ser realmente seguro. Obrigado!
Arnauld