Вот вам загадка программирования:
Например, при наличии списка пар строк и соответствующих чисел [[A,37],[B,27],[C,21],[D,11],[E,10],[F,9],[G,3],[H,2]]
выведите другой список, в котором будут только строки следующим образом:
Общее количество любой строки должно быть точно равно ее соответствующему числу во входных данных.
Никакая строка не должна повторяться рядом в последовательности, и каждая строка должна появляться в списке вывода.
Выбор следующей строки должен выполняться случайным образом, если они не нарушают два правила. Каждое решение должно иметь ненулевую вероятность быть выбранным.
Если комбинация невозможна, вывод должен быть просто
0
.
Список ввода может быть задан в любом порядке (отсортирован или не отсортирован), а строки в списке могут иметь любую длину.
Пример вывода для приведенного выше примера ввода 1
[A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,G,H,G,H,G]
Пример ввода 2:
[[A,6],[B,1],[C,1]]
Выход для второго входа:
0
так как список невозможен по правилам.
Пример ввода 3:
[[AC,3],[BD,2]]
действительный вывод: [AC,BD,AC,BD,AC]
неверный вывод: [AC,BD,AC,AC,BD]
Если необходимы дальнейшие разъяснения, пожалуйста, не стесняйтесь, сообщите мне в комментариях, и я буду действовать незамедлительно.
Это код-гольф , поэтому выигрывает самый короткий код в байтах для каждого языка!
Ответы:
Желе , 11 байт
Попробуйте онлайн!
источник
Œṙ
бы не векторизация, она бы работала без'
Желе , 17 байт
Попробуйте онлайн!
источник
["A", 100], ["B", 3]
Я думаю, что когда я пытаюсь ничего не выводить, он застрял.Œ!
будет иметь 99029007164861804075467152545817733490901658221144924830052805546998766658416222832146510162228321414102382832143849265351638597729209322288213441514989158400000000000000000000.O(n!)
но оно короткое и скорость не имеет значения. Не пытайтесь делать это с чем-то, где числа вŒṙ
помочь?["AT", 3], ["B", 3]
и получил вTBATATBAB
качестве вывода, что неправильноPython 2 ,
114189185174 байтаПопробуйте онлайн!
Ой! Гораздо сложнее с правилом 3 ... :). Все еще пытаюсь избежать
O(n!)
подхода, чтобы он мог справиться со всеми тестовыми случаями за некоторое время до тепловой смерти вселенной ...Алгоритм: предположим, что общая сумма количества строк равна
t
. Если какая-либо строка имеет счетn
с2*n>t+1
, то выполнить ограничения невозможно. Поэтому, если любая строка (исключая ранее выбранную) имеет счетn
с2*n=t+1
, то мы должны выбрать эту строку следующей. В противном случае мы можем произвольно выбрать любую строку, которая не является ранее выбранной строкой.источник
R ,
148141 байтПопробуйте онлайн! (Я скопировал
combinat::permn
и назвал этоcombinatXXpermn
туда.)Грубая сила O (n!) Решение.
Использует
permn
изcombinat
пакета для генерации всех возможных заказов. Затем проверяет, соответствуют ли какие-либо правила, и выбирает один из них наугад.источник
n<-sum(n|1)
Я считаю, что это на байт короче. Но причудаsample
с длиной один ввод здесь довольно неприятна.JavaScript, 112 байт
Первый проход на этом, больше игры в гольф (надеюсь) следовать.
Попробуйте онлайн
источник
J,
6053 байта-7 благодаря FrownyFrog
оригинал
ungolfed
Предложения по улучшению приветствуются.
Попробуйте онлайн!
источник
[:*/2~:/\|:
в дваJavaScript (ES6), 160 байт
Попробуйте онлайн!
источник
Древесный уголь , 38 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Повторите, пока есть хотя бы один ненулевой счет.
Найти любой счет, который составляет более половины от остатка.
Если его не было, просто возьмите ненулевые отсчеты, отфильтрованные ранее.
Отфильтруйте строку, которая была выведена в прошлый раз.
Присвойте случайный элемент из первого непустого из двух приведенных выше списков последней выходной строке. Обратите внимание, что если ввести невозможную комбинацию, в этот момент программа завершится сбоем.
Распечатать строку.
Уменьшить его количество.
источник
["h4x0r", 1337]
включенной в качестве строки.Рубин , 85 байт
Подход грубой силы (спасибо Ионе за идею).
Попробуйте онлайн!
Рубин ,
108 10096 байтРанее подход Богосорт
Попробуйте онлайн!
источник
Ржавчина 633 байта
То, что делает это немного отличным от других, - то, что это началось с идеи переставить последовательности, моделируя физическую систему. Каждая строка сначала дублируется соответствующее количество раз. Затем каждая отдельная строка рассматривается как частица в пространстве. Две частицы с одинаковым строковым значением «отталкивают» друг друга, а две частицы с разными значениями притягивают друг друга. Например, если мы начнем с AAAAAAABBBBCC, As будут отталкивать друг друга, удаляясь друг от друга, позволяя B перемещаться между ними. Со временем это достигает хорошей смеси частиц. После каждой итерации «движения частиц» программа проверяет, что ни одна из частиц не является смежной, затем останавливается и печатает состояние системы, которое представляет собой просто список строк по порядку, как они появляются в одномерном пространстве.
Теперь, когда речь заходит о фактической реализации этой физической системы, она изначально использовала старомодную демонстрационную / игровую технику ПК, чтобы сохранять положение и скорость каждой частицы в виде чисел, а затем проходить итерации для обновления положения и скорости. На каждой итерации мы добавляем скорость к позиции (движение) и добавляем ускорение к скорости (изменение скорости движения) и вычисляем ускорение (находя силу на частице). Для упрощения система не рассчитывает силу для каждой частицы на основе всех других частиц - она только проверяет частицы, непосредственно примыкающие к ней. Был также эффект «демпфирования», чтобы частицы не ускорялись слишком сильно и улетали в бесконечность (например, скорость уменьшается на x процентов за каждый шаг).
Однако в процессе игры в гольф все это было существенно сокращено и упрощено. Теперь вместо двух одинаковых частиц отталкивающих друг друга, они просто «телепортируются». Различные частицы просто «скотча», чтобы предотвратить застой в системе. Например, если А рядом с А, он будет телепортироваться. Если A находится рядом с B, оно будет слегка сдвигаться. Затем он проверяет, выполняются ли условия (нет похожих на соседние частицы) и печатает строки по порядку, основываясь на их положении в 1-м пространстве. Это почти больше похоже на алгоритм сортировки, чем на симуляцию - с другой стороны, алгоритмы сортировки можно рассматривать как форму симулированного «дрейфа», основанного на «массе». Я отвлекся.
В любом случае, это одна из моих первых программ на Rust, поэтому я сдался после нескольких часов игры в гольф, хотя там еще могут быть возможности. Немного сложный анализ Он читает строку ввода из стандартного ввода. При желании это можно заменить на "let mut s =" [[A, 3], [B, 2]] ". Но сейчас я делаю 'echo [[A, 3], [B, 2]] | грузовой пробег »в командной строке.
Расчет остановки - небольшая проблема. Как определить, будет ли достигнуто действительное состояние системы? Первый план состоял в том, чтобы обнаружить, повторяет ли когда-либо «текущее» состояние старое состояние, например, если ACCC изменяется на CACC, но затем обратно в ACCC, мы знаем, что программа никогда не прекратит работу, поскольку она является только псевдослучайной. Затем он должен сдаться и вывести 0, если это произошло. Однако это выглядело как огромный объем кода Rust, поэтому я просто решил, что если он пройдет большое количество итераций, он, вероятно, зависнет и никогда не достигнет устойчивого состояния, поэтому он печатает 0 и останавливается. Как много? Количество частиц в квадрате.
Код:
источник
regex
ящика.JavaScript (Node.js) , 249 байт
Попробуйте онлайн!
источник
Ява (JDK 10) , 191 байт
Попробуйте онлайн!
Это никогда не вернется, если нет решений.
источник