Apakah itu Superb Shuffle ™ ️


8

Menurut pertanyaan ini, Superb Shuffle ™ ️ didefinisikan sebagai setumpuk penuh kartu (termasuk pelawak) yang mengikuti rangkaian aturan ini:

  • Tidak ada dua kartu (kecuali Pelawak) dari jenis yang sama yang berdekatan.
  • Tidak ada kartu (kecuali Joker) yang berdekatan dengan salah satu dari nilai yang sama.
  • Tidak ada kartu (kecuali Joker) yang berdekatan dengan salah satu nilai yang berdekatan (satu lebih tinggi atau lebih rendah dalam urutan ini, A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A. Perhatikan bahwa Ace tidak dapat berdekatan dengan 2 atau King).
  • Jokers dapat berada di posisi apa pun.

Kartu-kartu dinyatakan sebagai nilai (A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K), diikuti oleh suit (C, D, H, S). Misalnya 'AS' adalah Ace of Spades. Jokers diwakili oleh satu huruf J.

  • Tulis beberapa kode untuk menunjukkan apakah array kartu adalah Superb Shuffle ™ ️ atau tidak.
  • Gunakan bahasa apa pun yang Anda suka.
  • Cobalah melakukannya dalam jumlah byte terkecil.

Kasus uji:

1: Ini Luar Biasa ™ ️

[
  "AS", "5D", "9H", "KC", "2D", "6H", "10C", "QS", "3H", "7C", "9S", 
  "KD", "4C", "6S", "10D", "AC", "3S", "7D", "JH", "J", "4D", "8H", 
  "QC", "AD", "5H", "9C", "JS", "2H", "6C", "8S", "QD", "3C", "5S", 
  "9D", "KH", "2S", "6D", "10H", "J", "3D", "7H", "JC", "KS", "4H", 
  "8C", "10S", "AH", "5C", "7S", "JD", "2C", "4S", "8D", "QH"
]

# true

2: Ini semua diurutkan

[
  "AS", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S", "10S", "JS", "QS", "KS", 
  "AD", "2D", "3D", "4D", "5D", "6D", "7D", "8D", "9D", "10D", "JD", "QD", "KD", 
  "AH", "2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "10H", "JH", "QH", "KH", 
  "AC", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "10C", "JC", "QC", "KC", 
  "J", "J"
]

# false

3: Aces bersama

[
  "AC", "AS", "AD", "AH", "5D", "9H", "KC", "2D", "6H", "10C", "QS",
  "9S", "KD", "4C", "6S", "10D", "3S", "7D", "JH", "J", "4D", "8H", 
  "QC", "5H", "9C", "JS", "2H", "6C", "8S", "QD", "3C", "5S", "3H", 
  "9D", "KH", "2S", "6D", "10H", "J", "3D", "7H", "JC", "KS", "4H", 
  "8C", "10S", "5C", "7S", "JD", "2C", "4S", "8D", "7C", "QH"
]

# false

4: Crazy 8's

[
  "AS", "5D", "9H", "KC", "2D", "6H", "10C", "QS", "3H", "7C", "9S", 
  "KD", "4C", "6S", "10D", "AC", "3S", "7D", "JH", "J", "4D", "AH",
  "QC", "AD", "5H", "9C", "JS", "2H", "6C", "QD", "3C", "5S", "10S", 
  "9D", "KH", "2S", "6D", "10H", "J", "3D", "7H", "JC", "KS", "4H", 
  "5C", "7S", "JD", "2C", "4S","QH", "8D", "8S", "8C", "8H"
]

# false

5: Juga luar biasa

[
  "AS", "6H", "9S", "AC", "4D", "9C", "QD", "2S", "7H", "10S", "2C", 
  "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", "4S", 
  "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C", "8D", 
  "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "4H", "7S", "QH", 
  "2D", "7C", "10D", "J", "5H", "8S", "KH", "3D", "8C", "JD"
]

# true

6: Ace by 2

[
  "AS", "2S", "6H", "9S", "AC", "4D", "9C", "QD",  "7H", "10S", "2C", 
  "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", "4S", 
  "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C", "8D", 
  "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "4H", "7S", "QH", 
  "2D", "7C", "10D", "J", "5H", "8S", "KH", "3D", "8C", "JD"
]

# false

7: Ace by King

[
  "AS", "KH", "2S", "6H", "9S", "AC", "4D", "9C", "QD",  "7H", "10S", 
  "2C", "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", 
  "4S", "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C",  
  "8D", "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "4H", "7S", 
  "QH", "2D", "7C", "10D", "J", "5H", "8S", "3D", "8C", "JD"
]

# false

8: Pelawak bersama

[
  "AS", "5D", "9H", "KC", "2D", "6H", "10C", "QS", "3H", "7C", "9S",
  "KD", "4C", "6S", "10D", "AC", "3S", "7D", "JH", "J", "J", "4D",
  "8H", "QC", "AD", "5H", "9C", "JS", "2H", "6C", "8S", "QD", "3C",
  "5S", "9D", "KH", "2S", "6D", "10H", "3D", "7H", "JC", "KS", "4H",
  "8C", "10S", "AH", "5C", "7S", "JD", "2C", "4S", "8D", "QH"
]

