Magic Card Trick'i görmek ister misiniz?


16

Çocukken öğrendiğim ilk sihirli kart numarası şuydu:

  • Arkadaki desenin dikey olarak simetrik olmadığı 1 deste kartınız olsun.
  • Tüm kartları tek yöne bakacak şekilde düzenleyin.
  • Bir kişiden, "bir kart, herhangi bir kart seçin, ezberleyin ve size geri verin" diye sorun.
  • Güverteye koymaya devam edin (yanlış yönde).
  • Kartlarının nerede olduğunu bilmeyeceğiniz yanılsamasını vererek şiddetli bir şekilde karıştırın.
  • Onların şaşkınlık için kartlarını üretin.

Bu hile açıkça bir gün doğada biraz parlaklık eksikliği, ancak iyi bir meydan okuma yapar. Herhangi bir girdi verilmediğinde, rastgele seçilmiş bir kart destesi ile rastgele seçilmiş, ters çevrilmiş bir program çıktısı veren bir program yazın. Ancak, giriş bir kart ters çevrilmiş bir kart destesi olduğunda, ters çevrilmiş kartı çıkarmanız gerekir (doğru sırada).


Kart Destesi

Bir kart destesi şu şekilde tanımlanır:

[2S,3S,4S,5S,6S,7S,8S,9S,TS,JS,QS,KS,AS,
 2D,3D,4D,5D,6D,7D,8D,9D,TD,JD,QD,KD,AD,
 2H,3H,4H,5H,6H,7H,8H,9H,TH,JH,QH,KH,AH,
 2C,3C,4C,5C,6C,7C,8C,9C,TC,JC,QC,KC,AC]

Bir kart numarası, sonra da takımın ilk harfi olarak tanımlanır. Bir kartın tersi tam tersidir, takımının ilk harfi ve ardından bir sayı gelir.

Çizilmiş Kart

Örnek olarak, rasgele ters çevirmeyi seçtiğimiz kart şuydu: 4 of Clubs (4C)Sonunda (karıştırmadan, açıkça):

[2S,3S,4S,5S,6S,7S,8S,9S,TS,JS,QS,KS,AS,
 2D,3D,4D,5D,6D,7D,8D,9D,TD,JD,QD,KD,AD,
 2H,3H,4H,5H,6H,7H,8H,9H,TH,JH,QH,KH,AH,
 2C,3C,C4,5C,6C,7C,8C,9C,TC,JC,QC,KC,AC]

Karışık

Sonra, karıştırmadan sonra:

[2H,2C,6S,4D,QH,6C,TD,8C,7H,5H,C4,3D,7S,7C,KC,QD,QC,JS,7D,6D,2S,5C,KD,3C,3S,2D,8H,KH,6H,AH,8S,JH,TS,AD,5D,9H,4H,JD,QS,4S,JC,3H,8D,TC,AS,TH,KS,AC,9C,9S,5S,9D]

Bu, boş girdi verilen geçerli bir çıktıdır.

Güverte Girişi

Ancak, tersine, programımız yukarıdaki çıktıyı girdi olarak aldığında çıktı vermelidir 4C. Yani, bir girdi için:

[2H,2C,6S,4D,QH,6C,TD,8C,7H,5H,C4,3D,7S,7C,KC,QD,QC,JS,7D,6D,2S,5C,KD,3C,3S,2D,8H,KH,6H,AH,8S,JH,TS,AD,5D,9H,4H,JD,QS,4S,JC,3H,8D,TC,AS,TH,KS,AC,9C,9S,5S,9D]

Ters çevrilen kartı bulana kadar tekrarlarsınız ve normal duruma geri döndürülürsünüz. Burada C4, C'nin bir sayı olmadığını biliyoruz ve onu 4Cdoğru olarak döndürüyoruz.


