Вызов, включающий ссылку на «Звездный путь» сразу после 4-го мая, может быть неодобрительным, но здесь идет.
Вы, Люк, Анакин, Палпатин, Йода и Хан Соло участвуете в безумном турнире Рок, Бумага, Ножницы, Ящерица, Спок.
Подвох в том, что вам разрешено использовать только фиксированный порядок ходов. Если ваш ордер "R", то вы должны использовать Рок, пока не проиграете или не выиграете у всех. Если ваш ордер RRV, то вы должны использовать 2 Камня, за которыми следует Спок, и повторять до тех пор, пока вы не выиграете или не проиграете.
Люк, Анакин, Палпатин, Йода и Хан Соло представили свои соответствующие заказы, и вы, будучи опытным хакером, получили в свои руки каждый из них!
Обладая этими знаниями, вы должны разработать свой заказ на турнир. Поскольку все хотят выиграть, вы хотите создать такой порядок, чтобы выиграть турнир, обыграв всех. Но это может быть невозможно при любых обстоятельствах.
Если есть возможный выигрышный ордер, распечатайте его. Если у вас нет возможности выиграть, выведите -1 (или 0 или Ложь или «невозможно»).
Вход : список из 5 заказов
Выход : один заказ или -1
Пример ввода 1
R
P
S
L
V
Пример вывода 1
-1
Объяснение 1
Независимо от того, что вы играете в своем первом движении, будет хотя бы один человек, который побьет вас, поэтому вы не сможете выиграть.
Пример ввода 2
RPS
RPP
R
SRR
L
Пример вывода 2
RPSP
Объяснение 2
После того, как вы сыграете Рок в своем первом движении, вы в конечном итоге выиграете «L» и «SRR» и сыграете вничью с остальными. Это потому, что Ящерица и Ножницы проигрывают Року. Когда вы будете играть в «Бумагу» дальше, вы будете бить «R» и связываться с оставшимися 2. Это потому, что «Рок» проигрывает «Бумаге». Когда вы будете играть Ножницами дальше, вы выиграете у «RPP», поскольку Ножницы бьют Бумагу.
Наконец, вы будете бить «RPS» с вашей бумагой, как бумага бьет рок.
Вот список обозначений (вы можете использовать любые 5 литералов, но, пожалуйста, укажите в своем ответе):
R : Rock
P : Paper
S : Scissor
L : Lizard
V : Spock
Вот список всех возможных результатов:
winner('S', 'P') -> 'S'
winner('S', 'R') -> 'R'
winner('S', 'V') -> 'V'
winner('S', 'L') -> 'S'
winner('S', 'S') -> Tie
winner('P', 'R') -> 'P'
winner('P', 'V') -> 'P'
winner('P', 'L') -> 'L'
winner('P', 'S') -> 'S'
winner('P', 'P') -> Tie
winner('R', 'V') -> 'V'
winner('R', 'L') -> 'R'
winner('R', 'S') -> 'R'
winner('R', 'P') -> 'P'
winner('R', 'R') -> Tie
winner('L', 'R') -> 'R'
winner('L', 'V') -> 'L'
winner('L', 'S') -> 'S'
winner('L', 'P') -> 'L'
winner('L', 'L') -> Tie
winner('V', 'R') -> 'V'
winner('V', 'L') -> 'L'
winner('V', 'S') -> 'V'
winner('V', 'P') -> 'P'
winner('V', 'V') -> Tie
Это код-гольф , поэтому выигрывает меньше байтов.
PS: Дайте мне знать, если вам нужно больше тестов.
Ответы:
Желе , 29 байт
Монадическая ссылка, которая принимает список списков целых чисел (каждый из которых является стратегией противника), который выдает список списков целых чисел, каждый из которых является выигрышной стратегией (поэтому пустой список, если ни один из них невозможен).
(Просто добавьте,
Ḣ
чтобы получить только один список стратегий или,0
если это невозможно.)Попробуйте онлайн! (форматы нижнего колонтитула всегда показывают списки)
Или попробуйте версию с буквенным отображением (где стратегии взяты и показаны в собственных строках с использованием
RPSVL
нотации).Как?
Числа выбираются так, чтобы любое число, которое является нечетным числом больше, чем другой выигрыш по модулю пять (то есть они пронумерованы, проходя по краю вписанного пятиугольника бросков).
Код разыгрывает каждую стратегию против каждой стратегии (включая их самих) на два раза больше бросков, чем самая длинная стратегия, с тем чтобы найти проигравших с теми, кто не побежден. Результирующий список стратегий будет содержать одну стратегию, если есть явный победитель; нет стратегий, если не было победителя; или несколько стратегий, если есть игроки розыгрыша. После этого выигрышный набор ходов добавляется к каждой из этих стратегий.
источник
ZLḤ
наLÄ
.Ɗ
в вашем коде он даже не делает то, о чем вы, возможно, думали - он формирует каждый как его собственную длину, а затем получает кумулятивные суммы этих результатов, поэтому также сравнивает неверные значения. Попробуйте это, например, - он принимает[[1,2,3,4,5],[6,7],[8]]
, формирует каждую по длине всего списка (3), чтобы получить,[[1,2,3],[6,7,6],[8,8,8]]
затем выполняет накопление, чтобы получить[[1,1+2,1+2+3],[6,6+7,6+7+8],[8,8+8,8+8+8]]
=[[1,3,6],[6,13,19],[8,16,24]]
.JavaScript (ES6),
122 115112 байтПринимает ввод как массив строк цифр, с:
Попробуйте онлайн!
Как?
Это поиск в ширину: сначала мы пробуем все ходы на данном шаге, чтобы посмотреть, сможем ли мы выиграть игру. Если мы не можем выиграть прямо сейчас, мы пытаемся добавить еще один ход к каждому не проигрышному ходу.
где
and
иxor
- побитовые операторы.комментарии
источник
test(['P','P','S','P','P'])
подходит для теста: ответ должен быть «SR» или «SV».R ,
213190 байт-23 байта благодаря Джузеппе.
Попробуйте онлайн!
Если решение существует, оно выводит одно. Если решения не существует, выводится строка
NA
. Если этот формат вывода не является приемлемым, я могу изменить его стоимостью в несколько байтов.Ходы кодируются как 1 = R, 2 = S, 3 = P, 4 = L, 5 = V, так что матрица результатов
(0 = нет победителя; 1 = игрок 1 выигрывает; 2 = игрок 2 выигрывает)
Верхняя граница длиной решения , если оно существует,
n=sum(lengths(L))
гдеL
список ходов противников. Код создает все возможные стратегии длиныn
(хранится в матрицеv
), пробует их все и отображает все выигрышные стратегии.Обратите внимание, что это значение
n
делает код очень медленным на TIO, поэтому я жестко закодировал в TIO,n=4
что достаточно для тестовых случаев.Для первого тестового случая вывод
соответствующий решению RLSL.
Для второго контрольного примера вывод
Это означает, что нет решения.
Объяснение предыдущей версии (обновлю, когда смогу):
which
Необходимо избавиться от ВПЛ , которые происходят , когда два игрока нарисовать навсегда.Я не уверен, что это самая эффективная стратегия. Даже если это так, я уверен, что код для
m
может быть немного в гольфе.источник
lengths()
псевдоним всегда возвращаться4
?v
...lengths
чтобы заставить егоn=4
работать, потому что в противном случае все это занимает слишком много времени.Emacs Lisp, 730 байт
Я не нашел онлайн-переводчика Emacs Lisp :( Если у вас установлен Emacs, вы можете скопировать код в
.el
файл, скопируйте несколько строк тестирования нижеи запустить его
$ emacs --script filename.el
.Как это устроено
Моя программа выполняет поиск в глубину, иногда выясняя, что невозможно выиграть, и заканчивая ветку, в которой она находится.
Вы можете увидеть полное объяснение в не сокращенной версии кода:
источник