ดำเนินการ Shuffle ™ที่ยอดเยี่ยม


15

สำหรับจุดประสงค์ของคำถามนี้สำรับไพ่ในรูปแบบนี้:

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

การ์ดจะถูกจัดรูปแบบเป็นค่าเสมอตามด้วยชุดสูท เช่นASAce of Spades J เดี่ยวสองตัวคือ Jokers เราต้องการสับไพ่สำรับนี้ แต่การสับเปลี่ยนต้องเป็นสุดยอด™

สุดยอด Shuffle ™เป็นหนึ่งใน:

  • ไม่มีไพ่สองใบ (ยกเว้นโจ๊กเกอร์) ของชุดเดียวกันอยู่ติดกัน
  • ไม่มีการ์ด (ยกเว้น Jokers) ติดกับหนึ่งในค่าเดียวกัน
  • ไม่มีไพ่ (ยกเว้น Jokers) ติดกับหนึ่งในค่าที่อยู่ติดกัน (สูงกว่าหรือต่ำกว่าหนึ่งในลำดับนี้ A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A. สังเกตว่าเอซไม่สามารถอยู่ติดกับทั้ง 2 หรือคิง)
  • โจ๊กเกอร์สามารถอยู่ในตำแหน่งใดก็ได้
  • คำนิยามของ Superb Shuffle ™ ไม่ต้องการให้การ์ดเรียงตามลำดับที่แตกต่างกันในแต่ละครั้งที่สับไพ่ ซึ่งไม่ได้ยอดเยี่ยมมาก แต่เป็น Superb ™

เพราะนั่นคือสุดยอด™

ตัวอย่างอาจเป็น:

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

ความท้าทาย:

  • เขียนโค้ดบางอย่างเพื่อดำเนินการสับเปลี่ยนที่ยอดเยี่ยม
  • ใช้ภาษาใดก็ได้
  • อินพุตสามารถเป็นได้ทั้ง :
    • สำรับไพ่ตามที่อธิบายไว้ข้างต้นในลำดับเดียวกันเป็นอาร์เรย์หรือโครงสร้างรายการอื่น ๆ
    • ไม่มีการป้อนข้อมูล (รหัสจะสร้างสำรับไพ่ตามลำดับ)
  • ผลลัพธ์จะต้องเป็นสำรับไพ่เต็มรูปแบบใน Superb Shuffle ™ตามที่อธิบายไว้ข้างต้น
  • พยายามดำเนินการ Superb Shuffle ™ของคุณในจำนวนไบต์ที่น้อยที่สุด
  • ต้องการลิงค์ไปยังล่ามออนไลน์เช่นTry It Onlineแต่เป็นทางเลือก

มีความสุขในการสับ!



เราสามารถใช้แทนTแทน10?
Jo King

@ โจกิ้งคุณอาจจะไม่ เช่นเดียวกับการสร้างคำถามไพ่ความยาวของสตริงที่แตกต่างกันเป็นส่วนหนึ่งของความซับซ้อน
AJFaraday

เราได้รับอนุญาตให้พิมพ์บัตรแต่ละใบแยกกันเช่นเดียวกับคำตอบ Charcoal หรือเราจำเป็นต้องส่งคืนอาร์เรย์ / รายการจริงหรือไม่?
Kevin Cruijssen

@KevinCruijssen ไม่เป็นไรตราบใดที่มันคืนไพ่ในรูปแบบนั้นให้เห็นเด่นชัด
AJFaraday

คำตอบ:


5

Japtap, 6 5 4 ไบต์

แบ่งอาร์เรย์อินพุตออกเป็นอาร์เรย์ย่อยของทุกองค์ประกอบที่ 16 และแผ่

óG c

ลองมัน


คุณจำเป็นต้องแบนหรือไม่?
Oliver

@Oliver ฉันหวังว่าไม่ได้; รอให้ AJ ยืนยัน
Shaggy

34

Ruby , 31 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

ฉันกำลังหยิบไพ่หนึ่งใบแล้วข้ามไปอีก 16 ใบแล้วเริ่มจากไพ่ใบแรกเมื่อฉันไปถึงไพ่ใบสุดท้ายของเด็ค 17 และ 54 เป็นคู่ที่สำคัญที่สุดดังนั้นฉันแน่ใจว่าจะเลือกไพ่ทั้งหมด

ตำแหน่งที่ 17 รับประกันว่าจะเป็นชุดที่แตกต่างกันและความแตกต่างของมูลค่าอย่างน้อย 2: การ์ดที่ 13 (หรือ 15) มีค่าเท่ากันและชุดที่แตกต่างกันดังนั้นโดยการข้ามอีก 4 (หรือ 2) ค่านั้นถูกต้อง .


