Irish Snap: Variantenregeln

13

Einführung

Kürzlich beschlossen ich und ein paar meiner Freunde, ein paar Karten zu spielen, und einer von ihnen schlug das Spiel 'Irish Snap' vor, das die Inspiration für diese Herausforderung war. Später erfuhr ich jedoch, dass das Spiel viele verschiedene Regeln enthält, mit denen Sie spielen können, von denen einige hier aufgelistet sind . Die Regeln, die in dieser Herausforderung enthalten sind, sind derzeit nicht auf dieser Seite aufgeführt, daher der Name "Variantenregeln".

Die Herausforderung

Geben Sie bei einer Reihe von 3 Karten einen Wahrheits- oder Falschgeldwert aus, je nachdem, ob sie in einem irischen Snap-Spiel einen gültigen Snap erzielen.

Eingang

Die Eingabe besteht aus einem Array von 3 Zahlen mit einem Bereich von 1 bis einschließlich 13, wobei 1 ein Ass darstellt, 11 einen Buben, 12 eine Dame und 13 einen König. Die Eingabe kann in einer beliebigen Reihenfolge von oben, Mitte und unten erfolgen.

Regeln

Die 4 verschiedenen Kriterien für einen Irish Snap sind:

  • Die oberen und mittleren Karten sind gleich
  • Die oberen und mittleren Karten haben einen Unterschied von eins
  • Die oberen und unteren Karten sind gleich
  • Die oberen und unteren Karten haben einen Unterschied von eins

Wenn eines dieser Kriterien erfüllt ist, müssen Sie einen Wahrheitswert ausgeben. Außerdem wird für die beiden Kriterien, bei denen die Karten einen Unterschied von 1 aufweisen müssen, ein Umlauf ausgeführt, was bedeutet, dass ein Ass und ein König einen Unterschied von 1 aufweisen und umgekehrt.

Testfälle

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
EdgyNerd
quelle
2
Können wir die Karten getrennt nehmen? Oder als Eingabe nehmen top, [middle, bottom]?
Jo King
Natürlich können Sie beides. hat die Frage
dahingehend
Können wir die Ausgabe invertieren, dh False für gültige Snaps zurückgeben und umgekehrt? Wie wäre es mit einem Testfall, bei dem sowohl der mittlere als auch der untere Teil gültig sind?
Jo King
Ja, Sie können den Ausgang invertieren. Außerdem wurde dieser Testfall hinzugefügt
EdgyNerd
Müssen die Ausgangswerte in Einklang stehen oder könnten wir zum Beispiel Ausgang 0für falseund jede andere ganze Zahl für trueoder sogar jede negative Zahl für falseoder eine positive ganze Zahl für true?
Shaggy

Antworten:

4

Python 3 , 38 Bytes

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

Probieren Sie es online!

Gibt eine nicht leere Menge (truey) zurück, wenn gültig, eine leere Menge (falsey), wenn nicht. Übernimmt die Eingabe in der Reihenfolge von oben nach unten, kann jedoch für dieselbe Codegröße neu angeordnet werden.

Arfie
quelle
4

Perl 6 , 16 Bytes

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

Probieren Sie es online!

Unbekanntes Lambda, das Eingaben als nimmt top, middle, bottomund eine Junction zurückgibt, die mit True oder False ausgewertet wird

Scherzen
quelle
Zu schlechtes Leerzeichen ist erforderlich <, dies war die perfekte Gelegenheit, um einen Herz-Smiley zu haben.
Grimmy
3

05AB1E , 7 6 Bytes

α12%ß!

Probieren Sie es online!

Übernimmt Eingaben als [middle, bottom], top.

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

In 05AB1E ist nur 1 wahr. 0! und 1! sind beide 1, während keine andere Zahl eine Fakultät von 1 hat.

Grimmig
quelle
2

J , 12 Bytes

1 e.2>12||@-

Probieren Sie es online!

Nehmen Sie unten Mitte als linkes Argument, oben als rechtes Argument.

Die ursprüngliche Antwort wird als eine Liste eingegeben

J , 24 Bytes

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

Probieren Sie es online!

  • #:@3 5Die Binärzahlen 3 und 5 sind 0 1 1und 1 0 1sind die Masken für die mittlere / obere bzw. untere / obere Karte
  • (12||@-/)@# Wir filtern die Eingabe mit diesen Masken, nehmen den abs-Wert der resultierenden Differenzen und dann den Rest, wenn er durch 12 geteilt wird (für den Ass-König-Fall).
  • 1 e.2> ist eine der resultierenden Zahlen kleiner als 2, dh 0 oder 1?
Jona
quelle
2

JavaScript (ES6), 29 Byte

Übernimmt die Eingabe als ([bottom, middle])(top) .

Der Ausgang ist invertiert.

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

Probieren Sie es online!


JavaScript (ES6),  37-30  Bytes

1 Byte dank @Grimy gespeichert

Übernimmt die Eingabe als([bottom, middle])(top) .

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

Probieren Sie es online!

Arnauld
quelle
%144könnte sein%72
Grimmy
@ Grimy Danke! FWIW %13würde auch funktionieren.
Arnauld
2

Kohle , 12 Bytes

›²⌊﹪↔⁻E²NN¹²

Probieren Sie es online! Port of @ Grimys Antwort. Nimmt die Eingabe als drei separate Werte für bottom, middle, top und output unter Verwendung des booleschen Standardformats von Charcoal -für true, nichts für false. Erläuterung:

 ²              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
Neil
quelle
1

Perl 5 -ap , 31 Bytes

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

Probieren Sie es online!

Eingang:

bottom middle
top

Tatsächlich spielt die Reihenfolge von Mitte und Boden keine Rolle.

Ausgabe:

0für falsch; 1für wahr

Xcali
quelle
1

Pyth , 12 11 Bytes

Übernimmt die Eingabe als [bottom, top, middle]oder [middle, top, bottom](beide funktionieren). Ausgänge [](Falsy in Pyth) , wenn es keine gültige Snap, ein nicht-leeres Array anders.

f>2%.aT12.+

Probieren Sie es online!

Wenn ein konsistenter Wahrheits- / Falschwert erforderlich ist, geben Sie .A+2 Bytes voran . Dann wird ausgegeben Trueoder False.

Erläuterung

  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 mit einem anderen Ansatz

ar4093
quelle
1

Gelee , 6 Bytes

I%12ỊẸ

Probieren Sie es online!

Ein monadischer Link, der die Liste von [middle, top, bottom]als Argument verwendet und 1für Fang und 0für keinen Fang zurückgibt.

Nick Kennedy
quelle
0

[R], 23 Bytes

Eingabe als a = c (unten, oben, Mitte):

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

Zahiro Mor
quelle