Jalankan Superb Shuffle ™

15

Untuk keperluan pertanyaan ini, setumpuk kartu diformat dengan cara ini:

[
  "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"
]

Kartu selalu diformat sebagai nilai, diikuti oleh kartu. Misalnya ASadalah Ace of Spades. Dua single J adalah Jokers. Kami ingin mengocok tumpukan kartu ini, tetapi pengocokannya harus Superb ™.

A Superb Shuffle ™ adalah salah satunya:

  • 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 dari 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.
  • Definisi Superb Shuffle ™ tidak mengharuskan kartu berada dalam urutan berbeda setiap kali dikocok. Yang tidak terlalu luar biasa, tapi itu luar biasa ™.

Karena itu Superb ™.

Contohnya mungkin:

[
  "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"
]

Tantangan:

  • Tulis beberapa kode untuk menjalankan shuffle yang luar biasa
  • Gunakan bahasa apa pun.
  • Input dapat berupa :
    • setumpuk kartu seperti dijelaskan di atas dalam urutan yang sama , sebagai susunan atau struktur daftar lainnya.
    • Tidak ada input (kode menghasilkan setumpuk kartu dalam urutan itu)
  • Output harus setumpuk penuh kartu dalam Superb Shuffle ™ seperti dijelaskan di atas.
  • Coba lakukan Superb Shuffle ™ Anda dalam jumlah terkecil byte.
  • Tautan ke juru bahasa online seperti Try It Online lebih disukai, tetapi opsional.

Selamat mengocok!

AJFaraday
sumber
1
Agak terkait
Shaggy
Bisakah kita mengganti Tbukan 10?
Jo King
@ JoKing Anda mungkin tidak. Sama seperti menghasilkan setumpuk kartu pertanyaan, panjang string yang berbeda adalah bagian dari kompleksitas.
AJFaraday
Apakah kita diperbolehkan untuk mencetak setiap kartu secara terpisah seperti jawaban Arang, atau apakah kita harus benar-benar mengembalikan array / daftar?
Kevin Cruijssen
@KevinCruijssen Tidak apa-apa, asalkan itu secara teratur mengembalikan setumpuk kartu dalam format itu (nilai kemudian cocok).
AJFaraday

Jawaban:

5

Japt, 6 5 4 byte

Pisahkan array input ke dalam sub-array setiap elemen ke-16 dan ratakan.

óG c

Cobalah

Shaggy
sumber
Apakah Anda perlu meratakannya?
Oliver
@Oliver, saya harap tidak; menunggu AJ untuk mengkonfirmasi.
Shaggy
34

Ruby , 31 byte

->x{(0..53).map{|r|x[r*17%54]}}

Cobalah online!

Penjelasan:

Saya memilih satu kartu, kemudian melewatkan 16 kartu berikutnya dan mulai dari kartu pertama ketika saya mencapai kartu terakhir dari geladak. 17 dan 54 sama-sama prima, jadi saya yakin akan memilih semua kartu.

Posisi ke-17 dijamin menjadi suit yang berbeda dan selisih nilainya setidaknya 2: kartu ke-13 (atau ke-15) memiliki nilai yang sama dan suit yang berbeda, sehingga dengan melewatkan 4 (atau 2) yang lain, nilainya tepat .

GB
sumber
6
Dilakukan dengan baik untuk menemukan proses yang digunakan setiap jawaban lainnya;)
AJFaraday
3
Bisakah Anda jelaskan bagaimana Anda menemukan * 17% 54? Hanya coba-coba atau ada beberapa matematika jelas yang saya lewatkan?
Daniel
@Daniel 17 adalah jarak minimum yang diperlukan antara dua kartu yang berbeda sesuai yang tidak berdekatan secara numerik (akuntansi untuk dua pelawak; misalnya 17 langkah membuat Anda dari Ace of Clubs ke 3 Spades); 54 adalah jumlah kartu di geladak.
Hellion
11

Python 3 , 21 byte

lambda x:(x*17)[::17]

Cobalah online!

Penjelasan:

Ide yang sama dengan jawaban Ruby saya, tetapi lebih pendek dengan Python: Saya menggunakan 17 deck, dan memilih setiap kartu ke-17.

GB
sumber
5

JavaScript, 35 byte

x=>x.map((a,i)=>i%2?a:x[(i+20)%54])

Cobalah online!

Mengambil larik dek sebagai input, dan mengganti setiap nilai ganjil dengan kartu lain yang berjarak "20 kartu" di geladak.

Pria acak
sumber
1
Aha, ketika saya mengatakan "semua orang" di posting saya salah; ini adalah bagaimana saya pergi juga!
Jonathan Allan
4

Java 10, 72 65 byte