kurallar

  • Desteyi herhangi bir harici kaynaktan yükleyemezsiniz.
  • Boş bir giriş, 1 rastgele kart ters çevrilmiş rastgele karıştırılmış bir deste ile sonuçlanmalıdır.
  • Giriş olarak 1 kart ters çevrilmiş bir deste kart, ters kartla sonuçlanmalıdır.
  • Diğer girişler, fütüristik bir tüp boyunca segmanların patlamasına neden olabilir.
    • Ya da başka bir şey, bu konuda.
  • Hem seçilen kart hem de karıştırma sırası eşit olarak rastgele olmalıdır.
    • IE tüm kartların ters çevrilmek üzere seçilme şansı eşittir.
    • IE tüm kart kombinasyonları eşit görünme şansına sahiptir.
  • Takım elbise için SHCDveya shcdtakım elbise kullanabilirsiniz , ancak tutarlı olun:
    • Büyük harfli takımlar ( SHCD) seçerseniz de kullanmalısınız TJQKA.
    • Küçük harfli takımları ( shcd) seçerseniz de kullanmalısınız tjqka.
  • Bu , kazanan en düşük bayt.

2
@ labela - gotoa bu haha'nın çok fazla varyasyonu var. Babamın dikey simetrik kartlar kullanarak ve farklı bir hile yaparak aklımı uçurduğunu hatırlıyorum, ama bunun bu olduğunu düşündürüyorum.
Sihirli Ahtapot Urn

13
"Patlayıcı llamas fütüristik bir tüp ile segways sürme" - Ben bir sonraki ascii-sanat meydan bekliyoruz ...
Level River St

3
Tüm desteyi 0'dan 51'e kadar rastgele bir ofsetle döndürmek, "tüm kartların karıştırılan destede herhangi bir yerde eşit şansa sahip olma" koşulunu yerine getirir, ancak muhtemelen rastgele bir karıştırma olarak düşünülmemelidir. Tüm (52!) Emirlerin yaklaşık olarak eşit derecede olası olduğu anlamına mı geliyor?
aschepler

1
@Aschepler'in söylediklerini genişletmek için: çoğu dilde varsayılan PRNG'nin süre uzunluğu ile, çoğu 52! olası karıştırmalar tam olarak sıfıra eşit görünme olasılığına sahiptir (ancak karıştırma algoritmasına bağlı olarak daha iyi veya daha kötü olabilir).
Arnauld

1
Dalai lama bir bebek üzerinde lama sürmek de kabul edilebilir mi? Segmentlerden
Tschallacka

Yanıtlar:


7

Retina , 61 60 59 bayt

G`[HCDS].
^$
23456789TJQK
/^2/&L$`.
$&H¶$&D¶$&C¶$&S
@V`
O?`

Çevrimiçi deneyin! Düzenleme: @MartinEnder sayesinde 1 2 bayt kaydedildi. Açıklama:

G`[HCDS].

Kaydedilmemiş tüm kartları silin. Bu, bir ters kart bırakmalı veya kart olmamalıdır.

^$
23456789TJQK
/^2/&L$`.
$&H¶$&D¶$&C¶$&S

Giriş (şimdi) boşsa, bir kart paketi oluşturun.

@V`

Rastgele bir kart seçin ve ters çevirin (tek ters kartı geri alır).

O?`

Kartları karıştırın.


4

05AB1E , 29 bayt

Y9ŸJ.•§®т•«.•öB•âsKDgiëDΩÂ:.r

Çevrimiçi deneyin!


