Irish Snap: Variant Rules0 s Bolan250Jjns G14:i00_t ediEeSpMa31.

7
\\$\\begingroup\\$

Introduction

Recently, me and a couple of my friends decided to play some cards, and one of them suggested the game 'Irish Snap', which was the inspiration for this challenge. However, I later learnt that the game has a lot of different rules that you can play with, some of which are listed here. The rules that are in this challenge aren't currently listed on that page, hence the name, 'Variant Rules'

The Challenge

Given an array of 3 cards, output a truthy or falsey value depending on if they make a valid snap in a game of Irish snap.

Input

The input will be an array of 3 numbers, ranging from 1-13 inclusive, with 1 representing an ace, 11 representing a jack, 12 representing a queen and 13 representing a king. The input can be in any order of top, middle, bottom.

Rules

The 4 different criteria for if cards make an Irish snap are:

  • The top and middle cards are the same
  • The top and middle cards have a difference of one
  • The top and bottom cards are the same
  • The top and bottom cards have a difference of one

If any of these criteria are met, you must output a truthy value. As well as this, for the two criteria that require the cards to have a difference of one, it 'wraps around', meaning that an ace and a king are considered to have a difference of one, and vice versa.

Test Cases

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
share|improve this question
\\$\\endgroup\\$
  • 1
    \\$\\begingroup\\$ Can we take the cards seperately? Or take input as top, [middle, bottom]? \\$\\endgroup\\$ – Jo King 9 hours ago
  • \\$\\begingroup\\$ sure, you can do both. changed the question to reflect that \\$\\endgroup\\$ – EdgyNerd 9 hours ago
  • \\$\\begingroup\\$ Can we invert the output, i.e return False for valid snaps and vice versa? How about a test case where both middle and bottom are valid? \\$\\endgroup\\$ – Jo King 8 hours ago
  • \\$\\begingroup\\$ Yeah, you can invert the output. Also, added that test case \\$\\endgroup\\$ – EdgyNerd 8 hours ago

10 Answers 10

active oldest votes
4
\\$\\begingroup\\$

Python 3, 38 bytes

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

Try it online!

Returns a non-empty set (truthy) if valid, empty set (falsey) if not. Takes input in order top-middle-bottom, but can be rearranged for same code size.

share|improve this answer
\\$\\endgroup\\$
3
\\$\\begingroup\\$

05AB1E, 7 bytes

α12%ß2‹

Try it online!

Takes inputs as [middle, bottom], top.

α        # absolute difference
 12%     # mod 12
    ß    # minimum
     2‹  # less than 2?
share|improve this answer
\\$\\endgroup\\$
3
\\$\\begingroup\\$

Perl 6, 16 bytes

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

Try it online!

Anonymous whatever lambda that takes input as top, middle, bottom and returns a Junction that evaluates to True or False

share|improve this answer
\\$\\endgroup\\$
  • \\$\\begingroup\\$ Too bad whitespace is required before <, this was the perfect chance to have a heart smiley. \\$\\endgroup\\$ – Grimy 8 hours ago
2
\\$\\begingroup\\$

J, 12 bytes

1 e.2>12||@-

Try it online!

Taking bottom middle as left arg, top as right arg.

original answer taking input as one list

J, 24 bytes

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

Try it online!

  • #:@3 5 The numbers 3 and 5 in binary are 0 1 1 and 1 0 1 which are the masks for the middle/top and bottom/top cards respectively
  • (12||@-/)@# We filter the input with those masks, take the abs value of the resulting differences, then the remainder when divided by 12 (for the ace-king case)
  • 1 e.2> are either of the resulting numbers less than 2, ie, 0 or 1?
share|improve this answer
\\$\\endgroup\\$
2
\\$\\begingroup\\$

JavaScript (ES6), 29 bytes

Takes input as ([bottom, middle])(top).

The output is inverted.

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

Try it online!


JavaScript (ES6),  37  30 bytes

Saved 1 byte thanks to @Grimy

Takes input as ([bottom, middle])(top).

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

Try it online!

share|improve this answer
\\$\\endgroup\\$
  • \\$\\begingroup\\$ %144 could be %72 \\$\\endgroup\\$ – Grimy 8 hours ago
  • \\$\\begingroup\\$ @Grimy Thanks! FWIW, %13 would also work. \\$\\endgroup\\$ – Arnauld 8 hours ago