d->{var r=d.clone();for(int i=54;i-->0;r[i*7%54]=d[i]);return r;}

Mirip dengan @GB 's Ruby answer , tetapi dengan menggunakan i*7%54pada hasil-array, bukan i*17%54pada input-array untuk menyimpan byte.

Cobalah online.

Penjelasan:

d->{              // Method with String-array as both parameter and return-type
  var r=d.clone();//  Result-String, starting as a copy of the input
  for(int i=54;i-->0;
                  //   Loop `i` in the range (54, 0]
    r[            //    Set an item in the result-array at index:
      i*7%54      //     Index `i` multiplied by 7, and then take modulo-54
     ]=d[i]);     //    To the `i`'th item in the input-Deck
  return r;}      //  Return the result-Array
Kevin Cruijssen
sumber
Sayangnya, hasilnya berisi banyak kartu yang berdekatan dengan kartu dengan jenis yang sama. Dimulai dengan AS, 6S, JS, 3D, 8D, KD,.
AJFaraday
@AJFaraday TIO masih menggunakan 11 dan bukan 7. Bisakah Anda memeriksanya lagi. Mungkin saya melewatkan sesuatu yang lain, tetapi saya pikir itu harus benar sekarang (saya harap).
Kevin Cruijssen
Itu sudah sekarang. Kerja bagus!
AJFaraday
3

Perl 6 , 21 20 18 byte

Terima kasih kepada Brad Gilbert b2gills untuk -2 byte

{.[$++*17%$_]xx$_}

Cobalah online!

Namun port lain dari jawaban GB . Perhatikan bahwa, sementara variabel global $!tidak me-reset fungsi, nilainya tidak masalah, karena urutan output apa pun yang valid. Namun,$ adalah ulang.

Penjelasan:

{                } #Anonymous code block
             xx$_  #Repeat size of inputted array (54) times
 .[         ]      #Get from the inputted array, the value at index
    $++*17%$_         #The incremented variable, multiplied by 17, modded by size of the array
Jo King
sumber
1
Ini berfungsi sama baiknya dengan keadaan var yang tidak disebutkan namanya $seperti halnya dengan $!atau $/. Juga jika Anda digunakan $_sebagai pengganti @_Anda bisa memulainya dengan.[…] bukannya @_[…]menyimpan byte lain.
Brad Gilbert b2gills
2

05AB1E , 9 7 5 byte

ā17*è

Port dari Ruby menjawab @GB , jadi pastikan untuk menghapusnya!

-2 byte dengan mencetak setiap kartu dengan pembatas baris baru alih-alih membungkusnya ke daftar hasil
-2 byte berkat @ Mr.Xcoder

Cobalah online.

Penjelasan:

ā        # 1-indexed length range [1 ... length_of_input_list (54)]
 17*     #  `k`: Multiply each index by 17
    è    #  And then replace each item with the 0-indexed `k`'th card of the input-list
         #  (with automatic wrap-around)
Kevin Cruijssen
sumber
1
ā17*èharus menyimpan 2 byte lagi
Tn. Xcoder
2

JavaScript, 27

Satu lagi berdasarkan jawaban ruby

d=>d.map((_,i)=>d[i*17%54])

Diedit dengan singkat

vityavv
sumber
2

T-SQL, 31 byte

SELECT c FROM t ORDER BY i*7%54

Jika Anda tidak peduli dengan kolom tambahan di output, saya bisa turun ke 29 byte :

SELECT*FROM t ORDER BY i*7%54

Jadi Anda dapat memverifikasi bahwa output saya "Luar Biasa", berikut adalah dek yang dihasilkannya:

 J, 5H,  8S, KH, 3D,  8C, JD, 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

(Dihasilkan menggunakan penambahan SQL 2017 baru, STRING_AGG):

SELECT STRING_AGG(c,', ')WITHIN GROUP(ORDER BY i*7%54)FROM t 

Bagian yang sulit bagi saya bukan kode pilih, itu mengisi tabel input (yang diizinkan untuk SQL sesuai aturan IO kami ).

Karena SQL secara inheren tidak berurutan (hanya menjamin urutan tertentu jika Anda memasukkan ORDER BYklausa eksplisit ), saya harus memasukkan urutan asli sebagai bidang i pada tabel input t . Ini juga berarti saya dapat menggunakannya untuk mengurutkan, menggunakan faktor / mod proses yang "relatif prima" yang digunakan semua orang. Saya menemukan bahwa itu i*7%54berfungsi dengan baik i*17%54.

Berikut adalah perintah untuk mengatur dan mengisi tabel input t , berdasarkan solusi saya untuk pertanyaan terkait ini :

CREATE TABLE t (i INT IDENTITY(1,1), c VARCHAR(5))

