Snap irlandês: regras de variantes


13

Introdução

Recentemente, eu e alguns amigos decidimos jogar algumas cartas, e um deles sugeriu o jogo 'Irish Snap', que foi a inspiração para esse desafio. No entanto, aprendi mais tarde que o jogo tem muitas regras diferentes com as quais você pode jogar, algumas das quais estão listadas aqui . As regras deste desafio não estão atualmente listadas nessa página; portanto, o nome 'Regras de variantes'

O desafio

Dado um conjunto de 3 cartas, produza um valor de verdade ou falsey, dependendo se eles fazem um snap válido em um jogo de snap irlandês.

Entrada

A entrada será uma matriz de 3 números, variando de 1 a 13, inclusive, com 1 representando um ás, 11 representando um valete, 12 representando uma rainha e 13 representando um rei. A entrada pode estar em qualquer ordem de cima, meio, baixo.

Regras

Os 4 critérios diferentes para se os cartões fazem um snap irlandês são:

  • As cartas superior e média são as mesmas
  • As cartas superior e média têm uma diferença de um
  • Os cartões superior e inferior são os mesmos
  • As cartas superior e inferior têm uma diferença de um

Se qualquer um desses critérios for atendido, você deverá gerar um valor verdadeiro. Além disso, para os dois critérios que exigem que as cartas tenham uma diferença de um, ele se "envolve", o que significa que um ás e um rei são considerados como tendo uma diferença de um e vice-versa.

Casos de teste

Input (Bottom, Middle, Top) -> Output
1 13 7 -> False
1 4 13 -> True
9 3 6 -> False
8 9 7 -> True
2 6 5 -> True
12 5 11 -> True
10 4 8 -> False
12 13 7 -> False
9 7 10 -> True
7 3 1 -> False
4 2 3 -> True

2
Podemos pegar os cartões separadamente? Ou assuma a entrada como top, [middle, bottom]?
Jo rei

claro, você pode fazer as duas coisas. mudou a questão para refletir que
EdgyNerd

Podemos inverter a saída, ou seja, retornar False para snaps válidos e vice-versa? Que tal um caso de teste em que o meio e o fundo sejam válidos?
Jo rei

Sim, você pode inverter a saída. Além disso, adicionou esse caso de teste
EdgyNerd 22/08/19

Os valores de saída devem ser consistentes ou poderíamos, por exemplo, gerar 0para falsee qualquer outro número inteiro para true, ou mesmo qualquer número inteiro negativo para falseou qualquer número inteiro positivo para true?
Shaggy

Respostas:


4

Python 3 , 38 bytes

lambda x,y,z:{x-y,x-z}&{0,1,12,-1,-12}

Experimente online!

Retorna um conjunto não vazio (verdade) se válido, conjunto vazio (falsey) se não. Recebe a entrada na ordem superior-média-inferior, mas pode ser reorganizada para o mesmo tamanho de código.


4

Perl 6 , 16 bytes

3>(*-(*|*)+1)%13

Experimente online!

Anônimo, seja qual for o lambda que recebe entrada como top, middle, bottome retorna uma junção avaliada como True ou False


Muito ruim espaço em branco é necessário antes <, esta foi a chance perfeita para ter um sorriso no coração.
Grimmy

3

05AB1E , 7 6 bytes

α12%ß!

Experimente online!

Toma entradas como [middle, bottom], top.

α        # absolute difference
 12%     # mod 12
    ß    # minimum
     !   # factorial

Apenas 1 é verdade em 05AB1E. 0! e 1! são ambos 1, enquanto nenhum outro número tem um fatorial de 1.


2

J , 12 bytes

1 e.2>12||@-

Experimente online!

Tomando a parte inferior central como arg esquerdo, e em cima como arg direito.

resposta original, tendo como entrada uma lista

J , 24 bytes

1 e.2>#:@3 5(12||@-/)@#]

Experimente online!

  • #:@3 5Os números 3 e 5 em binário são 0 1 1e 1 0 1quais são as máscaras para os cartões médio / superior e inferior / superior, respectivamente
  • (12||@-/)@# Nós filtramos a entrada com essas máscaras, pegamos o valor abs das diferenças resultantes e o restante quando dividido por 12 (para o caso do ás-rei)
  • 1 e.2> algum dos números resultantes é menor que 2, ou seja, 0 ou 1?

2

JavaScript (ES6), 29 bytes

Toma entrada como ([bottom, middle])(top).

A saída é invertida.

a=>c=>a.every(n=>(n-c)/2%6|0)

Experimente online!


JavaScript (ES6),  37  30 bytes

Guardado 1 byte graças a @Grimy

Toma entrada como ([bottom, middle])(top).

a=>c=>a.some(n=>(n-=c)*n%72<2)

Experimente online!


%144possível%72
Grimmy

@ Grimy Thanks! FWIW, %13também funcionaria.
Arnauld

2

Carvão , 12 bytes

›²⌊﹪↔⁻E²NN¹²

Experimente online! Porto da resposta do @ Grimy. Recebe a entrada como três valores separados, inferior, médio, superior e saídas usando o formato booleano padrão do Charcoal -para true, nada para false. Explicação:

 ²              Literal 2
›               Is greater than
  ⌊             Minimum of
    ↔            Absolute value of (vectorised)
      E²N       First two numeric inputs as a list ([bottom, middle])
     ⁻          Minus (vectorised)
         N      Third input (top)
   ﹪            Modulo (vectorised)
          ¹²    Literal 12

1

Perl 5 -ap , 31 bytes

$t=<>}{$\|=abs($t-$_)%12<2for@F

Experimente online!

Entrada:

bottom middle
top

Na verdade, a ordem do meio e do fundo não importa.

Resultado:

0para falso; 1de verdade


1

Pitão , 12 11 bytes

Recebe entrada como [bottom, top, middle]ou [middle, top, bottom](ambos funcionam). Saídas [](Falsy in Pyth) se não houver snap válido, caso contrário, uma matriz não vazia.

f>2%.aT12.+

Experimente online!

Se um valor consistente de verdade / falsidade for necessário, adicione .Ana frente por +2 bytes. Então a saída será Trueou False.

Explicação

  f             # Filter on lambda T:
   >2           # 2 > 
      .aT       #     abs(T)
     %   12     #            % 12
           .+   # the list of deltas (difference between consecutive elements)

.A (if required)# Any truthy values in the above list?

Edit: -1 com uma abordagem diferente







0

[R], 23 bytes

recebe entrada como a = c (inferior, superior, intermediário):

any(abs(diff(a))%%12<2)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.