Superb Shuffle ™ Çalıştırın


15

Bu sorunun amaçları doğrultusunda, bir deste kart şu şekilde biçimlendirilir:

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

Kartlar her zaman değer olarak ve ardından uygun olarak biçimlendirilir. Örneğin AS, Maça Asıdır. İki tek J, Joker'lerdir. Bu kart destesini karıştırmak istiyoruz, ancak karıştırmanın Superb ™ olması gerekir.

Superb Shuffle ™ aşağıdakileri içeren bir programdır:

  • Aynı türden iki kart (Jokerler hariç) bitişik değildir.
  • Aynı değerden birine bitişik kart yok (Jokerler hariç).
  • Bitişik değerlerden birine bitişik kart yok (Jokerler hariç) (bu sırada bir üst veya bir alt, A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, C. Ace'nin 2 ya da Krala bitişik olamayacağına dikkat edin).
  • Jokerler herhangi bir pozisyonda olabilir.
  • Bir Süper Karışık ™ tanımı olmayan farklı bir sırada onlar karıştırılan her zaman için kartları gerektirir. Bu çok mükemmel değil, ama Superb ™.

Çünkü bu Superb ™.

Bir örnek şunlar olabilir:

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

Meydan okuma:

  • Mükemmel bir karışık çalma yürütmek için bir kod yazın
  • Herhangi bir dil kullanın.
  • Girilebilir ya da :
    • bir dizi veya başka bir liste yapısı ile aynı sırayla yukarıda açıklanan kart destesi .
    • Giriş yok (kod, bu sırayla bir deste kart oluşturur)
  • Çıktı, yukarıda açıklandığı gibi bir Superb Shuffle ™ içindeki tam bir kart destesi olmalıdır.
  • Superb Shuffle ™ cihazınızı en az sayıda baytla gerçekleştirmeyi deneyin.
  • Çevrimiçi Dene gibi bir çevrimiçi tercümanın bağlantısı tercih edilir, ancak isteğe bağlıdır.

Mutlu karıştırma!



TBunun yerine ikame edebilir miyiz 10?
Jo King

@JoKing Yapamazsınız. Bir deste kart oluşturma sorusu gibi, farklı dize uzunlukları karmaşıklığın bir parçasıdır.
AJFaraday

Her bir kartı Kömür cevabı gibi ayrı ayrı yazdırabilir miyiz, yoksa bir dizi / liste döndürmemiz gerekir mi?
Kevin Cruijssen

@KevinCruijssen Bu formatta bir deste desteyi döndürdüğü sürece bu iyi (değer o zaman uygun).
AJFaraday

Yanıtlar:


5

Japt, 6 5 4 bayt

Giriş dizisini her 16. öğenin alt dizilerine böler ve düzleştirir.

óG c

Dene


Düzleştirmeniz mi gerekiyor?
Oliver

@Oliver, ummuyorum; AJ'nin onaylamasını bekliyorum.
Shaggy

34

Ruby , 31 bayt

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

Çevrimiçi deneyin!

Açıklama:

Bir kart seçiyorum, sonra sonraki 16'yı atlıyorum ve destenin son kartına ulaştığımda ilk karttan başlıyorum. 17 ve 54 karşılıklı olarak birinci sınıf, bu yüzden eminim ki tüm kartları seçeceğim.

17. konumun farklı bir takım olduğu garanti edilir ve değer farkı en az 2'dir: 13. (veya 15.) kart aynı değere ve farklı bir elbiseye sahiptir, bu nedenle diğer 4 (veya 2) 'yi atlayarak değer doğrudur .


6
Diğer tüm cevapların kullandığı süreci bulma konusunda iyi iş
çıkardı

3
*% 17 54'ü nasıl bulduğunuzu açıklayabilir misiniz? Sadece deneme yanılma ya da eksik olduğum bazı matematik var mı?
Daniel

@Daniel 17, sayısal olarak bitişik olmayan iki farklı kart arasında gereken minimum mesafedir (iki jokeri hesaba katar; örneğin, 17 adım sizi Kulüplerin Asından Maça 3'e götürür); 54 destedeki kart sayısıdır.
Hellion

11

Python 3 , 21 bayt

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

Çevrimiçi deneyin!

Açıklama:

Ruby cevabımla aynı fikir, ama Python'da daha da kısa: 17 deste kullanıyorum ve her 17. kartı seçiyorum.


5

JavaScript, 35 bayt

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

Çevrimiçi deneyin!

Bir deste destesini girdi olarak almak ve her bir tek değeri destede "20 kart" olan başka bir kartla değiştirmek.


1
Aha, gönderimdeki "herkes" yanlış dediğimde; Ben de böyle gittim!
Jonathan Allan

4

Java 10, 72 65 bayt

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

Olarak benzer @GB 'ın Yakut cevap , ancak kullanarak i*7%54yerine, sonuç-dizi i*17%54bir byte kaydetmek için giriş-dizi.

Çevrimiçi deneyin.

Açıklama:

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

Ne yazık ki, sonuç aynı türden kartlara bitişik olan çok sayıda kart içeriyor. İle başlar AS, 6S, JS, 3D, 8D, KD,.
AJFaraday

@AJFaraday TIO hala 7 yerine 11 idi. Tekrar kontrol edebilir misiniz? Belki başka bir şey kaçırdım, ama şimdi doğru olması gerektiğini düşünüyorum (umarım).
Kevin Cruijssen

Şimdi anladım. İyi iş!
AJFaraday

3

Perl 6 , 21 20 18 bayt

-2 byte için Brad Gilbert b2gills teşekkürler

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

Çevrimiçi deneyin!

Yine GB'nin başka bir limanı . Genel değişken $!işlevler arasında sıfırlanmazken, çıktının herhangi bir sırası geçerli olduğundan değerin önemli olmadığını unutmayın. Ancak, $ bir sıfırlama.

Açıklama:

{                } #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
Bu $, $!veya ile olduğu gibi adsız bir durumla da çalışır $/. Ayrıca $_bunun yerine kullandıysanız, başka bir bayt kaydetmek yerine @_başlatabilirsiniz . .[…]@_[…]
Brad Gilbert b2gills

2

05AB1E , 9 7 5 bayt

ā17*è

Port of @GB 'nin Ruby cevabı , bu yüzden onu oyladığınızdan emin olun!

Her bir kartı bir sonuç listesine sarmak yerine yeni bir satır sınırlayıcıyla bastırarak
-2 bayt @ Mr.Xcoder sayesinde -2 bayt

Çevrimiçi deneyin.

Açıklama:

ā        # 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 bayt daha kaydetmeli
Bay Xcoder

2

JavaScript, 27

Başka bir yakut cevabı temel alan

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

Belirgin bir kısalma ile düzenlendi


2

T-SQL, 31 bayt

SELECT c FROM t ORDER BY i*7%54

Çıktıda fazladan bir sütun umurumda değilse, 29 bayta düşebilirim :

SELECT*FROM t ORDER BY i*7%54

Böylece çıktımın "Süper" olduğunu doğrulayabilirsiniz, işte ürettiği platform:

 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

(Yeni SQL 2017 eklentisi kullanılarak üretilmiştir STRING_AGG):

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

Benim için zor kısmı seçim kodu değildi, giriş tablosunu dolduruyordu ( SQL için IO kurallarımıza izin verilir ).

SQL doğası gereği sırasız olduğundan (yalnızca açık bir ORDER BYcümle eklerseniz yalnızca belirli bir siparişi garanti eder ), bu orijinal siparişi giriş tablosundaki t alanı i olarak eklemek zorunda kaldım . Bu aynı zamanda, herkesin kullandığı aynı "nispeten prime" faktörü / mod sürecini kullanarak sıralamak için kullanabileceğim anlamına gelir. Bunun da işe yaradığını gördüm .i*7%54i*17%54

Bu ilgili soruya verdiğim çözümü temel alarak giriş tablosunu t ayarlamak ve doldurmak için komutlar şunlardır :

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'

iBurada ek girdi olarak kabul edilmez mi ?
Shaggy

@Shaggy Soru, giriş güvertesini orijinal (listelenen) sırada alabileceğimi söylüyor. SQL'de bunu garanti etmenin tek yolu, siparişin girişin açık bir parçası olmasını sağlamaktır, çünkü SQL tablolarının "varsayılan sırası" yoktur . Bu yüzden, girdinin gerekli bir bileşeni olarak görüyorum. Merak etmeyin, SQL zaten nadiren rekabetçi :)
BradC

2

Jöle ,  5  4 bayt

s⁴ZẎ

Çevrimiçi deneyin!

Çıkış yolu Dönüşler herkes hariç herkes rastgele adam bir bayt :( kaydeder yapıyor
için Kredi onların yöntemi için GB .


Gidiş şeklim ...

ṙÐe20

Çevrimiçi deneyin!

Nasıl?

Diğer tüm kartları sabitleyin ve destenin 20 basamak bıraktığı bir dönüşle serpiştirin (18 ve 22 basamak da çalışır; ayrıca hem dönüş yönünü hem de tek veya çift kartları sabitlemek)

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

(Kullanarak bu Tiçin 10ve rj& bjiçin 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 Bayt

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

-4
30 baytlık Mazzy Old kodu sayesinde

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

GB yönteminin başka bir bağlantı noktası.


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

@Mazzy Giriş özelliklerini bozmuş gibi hissediyorum. Tabii $ args toplanırlar ama aslında bir
tanesini geçirmiyorsun

alıntı: The input can be either:... in the same order, as *an array*. $argsbir dizidir. ve bir splatting kullanabilirsiniz . örneğin $a=@("AS", ..., "J"); &{} @a. Dene. :)
mazzy

ek olarak, bana karakterleri saymaya gerek yok gibi görünüyor &{ve }. param($d)0..53|%{$d[$_*17%54]}Bir dosyaya kaydedebilirsiniz . ve bu dosyayı olmadan&{...}
mazzy

1
@mazzy Evet, her zaman hangi kontrol parçalarının saklanacağından emin olamadım, bu genellikle komut dosyası bloğu haline getirildi. Yine de gelecekte soyurum.
Veskah

1

Kömür , 8 bayt

Eθ§θ×¹⁷κ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. @ GB'nin Ruby cevabının başka bir limanı. Açıklama:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.