1
\\$\\begingroup\\$

Perl 5 -ap, 31 bytes

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

Try it online!

Input:

bottom middle
top

Actually, the order of the middle and bottom doesn't matter.

Output:

0 for false; 1 for true

share|improve this answer
\\$\\endgroup\\$
1
\\$\\begingroup\\$

Pyth, 12 11 bytes

Takes input as [bottom, top, middle] or [middle, top, bottom] (both work). Outputs [] (Falsy in Pyth) if there's no valid snap, a non-empty array otherwise.

f>2%.aT12.+

Try it online!

If a consistent truthy/falsy value is required, add .A in front for +2 bytes. Then output will be True or False.

Explanation

  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 with a different approach

share|improve this answer
\\$\\endgroup\\$
1
\\$\\begingroup\\$

Jelly, 6 bytes

ạ%12ṠƑ

Try it online!

share|improve this answer
\\$\\endgroup\\$
1
\\$\\begingroup\\$

Charcoal, 12 bytes

›²⌊﹪↔⁻E²NN¹²

Try it online! Port of @Grimy's answer. Takes input as three separate values bottom, middle, top, and outputs using Charcoal's default Boolean format of - for true, nothing for false. Explanation:

 ²              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
share|improve this answer
\\$\\endgroup\\$
0
\\$\\begingroup\\$

C (gcc), 47 43 bytes

f(b,m,t){return(1<<t-m|1<<t-b)&0x80101003;}

Try it online!

share|improve this answer
\\$\\endgroup\\$

Your Answer

If this is an answer to a challenge…

  • …Be sure to follow the challenge specification. However, please refrain from exploiting obvious loopholes. Answers abusing any of the standard loopholes are considered invalid. If you think a specification is unclear or underspecified, comment on the question instead.

  • …Try to optimize your score. For instance, answers to code-golf challenges should attempt to be as short as possible. You can always include a readable version of the code in addition to the competitive one. Explanations of your answer make it more interesting to read and are very much encouraged.

  • …Include a short header which indicates the language(s) of your code and its score, as defined by the challenge.

More generally…

  • …Please make sure to answer the question and provide sufficient detail.

  • …Avoid asking for help, clarification or responding to other answers (use comments instead).

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged code-golf decision-problem cards or ask your own question.

Popular posts from this blog

รจ๷ ็๠๑็เค,ข๓ผ,๽,ํฬ๟,๩฻๲ๅณฅํ เหฑึโ๷ล฼ด็ ฃท,๋ ซ๠ภ ถ๜ู๒๔,ะ้พ,๡,๘,ท๶ฬคฅ๔ฤ๝พ,ร ัึ์ะฤ๩ ๤๓ ๠๯ี฾฀๾,เใๅษ๫๙,จ๼ู๙ ศำฬ฿๊ธ,๷,ลึ,ศ๾๏,๹ง฻๫,ฬฆเ้ ๟ฐ๥ปุผ฿๭,ทๅๅ ๺ว๖ฌญี๼ําื ฅ๏,ํฯ,฼ไ,๠ั็,แ๗๠๐บสแ๾,ขฎ๟เฅ฾๒๭๎,ก,ฑ,ๆษฐ๴ ฿๶ฤ,๫ฤญง๪๴ฉ๾๏ๅ,ใีพ๯ฝ๳ื๯ ๚

๶ ๚ม่ ๧ ๒฿เญ฿ฎฐกช๙ธ,ชฅ ฒ,๗๧๧อฃล๏ผ๡,๾ฎ๼ขลฝ๴๿๹รม๗๗ณ ๒,ฉ๪ต๮ท๢ฬฯฟูณ๫กฟค๾ ย๵฿สื฀,ยืฬ๵ส ฝ฾

n F ли00 I50coi Fft eEe .osH RCc] six 0imd389|tiMm uKk Ee2x u u506j xH Rsio.oshumCaczp ►ВCd i N L dкGm ]Aay0 cb Oo m BsX1 p N0 MpotgеsJj h ICc sNniki506Kk o Pul 123qO ax Zzb Qq O Bv dIiOj 2diрg H FfH J V mds 892% ла2dtz ng X8Rrкmonk fКы►гsrын[ X0aCCitaXi c