Выполнить 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, A. Обратите внимание, что туз не может быть смежным ни с 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

Ответы:



34

Рубин , 31 байт

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

Попробуйте онлайн!

Объяснение:

Я выбираю одну карту, затем пропускаю следующие 16 и начинаю с первой карты, когда достигаю последней карты колоды. 17 и 54 взаимно просты, поэтому я обязательно выберу все карты.

17-я позиция гарантированно будет другой масти, а разница в значении составляет не менее 2: 13-я (или 15-я) карта имеет то же значение и другую масть, поэтому, пропуская другие 4 (или 2), значение будет правильным ,


6
Отлично
сработано

3
Можете ли вы объяснить, как вы нашли * 17% 54? Просто методом проб и ошибок или есть какие-то очевидные математические выражения, которые мне не хватает?
Даниил

@ Даниил 17 - требуемое минимальное расстояние между двумя картами разных мастей, которые не являются численно смежными (с учетом двух джокеров; например, 17 шагов доставят вас из туза треф в 3 пики); 54 - количество карт в колоде.
Геллион


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 байт

Спасибо Брэду Гилберту за 2 байта за 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*è

Port of @GB 's Ruby answer , так что постарайтесь поддержать его!

-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

Таким образом, вы можете проверить, что мой вывод «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 в соответствии с нашими правилами ввода-вывода ).

Поскольку 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 в 30 байтах

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

Еще один порт метода ГБ.


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

@Mazzy Я чувствую, что это нарушает спецификации ввода. Конечно, они собраны в $ args, но на самом деле вы не передаете их.
Веска

Цитирую: 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.