6
ทำได้ดีมากในการค้นหากระบวนการที่คำตอบอื่นใช้;)
AJFaraday

3
คุณช่วยอธิบายได้อย่างไรว่าคุณค้นพบ * 17% 54? แค่ลองผิดลองถูกหรือมีคณิตศาสตร์บางอย่างที่ฉันหายไปหรือเปล่า?
Daniel

@Daniel 17 เป็นระยะทางต่ำสุดที่ต้องการระหว่างไพ่สองใบที่มีความแตกต่างกันซึ่งไม่ได้อยู่ติดกันเป็นตัวเลข (บัญชีสำหรับนักเลงสองคนเช่น 17 ก้าวจาก Ace of Clubs ไปยัง 3 Spades); 54 คือจำนวนไพ่ในสำรับ
Hellion

11

Python 3 , 21 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

แนวคิดเดียวกันกับคำตอบ Ruby ของฉัน แต่ก็สั้นกว่าใน Python: ฉันใช้ 17 สำรับและเลือกการ์ดที่ 17 ทุกใบ


5

JavaScript ขนาด 35 ไบต์

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

ลองออนไลน์!

นำอาร์เรย์ของเด็คเป็นอินพุตและแทนที่ค่าคี่แต่ละอันด้วยการ์ดอีกใบที่มี "20 ใบ" ออกไปบนเด็ค


1
Aha เมื่อฉันพูดว่า "ทุกคน" ในโพสต์ของฉันไม่ถูกต้อง นี่คือสิ่งที่ฉันไปด้วย!
Jonathan Allan

4

Java 10, 72 65 ไบต์

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

คล้ายกับคำตอบ Ruby ของ@GBแต่ใช้i*7%54ในอาร์เรย์ผลลัพธ์แทนi*17%54การป้อนข้อมูลในอาร์เรย์เพื่อบันทึกไบต์

ลองออนไลน์

คำอธิบาย:

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

น่าเสียดายที่ผลลัพธ์มีการ์ดจำนวนมากซึ่งอยู่ติดกับการ์ดในชุดเดียวกัน AS, 6S, JS, 3D, 8D, KD,มันเริ่มต้นด้วย
AJFaraday

@AJFaraday TIO ยังคงมี 11 แทนที่จะเป็น 7 คุณช่วยตรวจสอบอีกครั้งได้ไหม บางทีฉันอาจพลาดอย่างอื่น แต่ฉันคิดว่ามันควรจะถูกต้องแล้ว (ฉันหวังว่า)
Kevin Cruijssen

แค่นี้แหละ เยี่ยมมาก!
AJFaraday

3

Perl 6 , 21 20 18 ไบต์

ขอบคุณ Brad Gilbert b2gills สำหรับ 2 ไบต์

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

ลองออนไลน์!

แต่พอร์ตอีกคำตอบของ GB โปรดทราบว่าในขณะที่ตัวแปรโกลบอล$!ไม่ได้ถูกรีเซ็ตระหว่างฟังก์ชั่นค่าไม่สำคัญเนื่องจากลำดับของเอาต์พุตใด ๆ ที่ถูกต้อง อย่างไรก็ตาม$ มีการรีเซ็ต

คำอธิบาย:

{                } #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

1
นี้ทำงานก็เช่นกันกับ var รัฐที่ไม่มีชื่อ$เป็นมันจะมีหรือ$! $/นอกจากนี้หากคุณใช้$_แทนคุณ@_สามารถเริ่มด้วย.[…]แทนที่จะ@_[…]บันทึกไบต์อื่น
แบรดกิลเบิร์ต b2gills

2

05AB1E , 9 7 5 ไบต์

ā17*è

คำตอบ Rubyของพอร์ต@GBเขา!

-2 ไบต์โดยการพิมพ์บัตรแต่ละใบด้วยตัวคั่นบรรทัดใหม่แทนการห่อลงในรายการผลลัพธ์
-2 ไบต์ขอบคุณ@ Mr.Xcoder

ลองออนไลน์

คำอธิบาย:

ā        # 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)

1
ā17*èควรประหยัดอีก 2 ไบต์
Mr. Xcoder

2

JavaScript, 27

อีกคำตอบหนึ่งของคำตอบทับทิม

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

แก้ไขในการย่อที่ชัดเจน


2

T-SQL, 31 ไบต์

SELECT c FROM t ORDER BY i*7%54

หากคุณไม่สนใจคอลัมน์พิเศษในผลลัพธ์ฉันสามารถลดขนาดลงเป็น29 ไบต์ :

SELECT*FROM t ORDER BY i*7%54

ดังนั้นคุณสามารถตรวจสอบผลลัพธ์ของฉันคือ "สุดยอด" นี่คือสำรับที่ผลิต:

 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

