Codegolf Rainbow: Tri des couleurs avec réflexion

9

Introduction:

Après avoir publié deux défis liés à l'arc-en-ciel: Codegolf Rainbow: Fun with Integer-Arrays 1 et Codegolf Rainbow: Draw en noir et blanc 2 , le commentaire suivant a été fait par @ChrisM dans l'ASCII ( Draw en noir et blanc ) défi :

Peut-être que vous le savez et que c'est par conception (je sais que les arcs-en-ciel ne sont pas non plus des losanges ou des ascii, et les positions des ordres supérieurs deviennent plus compliquées), mais les couleurs ne sont-elles pas inversées dans le 2e arc-en-ciel?

Et il a en effet raison. Lorsque vous voyez un double arc-en-ciel, le second est en fait le reflet du premier, donc les couleurs sont inversées. Avec trois arcs-en-ciel, c'est un véritable arc-en-ciel double, le troisième étant le reflet de l'un des deux autres. Et avec quatre, il y a deux arcs-en-ciel et deux reflets de ceux-ci.
entrez la description de l'image ici

Alors, faisons un troisième défi connexe en utilisant ce fait.

Défi:

Entrées: Un entier positif nqui est >=2, et une liste d'entiers de taille >= n+1.
Sortie: la même liste ordonnée comme suit:

  1. Divisez d'abord les listes d'entrée en sous-listes de taille n(où la sous-liste de fin peut être de n'importe quelle taille dans la plage [1,n]).
  2. Ensuite, nous faisons ce qui suit en fonction du nombre de sous-listes m:
    • Triez la première m - m//2quantité de sous-listes de la plus faible à la plus élevée (où //est la division entière). (Autrement dit, avec 6 sous-listes, les trois premières seront triées du plus bas au plus élevé; avec 5 sous-listes, les trois premières seront triées du plus bas au plus élevé.)
    • Triez le dernier m//2nombre de sous-listes du plus élevé au plus bas (où //est le nombre entier). (Autrement dit, avec 6 sous-listes, les trois dernières seront triées du plus élevé au plus bas; avec 5 sous-listes, les deux dernières seront triées du plus élevé au plus bas.)
  3. Fusionner toutes les sous-listes pour former à nouveau une seule liste

Exemples:

Entrées: n=7et [3,2,1,-4,5,6,17,2,0,3,5,4,66,-7,7,6,-5,2,10]
Étape 1: [[3,2,1,-4,5,6,17],[2,0,3,5,4,66,-7],[7,6,-5,2,10]]
Étape 2: [[-4,1,2,3,5,6,17],[-7,0,2,3,4,5,66],[10,7,6,2,-5]]
Étape 3 / Sortie:[-4,1,2,3,5,6,17,-7,0,2,3,4,5,66,10,7,6,2,-5]

Entrées: n=4et [7,4,-8,9,3,19,0,-23,-13,13]
Étape 1: [[7,4,-8,9],[3,19,0,-23],[-13,13]]
Étape 2: [[-8,4,7,9],[-23,0,3,19],[13,-13]]
Étape 3 / Sortie:[-8,4,7,9,-23,0,3,19,13,-13]

Règles du défi:

  • L'entrée entière nest garantie supérieure à 1.
  • La taille de la liste entière est garantie être supérieure à n.
  • La sous-liste de fin peut être plus petite que n(comme on peut le voir dans les exemples et les cas de test).
  • Le format d'E / S est flexible dans n'importe quel format raisonnable. Peut être une liste / un tableau d'entiers ou de décimales, une chaîne délimitée par des virgules / espaces / sauts de ligne, un flux d'entiers, etc. (La sortie peut ne pas être une liste 2D de listes comme l'étape 2. Étape 3 pour l'aplatir de nouveau en une seule liste est requis pour ce défi.)

Règles générales:

  • C'est le , donc la réponse la plus courte en octets l'emporte.
    Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues non-golfeur de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
  • Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
  • Les failles par défaut sont interdites.
  • Si possible, veuillez ajouter un lien avec un test pour votre code.
  • De plus, l'ajout d'une explication à votre réponse est fortement recommandé.

Cas de test:

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
la source

Réponses:

5

Brachylog , 18 17 16 octets

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

Essayez-le en ligne!

-1 octet grâce à @sundar

Attend l'entrée en tant que [<integer list>, n]. Notez que les entiers négatifs sont représentés par _, "low moins" de Brachylog. La variable de sortie est R.

Première tentative de Brachylog, donc j'imagine que c'est sous-optimal et mûr pour réduire en octets.

Explication

Partitionner, bifurquer, trier en fonction de l'index (0: asc, 1: desc), aplatir.

ġ₎               | 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
redondance
la source
Un petit ajustement à votre deuxième solution, pour obtenir 17 octets: Essayez-le en ligne!
sundar
@sundar J'avais un soupçon furtif que j'en cartographiais un de trop, merci!
redondance
À quoi sert cette langue?
Sam Orozco
@SamOrozco Programmation logique déclarative Terse. Essayez de cliquer sur le nom de la langue!
Adám
3

Gelée , 9 octets

sṢ€ŒHUÐeF

Essayez-le en ligne!

M. Xcoder
la source
1
Je ne comprends pas pourquoi ce langage de programmation existe.
Sam Orozco
@SamOrozco Son seul but est de résoudre les problèmes avec un code aussi court que possible.
Adám
Oh vraiment. C'est super.
Sam Orozco
2

Japt , 10 octets

òV ®nÃÇwÃc

Also 10 bytes
òV mn ow c

Essayez-le en ligne!

Luis felipe De jesus Munoz
la source
2

05AB1E (hérité) , 9 octets

ô€{2ä`í«˜

Essayez-le en ligne!

Essayez-le en ligne! dans 05AB1E (réécriture Elixir) - attend que l'entrée soit sur la pile, une méthode d'E / S par défaut.

Kevin est venu avec son propre 11 octets que j'avais l'habitude d'atteindre 10. Ensuite, j'ai trouvé quelque chose d'autre pour 9 octets.

M. Xcoder
la source
Joli. Voici ma solution initiale était comme une alternative de 11 octets: ô€{2äRć€R)˜.
Kevin Cruijssen
1
@KevinCruijssen A obtenu 10 à l'aide de votre approche haha. EDIT : 9 maintenant!
M. Xcoder
Ah, bien. Complètement oublié í. Et beau golf supplémentaire.
Kevin Cruijssen
2

JavaScript (ES6), 82 81 octets

1 octet enregistré grâce à @redundancy

Prend l'entrée comme (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)

Essayez-le en ligne!

Arnauld
la source
Étant donné qu'il aest unidimensionnel, je pense que vous pouvez le remplacer a>[]par a+apour vérifier le cas non vide et enregistrer 1 octet. Une stratégie récursive vraiment intelligente pour partitionner et déterminer quand inverser le tri également!
redondance
@redundancy Cela devrait être sûr en effet. Merci!
Arnauld