Codegolf Rainbow: сортировка цветов с отражением

9

Введение:

После того, как я опубликовал две задачи, связанные с радугой: Codegolf Rainbow: Fun с целочисленными массивами 1 и Codegolf Rainbow: Draw in Black-and-White 2 , @ChrisM сделал следующий комментарий в ASCII ( Draw in черно-белый ) вызов :

Может быть, вы это знаете, и это по замыслу (я знаю, что радуги тоже не ромбы и не аски, а позиции высших порядков усложняются), но разве цвета не меняются во 2-й радуге?

И он действительно прав. Когда вы видите двойную радугу, вторая на самом деле является отражением первой, поэтому цвета меняются местами. С тремя радугами это настоящая двойная радуга, а третья является отражением одной из двух других. А с четырьмя - две радуги и два их отражения.
введите описание изображения здесь

Итак, давайте сделаем третью связанную проблему, используя этот факт.

Вызов:

Входы: Положительное целое число , nкоторое является >=2и список целых чисел размера >= n+1.
Вывод: тот же список упорядочен следующим образом:

  1. Сначала разбейте входные списки на подсписки размера n(где конечный подсписок может иметь любой размер в диапазоне [1,n]).
  2. Затем мы делаем следующее на основе количества подсписков m:
    • Сортировать первое m - m//2количество подсписков от наименьшего к наибольшему (где //деление целого числа). (То есть с 6 подсписками первые три будут отсортированы от самого низкого до самого высокого; с 5 подсписками первые три будут отсортированы от самого низкого до самого высокого.)
    • Сортировка последнего m//2количества подсписков от наивысшего к наименьшему (где //деление целого числа). (То есть с 6 подсписками последние три будут отсортированы от самого высокого к низшему; с 5 подсписками последние два будут отсортированы от самого высокого до самого низкого.)
  3. Объедините все подсписки, чтобы снова сформировать единый список.

Примеры:

Входы: n=7и [3,2,1,-4,5,6,17,2,0,3,5,4,66,-7,7,6,-5,2,10]
Шаг 1: [[3,2,1,-4,5,6,17],[2,0,3,5,4,66,-7],[7,6,-5,2,10]]
Шаг 2: [[-4,1,2,3,5,6,17],[-7,0,2,3,4,5,66],[10,7,6,2,-5]]
Шаг 3 / Выход:[-4,1,2,3,5,6,17,-7,0,2,3,4,5,66,10,7,6,2,-5]

Входы: n=4и [7,4,-8,9,3,19,0,-23,-13,13]
Шаг 1: [[7,4,-8,9],[3,19,0,-23],[-13,13]]
Шаг 2: [[-8,4,7,9],[-23,0,3,19],[13,-13]]
Шаг 3 / Выход:[-8,4,7,9,-23,0,3,19,13,-13]

Правила вызова:

  • Целочисленный ввод nгарантированно будет больше 1.
  • Размер целочисленного списка гарантированно будет больше, чем n.
  • Задний подсписок может быть меньше, чем n(как видно из примеров и тестовых случаев).
  • Формат ввода / вывода является гибким в любом разумном формате. Может быть списком / массивом целых или десятичных чисел, строкой с разделителями-запятыми / пробелами / символом новой строки, потоком целых чисел и т. Д. (Вывод не может быть двухмерным списком списков, как в шаге 2. Шаг 3, чтобы свести его обратно в один список требуется для этого вызова.)

Основные правила:

  • Это , так что кратчайший ответ в байтах выигрывает.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.

Тестовые случаи:

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]
Кевин Круйссен
источник

Ответы:

5

Брахилог , 18 17 16 байт

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

Попробуйте онлайн!

-1 байт благодаря @sundar

Ожидает ввода как [<integer list>, n]. Обратите внимание, что отрицательные целые числа представлены с _помощью «низкого минуса» Брахилога. Выходная переменная есть R.

Первый раз, когда я делаю попытку Brachylog, так что я думаю, что он неоптимален и созрел для сокращения в байтах.

объяснение

Разделение, раздвоение, сортировка по индексу (0: asc, 1: desc), выравнивание.

ġ₎               | 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
избыточность
источник
Небольшая настройка вашего второго решения, чтобы получить 17 байтов: попробуйте онлайн!
sundar - Восстановить Монику
@sundar У меня было скрытое подозрение, что я наносил на карту слишком много, спасибо!
резервирование
Для чего этот язык?
Сэм Ороско,
@SamOrozco Краткое декларативное логическое программирование. Попробуйте нажать на название языка!
Адам
3

Желе , 9 байт

sṢ€ŒHUÐeF

Попробуйте онлайн!

Мистер Xcoder
источник
1
Я не понимаю, почему этот язык программирования существует.
Сэм Ороско,
@SamOrozco Единственная цель - решить проблемы с максимально коротким кодом.
Адам
Да неужели. Это классно.
Сэм Ороско
2

05AB1E (legacy) , 9 байтов

ô€{2ä`í«˜

Попробуйте онлайн!

Попробуйте онлайн! в 05AB1E (перезапись Elixir) - ожидает ввода в стеке, метод ввода / вывода по умолчанию.

Кевин придумал свой собственный 11-байтовый код, который я имел обыкновение получать до 10. Затем я придумал что-то еще для 9 байтов.

Мистер Xcoder
источник
Хороший. Здесь было мое первоначальное решение , как 11-байтовой альтернатива: ô€{2äRć€R)˜.
Кевин Круйссен
1
@KevinCruijssen Получил 10, используя ваш подход, ха-ха. РЕДАКТИРОВАТЬ : 9 сейчас!
г-н Xcoder
Ах, хорошо. Полностью забыл про í. И приятный дополнительный гольф.
Кевин Круйссен
2

JavaScript (ES6), 82 81 байт

Сохранено 1 байт благодаря @redundancy

Принимает вход как (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)

Попробуйте онлайн!

Arnauld
источник
Так как aодномерный, я полагаю , вы можете заменить a>[]с , a+aчтобы проверить , не пустой случай и сохранить 1 байт. Действительно умная стратегия восстановления и разбиения, а также определения, когда нужно изменить сортировку!
резервирование
@ redundancy Это должно быть действительно безопасно. Спасибо!
Арно