• Āk {? Öw • 9LJì # `â, bu ikisini birlikte sıkıştırmak için birkaç bayt tasarruf ederdi.
Sihirli Ahtapot Urn

@MagicOctopusUrn: 1 ve 2'yi kaldırdıktan sonra, aynı baytta sonuçlanıyor değil mi?
Emigna


@MagicOctopusUrn: Maalesef değil. Hem var 1ve aiçeride.
Emigna

Misinterpret Bana bırak Y9ŸJolarak9LJ
Sihirli Ahtapot Urn

3

PowerShell v2 veya üzeri, 175 bayt

%{$s=[char[]]'SDHC';if($_){$_|?{$s-contains$_[0]}|%{$_[1]+$_[0]}}else{$d=$s|%{$e=$_;[char[]]'23456789TJQKA'|%{$_+$e}}|random -c 52;$r=random 52;$d[$r]=$d[$r][1]+$d[$r][0];$d}}

Uzun versiyon:

ForEach-Object {
    $s = [char[]]'SDHC'                         # Create a character array with the suits
    if ($_) {                                   # If there's pipeline input ...
        $_ |                                    # ... write it to the output pipeline ...
            Where-Object {$s -contains $_[0]} | # ... but let only those input elements pass where the first letter appears in the suits ...
            ForEach-Object {$_[1] + $_[0]}      # ... and swap the two elements
    } else {
        $d = $s | ForEach-Object {              # Assign $d to the output of the suits, processing each element first.
                $e = $_                         # Store the current suit element for use in the inner loop
                [char[]]'23456789TJQKA' | ForEach-Object {$_ + $e}  # Process each of the numbers, joining it with the current suit, ...
            } | Get-Random -Count 52            # ... and the resulting 2-char-strings goes back into the output to be shuffled
        $r = Get-Random -Maximum 52
        $d[$r] = $d[$r][1] + $d[$r][0]          # Swap the two chars of a random array element in $d
        $d                                      # Write $d to the output pipeline
    }
}

Kullanımı:

Karıştırılmış bir güverte oluşturun ve bir değişkende saklayın:

$Deck = %{$s=[char[]]'SDHC';if($_){$_|?{$s-contains$_[0]}|%{$_[1]+$_[0]}}else{$d=$s|%{$e=$_;[char[]]'23456789TJQKA'|%{$_+$e}}|random -c 52;$r=random 52;$d[$r]=$d[$r][1]+$d[$r][0];$d}}

Değişkeni isteğe bağlı olarak inceleyin, örneğin

$Deck -join ','

Desteyi tekrar betiğe yerleştirin:

$Deck | %{$s=[char[]]'SDHC';if($_){$_|?{$s-contains$_[0]}|%{$_[1]+$_[0]}}else{$d=$s|%{$e=$_;[char[]]'23456789TJQKA'|%{$_+$e}}|random -c 52;$r=random 52;$d[$r]=$d[$r][1]+$d[$r][0];$d}}

2

Python 2 , 175 bayt

from random import*
s='SHCD';c='23456789TJQKA'
d=input()
if d:print[b+a for a,b in d if a in s];q
k=sample
r=k(c,1)+k(s,1)
print k([(a+b,b+a)[r==a+b]for a in c for b in s],52)

Çevrimiçi deneyin! boş girdi şu şekilde gösterilir:[]


2

> <> , 215 193 bayt

i:0)?\~"CHSD":"2"$:"3"$:"4"$:"5"$:"6"$:"7"$:"8"$:"9"$:"T"$:"J"$:"Q"$:"K"$:"A"$&105&"S"=?.~~~{c0.
=+i$?\i$:::"B")$"I"(*$"S"
_oo$~/;
x0
x0
x0
x0
x0
x0
x0
x0
x0
x0
\l&>?!<
>&"3"%:?\~$>o<
\  }}&-1/

Çevrimiçi deneyin!

Girişi ayrı olmayan kartlar olarak alır ve çıktıları aynıdır (örn. KCAC5C6S...)

Test kolaylaştırmak için, burada bir versiyonu virgülle ayrılmış ve yeni satır olarak çıktılar ayrılmış olarak girdi alır.

Tüm x0s sadece yarı-üniform rasgele sayı üreteci yapma girişimidir. Daha fazlası olası değerlerin aralığını arttırır ve daha azı için tersini arttırır. 10 tanesi yeterince rasgele olduğuna karar verdiğim yer.