--Insert 52 suited cards
INSERT t(c)
SELECT v.value+s.a as c
FROM STRING_SPLIT('A-2-3-4-5-6-7-8-9-10-J-Q-K','-')v,
     (VALUES('S',1),('D',2),('H',3),('C',4))s(a,b)
ORDER BY s.b

--Insert Jokers
INSERT t(c) SELECT 'J'
INSERT t(c) SELECT 'J'
BradC
sumber
Apakah iinput tambahan tidak dipertimbangkan di sini?
Shaggy
@ Shaggy Pertanyaannya mengatakan saya bisa mendapatkan dek input dalam urutan asli (terdaftar). Satu-satunya cara untuk menjamin ini dalam SQL adalah memiliki urutan menjadi bagian eksplisit dari input, karena tabel SQL tidak memiliki "urutan default" . Jadi, saya melihatnya sebagai komponen input yang diperlukan. Tapi jangan khawatir, SQL jarang kompetitif :)
BradC
2

Jeli ,  5  4 byte

s⁴ZẎ

Cobalah online!

Bergantian keluar cara orang lain orang lain kecuali Orang random menghemat byte :(
Kredit ke GB untuk metode mereka .


Cara saya pergi ...

ṙÐe20

Cobalah online!

Bagaimana?

Perbaiki setiap kartu lainnya dan selingi dengan rotasi geladak yang ditinggalkan oleh 20 tempat (18 dan 22 tempat juga berfungsi; lebih jauh demikian juga arah rotasi maupun pemasangan kartu ganjil atau genap)

ṙÐe20 - Link: list of the card strings (lists of characters)
   20 - place a literal twenty on the right
 Ðe   - apply to even indices:
ṙ     -   rotate left (by 20)

Yang (menggunakan Tuntuk 10dan rj& bjuntuk Js):

input: AS 2S 3S 4S 5S 6S 7S 8S 9S TS JS QS KS AD 2D 3D 4D 5D 6D 7D 8D 9D TD JD QD KD AH 2H 3H 4H 5H 6H 7H 8H 9H TH JH QH KH AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC rj bj
  ṙ20: 8D 9D TD JD QD KD AH 2H 3H 4H 5H 6H 7H 8H 9H TH JH QH KH AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC rj bj AS 2S 3S 4S 5S 6S 7S 8S 9S TS JS QS KS AD 2D 3D 4D 5D 6D 7D
ṙÐe20: AS 9D 3S JD 5S KD 7S 2H 9S 4H JS 6H KS 8H 2D TH 4D QH 6D AC 8D 3C TD 5C QD 7C AH 9C 3H JC 5H KC 7H bj 9H 2S JH 4S KH 6S 2C 8S 4C TS 6C QS 8C AD TC 3D QC 5D rj 7D
Jonathan Allan
sumber
2

PowerShell 3.0, 30 26 Bytes

$args[(0..53|%{$_*17%54})]

-4 Berkat Mazzy
Old code pada 30 byte

param($d)0..53|%{$d[$_*17%54]}

Port lain dari metode GB.

Veskah
sumber
26 byte $args[(0..53|%{$_*17%54})].
mazzy
@ Mazzy Saya merasa seperti itu memecah spesifikasi input. Tentu mereka dikumpulkan ke $ args tetapi Anda tidak benar-benar melewati satu.
Veskah
mengutip: The input can be either:... in the same order, as *an array*. $argsadalah sebuah array. dan Anda bisa menggunakan splatting . misalnya $a=@("AS", ..., "J"); &{} @a. Cobalah. :)
mazzy
selain itu, bagi saya tampaknya tidak perlu menghitung karakter &{dan }. Anda dapat menyimpan param($d)0..53|%{$d[$_*17%54]}ke file. dan panggil file ini tanpa&{...}
mazzy
1
@ Mazzy Ya, saya selalu sedikit tidak yakin bagian kontrol mana yang harus disimpan, jadi biasanya tidak digunakan untuk membuatnya menjadi blok skrip. Saya akan menghapusnya di masa depan.
Veskah
1

Arang , 8 byte

Eθ§θ×¹⁷κ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Port lain dari jawaban Ruby @ GB. Penjelasan:

 θ          Input array
E           Map over elements
       κ    Current index
     ¹⁷     Literal 17
    ×       Multiply
   θ        Input array
  §         Cyclically index
            Implicitly print each result on its own line
Neil
sumber
1

Merah , 44 byte

func[a][append/dup a a 16 prin extract a 17]

Cobalah online!

Interpetasi lain dari kode GB. Saya menambahkan 16 salinan dek ke dirinya sendiri dan kemudian mengekstrak setiap kartu ke-17.

Galen Ivanov
sumber