Dar um desafio envolvendo uma referência de Star Trek logo após 4 de maio pode ser desaprovado, mas aqui vai.
Você, Luke, Anakin, Palpatine, Yoda e Han Solo estão envolvidos em um torneio insano de Rock, Paper, Scissor, Lizard, Spock.
O problema aqui é que você só pode usar uma ordem fixa de movimentos. Se o seu pedido for "R", você deverá usar o Rock até perder ou vencer contra todos. Se o seu pedido for RRV, você deverá usar 2 Rocks seguidas por um Spock e continuar repetindo até ganhar ou perder.
Luke, Anakin, Palpatine, Yoda e Han Solo enviaram seus respectivos pedidos e você, sendo um hacker experiente, colocou as mãos em cada um deles!
Com esse conhecimento, você deve criar seus pedidos para o torneio. Como todos querem vencer, você deseja criar uma ordem para vencer o torneio vencendo todos. Mas isso pode não ser possível em todas as circunstâncias.
Caso haja uma possível ordem vencedora, imprima-a. Se não houver uma maneira possível de ganhar, imprima -1 (ou 0 ou Falso ou "impossível")
Entrada : uma lista de 5 pedidos
Saída : uma única ordem ou -1
Entrada de amostra 1
R
P
S
L
V
Saída de amostra 1
-1
Explicação 1
Não importa o que você jogue na sua primeira jogada, haverá pelo menos uma pessoa que o derrotará; portanto, não é possível que você vença.
Entrada de amostra 2
RPS
RPP
R
SRR
L
Saída de amostra 2
RPSP
Explicação 2
Depois de tocar Rock no seu primeiro movimento, você acaba batendo "L" e "SRR" e empatando com o resto. Isso ocorre porque o Lagarto e a Tesoura perdem para o Rock. Quando você jogar Paper em seguida, você vencerá "R" e empatará contra os 2. restantes. Isso ocorre porque o Rock perde para o Paper. Quando você jogar Scissors em seguida, você vencerá "RPP", pois Scissor bate Paper.
Por fim, você vencerá "RPS" com o seu Paper, já que o Paper vence o Rock.
Aqui está uma lista de notações (você pode usar 5 literais, mas especifique na sua resposta):
R : Rock
P : Paper
S : Scissor
L : Lizard
V : Spock
Aqui está uma lista de todos os resultados possíveis:
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
Isso é código-golfe , e o menor número de bytes vence.
PS: Entre em contato se precisar de mais casos de teste.
Respostas:
Gelatina , 29 bytes
Um link monádico que aceita uma lista de listas de números inteiros (cada qual é a estratégia de um oponente) que produz uma lista de listas de números inteiros - cada um dos quais é uma estratégia vencedora (portanto, uma lista vazia, se não for possível).
(Basta adicionar
Ḣ
para gerar apenas uma única lista de estratégia ou,0
se impossível).Experimente online! (os formatos de rodapé para mostrar sempre as listas)
Ou tente uma versão mapeada por carta (onde as estratégias são tomadas e mostradas em suas próprias linhas usando a
RPSVL
notação).Quão?
Os números são escolhidos de modo que qualquer número ímpar maior que outro módulo cinco vence (ou seja, eles são numerados, contornando a borda de um pentágono inscrito dos arremessos).
O código reproduz cada estratégia contra todas as estratégias (inclusive elas mesmas) por duas vezes mais arremessos do que a estratégia mais longa, de modo a garantir que os perdedores mantenham aqueles que não foram derrotados. A lista de estratégias resultante conterá uma única estratégia se houver um vencedor definitivo; nenhuma estratégia se não houvesse vencedor; ou várias estratégias se houver jogadores de desenho. Depois disso, um conjunto vencedor de movimentos é anexado a cada uma dessas estratégias.
fonte
ZLḤ
porLÄ
.Ɗ
seu código, ele nem está fazendo o que você pensou - está moldando cada um como seu próprio comprimento, obtendo as somas cumulativas desses resultados, então também comparará valores incorretos. Tente isso, por exemplo - ele absorve[[1,2,3,4,5],[6,7],[8]]
, molda cada um pelo comprimento de toda a lista (3) para obter e, em[[1,2,3],[6,7,6],[8,8,8]]
seguida, realiza a acumulação para obter[[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 bytesRecebe a entrada como uma matriz de cadeias de dígitos, com:
Experimente online!
Quão?
Esta é uma pesquisa abrangente: primeiro tentamos todos os movimentos em uma determinada etapa para ver se podemos ganhar o jogo. Se não podemos vencer agora, tentamos adicionar outra jogada a cada jogada não perdida.
onde
and
exor
são operadores bit a bit.Comentado
fonte
test(['P','P','S','P','P'])
A resposta deve ser "SR" ou "SV".R ,
213190 bytes-23 bytes graças a Giuseppe.
Experimente online!
Se existe uma solução, ela gera uma. Se não houver solução, ela gera uma linha de
NA
. Se esse formato de saída não for aceitável, eu posso alterá-lo a um custo de alguns bytes.Os movimentos são codificados como 1 = R, 2 = S, 3 = P, 4 = L, 5 = V, de modo que a matriz de resultados é
(0 = nenhum vencedor; 1 = jogador 1 vence; 2 = jogador 2 vence)
Um limite superior do comprimento da solução, se existir, é
n=sum(lengths(L))
ondeL
está a lista de movimentos dos oponentes. O código cria todas as estratégias possíveis de comprimenton
(armazenadas na matrizv
), tenta todas elas e exibe todas as estratégias vencedoras.Observe que esse valor
n
torna o código muito lento no TIO, portanto, eu o codifiquei no TIO, on=4
que é suficiente para os casos de teste.Para o primeiro caso de teste, a saída é
correspondente à solução RLSL.
Para o segundo caso de teste, a saída é
o que significa que não há solução.
Explicação de uma versão anterior (será atualizada quando puder):
o
which
é necessário para se livrar da AN que ocorrem quando os dois jogadores desenhar para sempre.Não estou convencido de que essa seja a estratégia mais eficiente. Mesmo se for, tenho certeza de que o código para
m
poderia ser um pouco golfado.fonte
lengths()
alias sempre retorna4
?v
...lengths
n=4
Emacs Lisp, 730 bytes
Não encontrei um intérprete on-line do Emacs Lisp :( Se você possui o Emacs instalado, pode copiar o código em um
.el
arquivo, copie algumas linhas de teste abaixoe execute
$ emacs --script filename.el
.Como funciona
Meu programa faz uma pesquisa profunda com as vezes descobrindo que é impossível vencer e encerrar o ramo em que está.
Você pode ver uma explicação completa na versão não abreviada do código:
fonte