Aşağıdaki kurallara uyduğunu unutmayın:

  • Tüm kartların ters çevrilmek üzere seçilme şansı eşittir.
  • Tüm kartlar, karışık destenin herhangi bir yerinde görünme şansına sahiptir.

Ancak tüm karıştırılmış kombinasyonlar olası çıktılar değildir (ve aslında büyük çoğunluk değildir).


2

Jöle , 26 bayt

9ḊṾ€;“AJKQT”p“CDHS”ḟ⁸ẊU-¦Ẋ

Karakterlerin bir listesini (0 kartlık bir saplama veya bir kart ters çevrilmiş 52 kartlık bir deste) kabul eden ve karakter listelerinin bir listesini (1 ters kartlı ancak ileri veya tam bir saplama) döndüren monadik bir bağlantı -bir rastgele kart ile güverte ters).

Çevrimiçi deneyin! (giriş ve çıkış gösterimlerini eşleştirmek için altbilgi - tam bir program olarak Jöle kodu Python argümanı geliştirir ve çıkış için karakterleri bir araya getirir)

Nasıl?

9ḊṾ€;“AJKQT”p“CDHS”ḟ⁸ẊU-¦Ẋ - Link: list of lists of characters, Z
9Ḋ                         - nine dequeued = [2,3,4,5,6,7,8,9]
  Ṿ€                       - unevaluate €ach = ['2','3','4','5','6','7','8','9']
     “AJKQT”               - literal list of characters = ['A','J','K','Q','T']
    ;                      - concatenate = ['2','3','4','5','6','7','8','9','A','J','K','Q','T']
             “CDHS”        - literal list of characters = ['C','D','H','S']
            p              - Cartesian product = [['2','C'],['2','D'],...,['T','S']]
                           -   a full deck of forward cards
                    ⁸      - chain's left argument, Z
                   ḟ       - filter discard
                           -   leaving either that deck or the 1 reversed card in the input
                     Ẋ     - shuffle
                        ¦  - sparse application...
                       -   - ...to index: -1 (which doesn't exist when the length is only 1)
                      U    - ...do: upend (reverses the penultimate card of the deck)
                         Ẋ - shuffle

Bu her zaman on kalbi tersine çeviriyor gibi görünüyor. Rastgele bir kart olmamalı mı?
Emigna

Ah, teşekkürler, evet bir hata var - önce bir ekstra ile düzeltilebilir U(belki bunun yerine sıfır bayt için tamir edebilirim) ama daha sonra yapmak zorunda kalacak ...
Jonathan Allan

Bu bir işlev olduğundan, giriş boş olmadığında tek bir kartı temsil etmek [[number, suit]]yerine geri dönüp dönemediğinizden emin değilim [number, suit].
Outgolfer Erik

Ayrıca, hiçbir, orada olduğunu sanmıyorum herhangi 0 bayt düzeltme bunun için.
Erik the Outgolfer

@EriktheOutgolfer Neden olmasın, yalnız bir kart sonuçta sadece bir kartın bir saplama (kısa deste).
Jonathan Allan

1

Ruby , 95 (veya 100) bayt

->n{s=(0..51).map{|i|"A23456789TJQK"[i/4]+"HCDS"[i%4]}
n[0]?s-n:s[rand 52].reverse!&&s.shuffle}

Girdi olarak boş bir dizi verildiğinde, desteyi dizeler dizisi olarak döndürür. Girdi olarak boş olmayan bir dizi verildiğinde, döndürülen kartı tek bir dize içeren bir dizi olarak döndürür. Çevrilmiş kart yerine bir dize içeren tek elemanlı bir dizinin daha bir dize olarak gerekliyse, şu 5 bayt ekler: değişikliğini s-niçin(s-n)[0]

Çevrimiçi deneyin!

İlk satır standart bir güverte oluşturur. İkinci satır aşağıdaki gibi parçalanır

 n[0]?                  #If the input array is not empty (contains a truthy first element)
  s-n:                  #Find the contents of s with the contents of n removed. The only card remaining from the standard deck corresponds to the flipped card in the input.
                        #ELSE 
  s[rand 52].reverse!&& #Flip one card in place in the array s. As the result is truthy, whatever is next will be returned.
 s.shuffle              #shuffle the deck and return the shuffled deck with one element flipped
}