(สร้างโดยใช้การเพิ่ม SQL 2017 ใหม่STRING_AGG):

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

ส่วนที่ยากสำหรับฉันไม่ใช่รหัสที่เลือก แต่มันก็เติมข้อมูลตารางการป้อนข้อมูล (ซึ่งได้รับอนุญาตสำหรับ SQL ตามกฎ IO ของเรา )

เนื่องจาก SQL มีการเรียงลำดับโดยเนื้อแท้ (มันเท่านั้นรับประกันคำสั่งบางอย่างถ้าคุณมีอย่างชัดเจนORDER BYข้อ) ผมมีการรวมคำสั่งเดิมที่เป็นเขตข้อมูล ฉันในตารางการป้อนข้อมูลที นี่ก็หมายความว่าฉันสามารถใช้มันเพื่อเรียงลำดับโดยใช้กระบวนการ / ปัจจัยที่ค่อนข้างดีเหมือนกันทุกคนใช้ ฉันพบว่าทำงานได้เช่นเดียวกับi*7%54i*17%54

ต่อไปนี้เป็นคำสั่งในการตั้งค่าและเติมตารางอินพุตtตามโซลูชันของฉันสำหรับคำถามที่เกี่ยวข้องนี้ :

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'

จะiไม่ถือว่าเป็นข้อมูลเพิ่มเติมที่นี่หรือไม่
Shaggy

@Shaggy คำถามที่ว่าฉันจะได้รับสำรับในลำดับเดิม (จดทะเบียน) วิธีเดียวที่จะรับประกันนี้ใน SQL คือการมีคำสั่งที่เป็นส่วนหนึ่งที่ชัดเจนของการป้อนข้อมูลเพราะตาราง SQL ไม่มี "เพื่อเริ่มต้น" ดังนั้นฉันจึงมองว่ามันเป็นองค์ประกอบที่จำเป็นของอินพุต แต่ไม่ต้องกังวล, SQL จะไม่ค่อยมีอยู่แล้วในการแข่งขัน :)
BradC

2

เยลลี่ ,  5  4 ไบต์

s⁴ZẎ

ลองออนไลน์!

ปรากฎด้วยวิธีอื่น ๆ ทุกคน ที่คนอื่น ๆ ยกเว้นคนที่แต่งตัวประหลาดแบบสุ่มจะทำมันจะช่วยประหยัดไบต์ :(
เครดิตGB สำหรับวิธีการของพวกเขา


วิธีที่ฉันไป ...

ṙÐe20

ลองออนไลน์!

อย่างไร?

แก้ไขการ์ดอื่น ๆ ทุกใบและสลับมันด้วยการหมุนของเด็คที่เหลือ 20 แห่ง (ที่ 18 และ 22 แห่งยังใช้ได้อีกทั้งทิศทางการหมุนเช่นเดียวกับการแก้ไขการ์ดคี่หรือคู่)

ṙÐ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)

นั่นคือ (ใช้Tสำหรับ10และrj& bjสำหรับJ):

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

2

PowerShell 3.0 30 26 ไบต์

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

-4 ต้องขอบคุณ
รหัสเก่าของMazzyที่ 30 ไบต์

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

พอร์ตอื่นของวิธีของ GB


26 $args[(0..53|%{$_*17%54})]ไบต์
mazzy

@ Madzy ฉันรู้สึกเหมือนว่าแบ่งรายละเอียดข้อมูลเข้า แน่นอนว่าพวกเขาถูกรวบรวมเข้าสู่ $ args แต่คุณไม่ได้ผ่านเข้ามาจริงๆ
Veskah

The input can be either:... in the same order, as *an array*พูด: $argsเป็นอาร์เรย์ และคุณสามารถที่จะใช้splatting $a=@("AS", ..., "J"); &{} @aเช่น ลองมัน. :)
mazzy

ในเพิ่มเติมก็ดูเหมือนว่าผมว่าไม่มีความจำเป็นที่จะนับตัวอักษรและ&{ }คุณสามารถบันทึกparam($d)0..53|%{$d[$_*17%54]}ลงไฟล์ได้ และเรียกไฟล์นี้โดยไม่ต้อง&{...}
mazzy

1
@ mazzy ใช่ฉันมักจะไม่แน่ใจว่าส่วนควบคุมใดที่จะเก็บไว้ดังนั้นโดยปกติแล้วจะเป็นค่าเริ่มต้นที่จะทำให้เป็นบล็อกสคริปต์ ฉันจะตัดมันในอนาคตแม้ว่า
Veskah

1

ถ่าน 8 ไบต์

Eθ§θ×¹⁷κ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด อีกพอร์ตของคำตอบ Ruby ของ @ GB คำอธิบาย:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.