Виконати Superb 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"
]

Картки завжди форматуються як цінність, а потім - костюми. Наприклад AS, Пікова туза. Два сингли J - Джокери. Ми хочемо перетасувати цю колоду карт, але перемішування має бути Superb ™.

Superb Shuffle ™ - це той, у якому:

  • Немає двох сусідніх карток (крім жартів) одного і того ж костюма.
  • Жодна карта (крім жартів) не примикає до однієї і тієї ж цінності.
  • Жодна карта (крім жартів) не примикає до одного із суміжних значень (одна вища або одна нижча в цьому порядку, A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, А. Зауважте, що туз не може бути сусіднім ні з 2, ні з королем).
  • Жартаки можуть бути в будь-якому положенні.
  • Визначення Superb Shuffle ™ не вимагає, щоб картки були в іншому порядку під час кожного перемішування. Що не дуже чудово, але це Superb ™.

Тому що це 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?
Джо Кінг

@JoKing Ви не можете. Так само, як генерувати питання колоди карт, різні довжини рядків є частиною складності.
AJFaraday

Чи дозволяється нам друкувати кожну карту окремо, як це робить відповідь "Вугільне вугілля", чи нам потрібно фактично повертати масив / список?
Кевін Круїйсен

@KevinCruijssen Це добре, доки помітно повернення колоди карт у такому форматі (значення тоді підходить).
AJFaraday

Відповіді:


5

Japt, 6 5 4 байти

Розбиває вхідний масив на підмасиви кожного 16-го елемента та вирівнюється.

óG c

Спробуй це


Чи потрібно це вирівняти?
Олівер

@ Олівер, сподіваюся, що ні; в очікуванні підтвердження AJ.
Кудлатий

34

Рубін , 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 17 - необхідна мінімальна відстань між двома різними картками, які не є суміжними чисельно (з урахуванням двох джокерів; наприклад, 17 кроків отримує вас від туза клубів до 3-х піків); 54 - кількість карток у колоді.
Hellion


5

JavaScript, 35 байт

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

Спробуйте в Інтернеті!

Беручи масив колоди в якості вхідного даних і замінюючи кожне непарне значення іншою карткою, яка знаходиться на «колоді» на 20 картках.


1
Ага, коли я сказав "всі" у своєму дописі, було невірно; ось так я і пішов!
Джонатан Аллан

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. Чи можете ви це ще раз перевірити. Можливо, я пропустив щось інше, але я думаю, це має бути правильним зараз (сподіваюся).
Кевін Кройсейсен

Ось і зараз. Хороша робота!
AJFaraday

3

Perl 6 , 21 20 18 байт

Завдяки Бреду Гілберту b2gills за -2 байти

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

Спробуйте в Інтернеті!

Ще один порт відповіді ГБ . Зауважте, що хоча глобальна змінна $!не скидається між функціями, значення не має значення, оскільки будь-який порядок виводу є дійсним. Тим НЕ менше, $ це скидання.

Пояснення:

{                } #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 байти
Містер 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

Таким чином, ви можете переконатися, що мій вихід "Superb", ось дека, яку він виробляє:

 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 у вхідну таблицю t . Це також означає, що я можу використовувати його для сортування, використовуючи той самий "відносно простий" фактор / мод процес, який використовують усі інші. Я виявив, що i*7%54так само добре працювавi*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 У запитанні сказано, що я можу отримати колоду введення в оригінальному (переліченому) порядку. Єдиний спосіб гарантувати це в SQL - це те, щоб порядок був явною частиною вхідних даних, оскільки таблиці SQL не мають "замовлення за замовчуванням" . Отже, я розглядаю це як необхідну складову вхідних даних. Але не хвилюйтеся, SQL все одно рідко конкурує :)
BradC

2

Желе ,  5  4 байти

s⁴ZẎ

Спробуйте в Інтернеті!

Виходить так, як всі інші, крім випадкового хлопця, що це робить, економить байт :(
Кредит до ГБ за їх метод .


Шлях я пішов ...

ṙÐ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для 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

2

PowerShell 3.0, 30 26 байт

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

-4 завдяки
коду Mazzy Old на 30 байт

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

Ще один порт методу ГБ.


26 байт $args[(0..53|%{$_*17%54})].
маззи

@Mazzy Мені здається, що це порушує характеристики введення. Впевнені, що вони зібрані в $ args, але ви насправді не передаєте їх.
Veskah

Цитую: The input can be either:... in the same order, as *an array*. $args- це масив. і ви можете використовувати бризки . наприклад $a=@("AS", ..., "J"); &{} @a. Спробуй це. :)
маззи

додатково мені здається, що немає необхідності рахувати символи &{і }. Ви можете зберегти param($d)0..53|%{$d[$_*17%54]}у файл. і дзвоніть у цей файл без&{...}
mazzy

1
@mazzy Так, я завжди був не впевнений, які контрольні частини потрібно тримати так, як правило, за замовчуванням, щоб зробити його блоком сценарію. Я зніму його в майбутньому.
Веська


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.