1

Java 8, 275 274 259 bayt

import java.util.*;s->{if(s==null){List l=new Stack();char i=52,r=i,x,y;for(r*=Math.random();i-->0;y="23456789TJQKA".charAt(i%13),l.add(i==r?x+""+y:y+""+x))x="HSDC".charAt(i&3);Collections.shuffle(l);return l;}return s.replaceAll(".*,(.)([^HSDC]).*","$2$1");}

Giriş bir String, çıktı bir String veya java.util.Listgirişe bağlı olarak bir.

Açıklama:

Çevrimiçi deneyin.

import java.util.*;          // Required import for List, Stack and Collections
s->{                         // Method with String parameter and Object return-type
  if(s==null){               //  If the input is `null`:
    char i=52,               //   Index-integer
         r=i,                //   Random-integer
         x,y;                //   Temp characters
    List l=new Stack();      //   Create a List
    for(r*=Math.random();    //   Determine the random integer in the range (0;52]
        i-->0                //   Loop `i` 52 times:
        ;                    //     After every iteration:
         y="23456789TJQKA".charAt(i%13)
                             //      Set `y` to one of 23456789TJQKA based on `i` modulo-13
         ,l.add(i==r?        //      If the random integer equals the current `i`
                 x+""+y      //       Add the current card reversed
                :            //      Else:
                 y+""+x))    //       Add the current card as is
      x="HSDC".charAt(i&3);  //    Set `x` to one of HSDC based on `i` bitwise-AND 3
    Collections.shuffle(l);  //   Shuffle the generated Deck
    return l;}               //   And return this Deck as result
                             //  If the input was a Deck instead:
  return s.replaceAll(".*,(.)([^HSDC]).*",
                             //   Get the reversed card from the Deck,
            "$2$1");}        //   and output it non-reversed

1

Pyth, 45 bayt

J"CDHS"KO52=NsM.S*+c"AKQJT"1S9J|f}hTJQXNK_@NK

Boş girdi için boş listeyi alır.
Çevrimiçi deneyin

açıklama

J"CDHS"KO52=NsM.S*+c"AKQJT"1S9J|f}hTJQXNK_@NK
J"CDHS"                                        Save the suits as J.
       KO52                                    Save a random index as K.
           =NsM.S*+c"AKQJT"1S9J                Save a shuffled deck as N.
                                f}hTJQ         Find all cards with suit first.
                               |      XNK_@NK  If there aren't any, flip a card.

1

R , 177 171 bayt

function(l=1,F="(.)(.)",R="\\2\\1",S=sample)if(l>1)sub(F,R,grep("^[SDHC]",l,v=T))else{m=S(outer(c(2:9,"T","J","Q","K"),c("S","D","H","C"),paste0))
m[1]=sub(F,R,m[1])
S(m)}

Çevrimiçi deneyin!

Boş giriş verildiğinde (girişsiz çağrı f), varsayılan olarak l=1rastgele bir permütasyon oluştururuz vem deste oluştururuz. sampleGerçekten rastgele olduğunu varsayarsak , bu listede ilk olan herhangi bir kartın eşit olasılığı vardır. İlkini değiştirip listeyi döndürerek tekrar karıştırıyoruz.

Ters çevirerek, birinden başlayan SDHCve tersine çeviren bir kart ararız .


1

Python 2 , 135 bayt

from random import*
s=shuffle
d=zip('A23456789TJQK'*4,'SCDH'*13)
s(d)
D=input()
if D:d=list(set(D)-set(d))
d[0]=d[0][::-1]
s(d)
print d

Çevrimiçi deneyin!

Kartlar (value,suit)

Boş giriş []

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.