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]

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

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




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.


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!


É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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.