# true

9: Setelan / nilai yang berdekatan dipisahkan oleh Jokers

[
  "AS", "6H", "9S", "AC", "4D", "J", "4H", "2S", "7H", "10S", "2C",
  "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", "4S",
  "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C", "8D",
  "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "QD", "7S", "QH",
  "2D", "7C", "10D", "8C", "5H", "8S", "KH", "3D", "9C", "JD"
]

# true 

2
" Jika ada kartu yang hilang, itu bukan Shuffle Luar Biasa " - Boo-guci untuk memasukkan validasi!
Shaggy

Saya pribadi setuju dengan @Arnauld dan Shaggy. Sebuah tantangan yang mengesahkan kedua hal ini dari tumpukan 54 kartu yang dikocok: 1. Tidak ada adjacents dengan jenis yang sama. 2. Tidak ada adjacents dengan nilai yang sama, satu lebih rendah, atau satu lebih tinggi sepertinya tantangan yang baik. Jika kita juga harus memvalidasi: Apakah ada tepat 54 kartu (tidak terlalu sedikit atau terlalu banyak); semua kartu dalam format yang benar; apakah tidak ada input ASCII yang aneh; apakah tidak ada string kosong; apakah tidak ada kartu duplikat; dll. tampaknya berlebihan bagi saya secara pribadi.
Kevin Cruijssen

@KevinCruijssen Saya melewatkan yang itu
AJFaraday

2
Urutan seperti 4D, J, 3Datau J, JSmungkin juga menghasilkan negatif palsu.
Arnauld

@Arnauld Ah, sial .. Punya solusi yang akan saya posting, tetapi memang gagal untuk 4D, J, 3D..
Kevin Cruijssen

Jawaban:


9

JavaScript (ES7), 88 byte

Mengembalikan nilai true untuk Superb ™ ️ atau false untuk Ugly ™ ️.

a=>a.every(r=s=([a,b,c])=>!s|!b|!((r-(r='34567891JQKA'.search(a)))**2%13<2|s==(s=c||b)))

Cobalah online!

Bagaimana?

Setiap kartu dibagi menjadi 3 karakter a , b dan c , beberapa di antaranya mungkin tidak terdefinisi .

Peringkat tersebut diberikan oleh posisi a dalam string "34567891JQKA" ( '2' memberi -1 ). Gugatan diberikan oleh b untuk semua kartu kecuali 10, yang untuknya kita perlu menguji c , dan Pelawak yang memiliki setelan yang tidak ditentukan .

Kami melacak peringkat sebelumnya di r dan setelan sebelumnya di s .

(r-new_rSebuahnk)2mod13

  • 0
  • 11
  • 11441441(mod13)
  • 1

Kami hanya membandingkan setelan baru dengan s untuk mendeteksi setelan berurutan yang identik.

Kami menggunakan ungkapan ! S | ! b untuk mendeteksi bahwa kartu yang sebelumnya atau yang sekarang adalah Joker , dalam hal ini hasil tes lainnya dibuang.


2
Definitely Ugly ™ ️;)
AJFaraday

4

Retina 0.8.2 , 68 byte

.*,(.*)
$1,$&
J\b
--
10
T
\b\w
$&$&
T`Ao`2-9TJQKA`\b.
(\w).{2,4}\1.*

Cobalah online! Tautan termasuk kasus uji. Output 0jika luar biasa, 1jika tidak. Penjelasan:

.*,(.*)
$1,$&

Salin kartu terakhir ke awal untuk mensimulasikan pembungkus.

J\b
--

Ganti pelawak dengan placeholder dua karakter, yang cukup untuk memastikan bahwa kartu di sekitarnya tidak cocok satu sama lain.

10
T

Dan ganti 10s dengan puluhan.

\b\w
$&$&

Gandakan peringkat setiap kartu.

T`Ao`2-9TJQKA`\b.

Hitung peringkat yang berdekatan.

(\w).{2,4}\1.*

Cari kartu yang berdekatan dengan jenis yang sama atau peringkat yang sama atau berdekatan.


3

Java 10, 246 210 205 178 170 byte

d->{var r=1>0;int p=-1,P=p,q,u;for(var c:d)r&=p<0|(u=(p-(p=(q=c.length())<2?-1:"A234567891JQK".indexOf(c.charAt(0))))%12)<-1|u>1&P!=(P=q<2?p:c.charAt(q>2?2:1));return r;}

Cobalah online.

Penjelasan:

d->{                   // Method with String-array parameter and boolean return-type
  var r=1>0;           //  Result-boolean, starting at true
  int p=-1,            //  Previous value, starting at -1
      P=p,             //  Previous suit, starting at -1
      q,u;             //  Temp integers
  for(var c:d)         //  Loop over the cards of the input-deck:
    r&=p<0             //   Validate whether the previous value is -1
       |(u=(p-         //   Or if the difference between the previous and current value,
          (p=          //   where the current value is:
                       //   (and replace the previous with the current value for the next
                       //   iteration at the same time)
             (q=c.length())<2?
                       //    Is it a Joker:
               -1      //     Use -1
              :        //    Else:
               "A234567891JQK".indexOf(c.charAt(0))
                       //     Use 0-12 depending on the order
        ))%12)         //   (Modulo-12 for 'A' and 'K')
              <-1|u>1  //   is more than 2
       &P!=            //   And the previous and current suits are not equal,
           (P=         //   where the current suit is:
                       //   (and replace the previous with the current suit for the next
                       //   iteration at the same time)
              q<2?     //    Is it a Joker:
               p       //     Use -1
              :        //    Else:
               c.charAt(q>2?2:1));
                       //     Use the suit-character
                       //     where the `q>2?2:1` is for cards of value 10
  return r;}           //  Return if all validations inside the loop have succeeded

3

Python 2 , 108 byte

lambda l:all('J'in(a,b)or(q(a[0])-q(b[0])+1)%13>2<a[-1]!=b[-1]for a,b in zip(l,l[1:]))
q='234567891JQK'.find

Cobalah online!


Python 3 , 109 byte

lambda l:all([(q(a[0])-q(b[0])+1)%13*(A!=B)>2for(*a,A),(*b,B)in zip(l,l[1:])if a>[]<b])
q='234567891JQK'.find

Cobalah online!

Python 3 memenangkan byte dengan pembongkaran yang dapat diputar ulang tetapi kehilangan byte dengan menolak untuk melakukan rantai perbandingan item yang diketik berbeda. Pembongkaran perlu menangani keduanya 'J'dan '10S', yang berarti dapat mengekstrak nilai pertama atau nilai terakhir, tetapi tidak keduanya.


2

Ruby , 123 byte

->a{a.each_cons(2).all?{|a,b|a==?J||b==?J||(s="A234567891JQK".chars).zip(s.rotate).all?{|f|((a.chars|b.chars)-[?0]-f)[2]}}}

Cobalah online!

Penjelasan:

Tanpa terlalu banyak detail:

  • pisahkan setiap pasangan menjadi karakter tunggal
  • hapus '0' jika ada
  • hapus karakter duplikat
  • coba hapus pasangan nilai yang berdekatan

Jika setelah perawatan, 3 karakter tersisa, pasangan baik.


2

Python 3, 130 125 byte

5 byte disimpan berkat Chas Brown

v="A234567891JQK".find;s=lambda d:len(d)<2or("J"in d[:2]or 1<abs(v(d[0][0])-v(d[1][0]))<12and d[0][-1]!=d[1][-1])and s(d[1:])

Posting pertama saya di sini, jadi ini mungkin bisa diturunkan sedikit lagi.

Penjelasan

Lambda rekursif; memeriksa apakah dua kartu pertama dari daftar saat ini memiliki jenis yang berbeda, peringkat yang berbeda, dan peringkat mereka berbeda lebih dari 1 (tetapi kurang dari 12, untuk memperhitungkan Ace-King), atau jika salah satu dari dua kartu tersebut adalah Joker, dalam hal ini baik-baik saja, kemudian mengkonsumsi elemen pertama dari daftar dan berulang.


1
Hemat 5 byte dengan mengganti v="A234567891JQK"dengan v="A234567891JQK".find; maka Anda bisa menggunakannya abs(v(d[0][0])-v(d[1][0]). Juga, selamat datang di PPCG! Jawaban pertama yang bagus.
Chas Brown

@ ChasBrown Ah, tangkapan yang bagus. Terima kasih!
nthistle

@nthistle Mengubah urutan logika Boolean menghemat satu byte
mbomb007


1

Ruby , 119 byte

f=->s,c=20,d=?Z{a,*b=s;a ?(x=a[-1];x==?J||(e=((i="A234567891JQK".index(a[0]))-c)%13;e>1&&e<12)&&x!=d)&&f[b,i||20,x]:!p}

Cobalah online!

Versi rekursif.
Ini berjalan melalui array dan membandingkan kartu saat ini dengan kartu terakhir. Peringkat tersebut dicari dalam string "A234567891JQK" dan pelawak dilewati. Dimulai dengan kartu dummy sebelumnya "20Z" yang akan menerima tetangga apa pun.


Jika kartu 20Z dapat menerima tetangga, bukankah aturannya sama dengan aturan untuk Jokers? Anda bisa memotong dua byte dengan membuatnya menjadi joker?
AJFaraday

Sebenarnya pelawak dibuat memiliki peringkat 20 dan warna "J", jadi saya bisa mengubah yang pertama? Z menjadi? J tapi saya tidak yakin saya bisa menghemat byte. Menangani kasus tepi karena memiliki dua pelawak berurutan memaksa saya untuk memeriksa secara eksplisit untuk "J"
crashoz

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.